我正在尝试创建一个包含来自不同类的对象的向量,这些对象派生自基类。在回答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);
}
}
}
};
有什么想法吗?
答案 0 :(得分:3)
选项1无效,因为obs
是vector<observable*>
^。您无法推送类型为observable
的对象,因为您只能在其中存储指针(observable*
)。您可以将这些对象存储在vector<observable>
中,但不能在此向量中存储Energy
个对象。
选项2无效,因为ecause obs
是vector<observable*>
^。您无法推送std::shared_ptr<observable>
类型的对象,因为您只能在其中存储原始指针(observable*
)。要存储共享指针,向量必须是vector<shared_ptr<observable>>
类型。
选项3与选项4实际上相同。如果您实际尝试推入成员变量obj
,它们将起作用。但是,您通过使用相同的名称(函数参数)声明局部变量来隐藏该变量。您无法将observable*
推送到字符串向量中。编译错误应该清楚这一点。如果您打算推入成员变量,则可以使用this->obs
代替,甚至更好地使用不同的名称作为局部变量。
^假设你实际上是在推进this->obs
而不是局部变量。
答案 1 :(得分:1)
您正在传递矢量障碍物(称为与成员相同)并且您正在尝试将您的课程推向它。如果要推送到该成员,请使用this.obs.push_back()。