当Class具有虚方法时,如何将itens从vector <class *>复制到另一个vector <class *>

时间:2016-02-24 17:21:16

标签: c++ class object vector

我对这个问题有所了解,我在这里找到的所有解决方案都不适合我。

首先,我有这个课程:

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;
}

4 个答案:

答案 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和向量末尾的指针。