不同类别的对象向量
问题描述:
我试图创建一个包含来自不同类的对象,从基类派生的向量。对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
对象。
选项2无法工作,因为因为obs
是vector<observable*>
^。您无法推入std::shared_ptr<observable>
类型的对象,因为您只能在其中存储原始指针(observable*
)。要存储共享指针,矢量必须是vector<shared_ptr<observable>>
。
选项3与选项4实际上是相同的。如果您实际尝试推入成员变量obj
,它们将工作。但是,通过用相同名称(函数参数)声明局部变量来隐藏该变量。您不能将observable*
插入到字符串的矢量中。编译错误应该清楚这一点。如果您打算推入成员变量,则可以改为使用this->obs
,或者甚至使用不同的名称作为本地变量。
^假设你实际上推入this->obs
而不是局部变量。
答
您正在传递矢量obs(与成员相同的名称),并且您正试图将您的类推送给它。如果你想推送给成员,使用this.obs.push_back()。
每种情况下的汇编错误是什么? –