Unique_ptr编译器错误

时间:2013-06-30 21:48:43

标签: c++ memory-management compiler-errors

我正在为项目设计和实体组件系统,而C ++内存管理给了​​我一些问题。我只是想确保我的设计是合法的。

首先,我有一个存储组件向量的实体类:

class Entity
{
    private: 
        std::vector<std::unique_ptr<Component> > components;
    public:
        Entity() { };
        void AddComponent(Component* component)
        {
            this -> components.push_back(std::unique_ptr<Component>(component));
        }
        ~Entity();
};

如果我没有弄错,意味着当析构函数被调用时(即使是默认的,编译器创建了一个),Entity的析构函数也将调用~component,它将为每个元素调用~std :: unique_ptr向量,并导致每个组件的破坏,这就是我想要的。

组件类有虚方法,但重要的部分是它的构造函数:

Component::Component(Entity parent)
{
    parent.addComponent(this)  // I am not sure if this would work like I expect
    // Other things here
}

只要将this传递给方法,这也可以实现我的目的。我的困惑在于工厂。我想要做的是:

std::shared_ptr<Entity> createEntity()
{
    std::shared_ptr<Entity> entityPtr(new Entity());
    new Component(*parent);
    // Initialize more, and other types of Components
    return entityPtr;
}

现在,我相信这个设置会将Component的所有权留在其Parent Entity手中,这正是我想要的。首先是一个小问题,我是否需要通过引用或指针或其他东西将实体传递给Component构造函数?如果我理解C ++,它会传递值,这意味着它会被复制,复制的实体将在构造函数的末尾死掉。

第二个,主要问题是基于此示例的代码将无法编译。完整的错误太大,无法在此打印,但我想我知道发生了什么。编译器的错误说我无法删除不完整的类型。 My Component类有一个带有实现的纯虚析构函数:

inline Component::~Component() { };
标题末尾的

。但是,因为整个点是Component实际上是一个接口。我从here知道,unique_ptr销毁需要一个完整的类型。问题是,我该如何解决这个问题?作为参考,我使用的是gcc 4.4.6。

1 个答案:

答案 0 :(得分:2)

Component::Component(Entity parent)

通过calue获取父级,因此您将组件添加到此临时值,这将在函数结束时消失。原来会错过这个电话。尝试

Component::Component(Entity &parent)

对于另一部分,您必须确保在实例化模板的地方完成类型。 通常的方法是在类中声明dtor,并将实现放在.cpp中,其中定义了所需的类型。内联并不是必需的。 或者你可以在Entity之前包含另一个标题,如果in不会导致循环包含。