我正在尝试创建一个 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 无法工作,因为 obs
是 vector<observable*>
^。您不能推送 observable
类型的对象因为您只能在其中存储指针( observable*
)。您可以将此类对象存储在 vector<observable>
中但你不能存储 Energy
这种 vector 中的对象。
选项 2 无法工作,因为 obs
是 vector<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/