2015-06-21 79 views
0

我試圖創建一個包含來自不同類的對象,從基類派生的向量。對this question的回答如下,我嘗試了四種不同的方法(註釋如下):其中沒有一個將編譯:不同類別的對象向量

class observable { 

    public: 
    virtual void observe(alglib::complex_1d_array)=0; 

    observable() { 

    } 
}; 

class Energy : public observable { 

    public: 
    void observe(alglib::complex_1d_array); 

    Energy() { 

    } 
}; 

class ObservableCollection { 

    private: 
    int no_obs; 
    vector<observable*> obs; 

    public: 

    ObservableCollection(vector<string> obs) { 
     no_obs=obs.size(); 
     for(int i=0;i<no_obs;i++) { 
      if(!strcmp(obs[i].c_str(), "energy")) { 
       // option 1: 
       // Energy E(); 
       // obs.push_back(E); 

       // option 2: 
       // obs.push_back<std::shared_ptr<observable>(new Energy())>; 

       // option 3: 
       // obs.push_back(new Energy()); 

       // option 4: 
       // observable *E=new Energy(); 
       // obs.push_back(E); 
      } 
     } 
    } 


}; 

任何想法?

+4

每種情況下的彙編錯誤是什麼? –

回答

3

選項1不能工作,因爲obsvector<observable*> ^。您不能推送observable類型的對象,因爲您只能將指針(observable*)存儲在其中。您可以將這些對象存儲在vector<observable>中,但不能在此向量中存儲Energy對象。

選項2無法工作,因爲因爲obsvector<observable*> ^。您無法推入std::shared_ptr<observable>類型的對象,因爲您只能在其中存儲原始指針(observable*)。要存儲共享指針,矢量必須是vector<shared_ptr<observable>>

選項3與選項4實際上是相同的。如果您實際嘗試推入成員變量obj,它們將工作。但是,通過用相同名稱(函數參數)聲明局部變量來隱藏該變量。您不能將observable*插入到字符串的矢量中。編譯錯誤應該清楚這一點。如果您打算推入成員變量,則可以改爲使用this->obs,或者甚至使用不同的名稱作爲本地變量。

^假設你實際上推入this->obs而不是局部變量。

1

您正在傳遞矢量obs(與成員相同的名稱),並且您正試圖將您的類推送給它。如果你想推送給成員,使用this.obs.push_back()。