c++ - 来自不同类别的对象的 vector

标签 c++ class object inheritance vector

我正在尝试创建一个 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);
            }
        }
    }


};

有什么想法吗?

最佳答案

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

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

选项 3 实际上与选项 4 相同。如果您实际尝试将其插入成员变量 obj,它们将起作用。 .但是,您通过使用相同名称(函数参数)声明局部变量来隐藏该变量。你不能推 observable*成一个字符串 vector 。编译错误应该清楚这一点。如果你想压入成员变量,你可以使用 this->obs相反,甚至更好的是,为局部变量使用不同的名称。

^假设您实际上是在插入 this->obs而不是局部变量。

关于c++ - 来自不同类别的对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968553/

相关文章:

c++ - QT .UI 显示.GIF?

c++ - std::vector 和 move 语义

C++ shared_ptr 看不到类类型的成员函数

C# 代码设计 : 1 library, 2 个项目使用它(但其中一个是只读的)

javascript - 将对象数组转换为数组数组(按属性)

c++ - switch case 语句中包含成员变量 in case

python - 我正在寻找根据用户输入创建类的实例

java - readObject() 不起作用并从方法中中断

c++ 将一个类中的对象推送到另一个类中的 vector 中?

c++ - <命令行> :0:3: warning: ISO C++11 requires whitespace after the macro name