我对这个问题有所了解,我在这里找到的所有解决方案都不适合我。
首先,我有这个课程:
class Flow {
public:
Flow();
...
virtual double execute() = 0;
...
private:
...
};
我的子类测试中的工作正常。我也有这个班级:
class Model {
public:
Model();
...
Model(const Model& mdl);
Model& operator=(const Model& mdl);
...
private:
string name;
vector<Flow*> flows;
...
};
在复制构造函数中,我必须将Flow *向量复制到另一个Flow *向量,并且我这样做:
Model& Model::operator =(const Model& mdl) {
this->name = mdl.name;
this->flows.resize(mdl.flows.size());
for (unsigned int i = 0; i < mdl.flows.size(); i++) {
*this->flows[i] = *mdl.flows[i];
}
return *this;
}
但是没有工作。 此时我无法初始化一个空的Flow对象,因为execute()方法是纯虚拟的;
我尝试使用transform(),但clone()方法需要实现Flow();
我做错了什么?
更新 这种方式有效:
Model& Model::operator =(const Model& mdl) {
this->name = mdl.name;
for (unsigned int i = 0; i < mdl.flows.size(); i++) {
Flow *cp = (Flow*) malloc(sizeof(mdl.flows[i]));
this->flows.push_back(cp);
}
return *this;
}
答案 0 :(得分:2)
其中一个解决方案是添加纯虚方法clone
并在每个派生类中实现它:
class Flow {
public:
...
Flow *clone() const = 0;
};
class Foobar : public Flow {
public:
...
Flow *clone() const { return new Foobar(*this); }
};
你的循环就是这样:
for (unsigned int i = 0; i < mdl.flows.size(); i++) {
this->flows[i] = mdl.flows[i]->clone();
你应该考虑使用智能指针进行适当的内存控制。
如果您无法添加虚拟方法,则无法深度复制对象,因此您需要将所有权更改为共享(通过std :: shared_ptr)或禁止复制Model
对象(如果使用c + +11你可以允许移动指定者)
注意:即使您使当前语句编译,使您的虚拟方法不纯,但由于What is object slicing?
,它将无法正常工作答案 1 :(得分:1)
如果可以初始化对象,则只能以这种方式制作项目副本。我有同样的问题!
答案 2 :(得分:0)
尝试了很多东西之后,我终于找到了这个解决方案,这是有效的:
Model& Model::operator =(const Model& mdl) {
this->name = mdl.name;
for (unsigned int i = 0; i < mdl.flows.size(); i++) {
Flow *cp = (Flow*) malloc(sizeof(mdl.flows[i]));
this->flows.push_back(cp);
}
return *this;
}
答案 3 :(得分:0)
您的代码几乎正确,但您需要将内容复制到新指针
Model& Model::operator =(const Model& mdl) {
this->name = mdl.name;
for (unsigned int i = 0; i < mdl.flows.size(); i++) {
Flow *cp = (Flow*) malloc(sizeof(mdl.flows[i]));
*cp = * mdl.flows[i]; //The content is copied here
this->flows.push_back(cp);
}
return *this;
}
您也可以使用这样的交互器:
Model& Model::operator =(const Model& mdl) {
this->name = mdl.name;
vector<Flow*>::iterator it;
for(*it = mdl.flowBegin() ; *it!=mdl.flowEnd(); it++){
Flow *cp = (Flow*) malloc (sizeof(it));
*cp=**it; //The content is copied here
Flows.push_back(cp);
}
return *this;
}
但在这种情况下,您需要在类Flow中创建一个方法,该方法返回指向beggin和向量末尾的指针。