将对象的指针复制到此对象的新指针中

时间:2018-04-02 09:29:23

标签: c++

我有一个类GameObject,它有一个std::vector<Component*> mComponents,我已经重载了GameObject(const GameObject&)。我试图将mComponents从一个复制到另一个,但是将每个包含的Component*完全复制到一个new对象中,但保持对象内容完全相同。这就是我现在所拥有的:

GameObject.cpp

GameObject::GameObject(const GameObject& other) 
{
    if (this != &other)
    {
        this->mComponents = other.mComponents; // EDIT 1
        for (int i = 0; i < (int)mComponents.size(); i++)
        {
            // FILL this->mComponents with NEW objects but
            // containing the exact same data and 
            // variables from other.mComponents
            this->mComponents[i] = other.Copy(); // EDIT 2 EXAMPLE OF IDEA IN COMMENTS
            this->mComponents[i]->setParent(this);
        }
    }
}

Engine.cpp(摘录)

GameObject cube, cube2;

cube.addComponent(new DirectionalLight(glm::vec3(-0.2f, -1.0f, -0.3f)));
cube.addComponent(new Texture("Resources/Textures/container.png", "Resources/Textures/container_specular.png"));
cube.addComponent(new Shader("Resources/Shaders/cube.shader"));
cube.addComponent(new Cube());

cube2 = GameObject(cube);

当我实例化cube2时,mComponents Components*内容都保持完全相同但我想创建一个新的Component*来填充std::vector中的GameObject(const GameObject&) {1}}功能,同时保持所有变量相同。

P.S。我知道大多数其他运营商,例如&#39; =&#39;我不会在向量内部创建新的组件,但是在我弄清楚如何用新的Component*&#39>来填充向量之后我将会实现它。

1 个答案:

答案 0 :(得分:4)

this->mComponents[i]->Copy(other);无效。至少,不是纯粹的继承观点。超类型(基本)类型指针不能隐式转换为派生类型。这称为向下转换,没有语言隐式支持它。

更简单的方法是在每个组件中定义虚拟“克隆”功能:

virtual Component* clone()=0; // base declaration

virtual Component* Texture::clone() //derived implementation
{
    return new Texture(*this);
} 

然后在你的游戏对象复制构造函数中:

    for (int i = 0; i < (int)other.mComponents.size(); i++)
    {
        // FILL this->mComponents with NEW objects but
        // containing the exact same data and 
        // variables from other.mComponents
        this->mComponents.push_back(other.mComponents->clone());
        this->mComponents[i]->setParent(this);
    }

这样,您就让组件本身处理复制过程。