对象传染媒介从不同的类的

时间:2015-06-21 19:37:02

标签: c++ class object inheritance vector

我正在尝试创建一个包含来自不同类的对象的向量,这些对象派生自基类。在回答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);
            }
        }
    }


};

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

选项1无效,因为obsvector<observable*> ^。您无法推送类型为observable的对象,因为您只能在其中存储指针(observable*)。您可以将这些对象存储在vector<observable>中,但不能在此向量中存储Energy个对象。

选项2无效,因为ecause obsvector<observable*> ^。您无法推送std::shared_ptr<observable>类型的对象,因为您只能在其中存储原始指针(observable*)。要存储共享指针,向量必须是vector<shared_ptr<observable>>类型。

选项3与选项4实际上相同。如果您实际尝试推入成员变量obj,它们将起作用。但是,您通过使用相同的名称(函数参数)声明局部变量来隐藏该变量。您无法将observable*推送到字符串向量中。编译错误应该清楚这一点。如果您打算推入成员变量,则可以使用this->obs代替,甚至更好地使用不同的名称作为局部变量。

^假设你实际上是在推进this->obs而不是局部变量。

答案 1 :(得分:1)

您正在传递矢量障碍物(称为与成员相同)并且您正在尝试将您的课程推向它。如果要推送到该成员,请使用this.obs.push_back()。