2015-06-21 44 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()。