Unique_ptr编译器错误
Unique_ptr 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();
};
如果我没有弄错的话,这意味着当调用析构函数(即使是默认的编译器创建的析构函数)时,实体的析构因子将调用~components,它将为向量中的每个元素调用~std::unique_ptr,并导致每个Component的销毁,这正是我想要的。
组件类有虚拟方法,但重要的部分是它的构造函数:
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;
}
现在,我相信这个设置将把组件的所有权交给它的母实体,这正是我想要的。首先是一个小问题,我需要通过引用或指针或其他方式将实体传递到组件构造函数中吗?如果我理解C++,它会传递值,这意味着它会被复制,并且复制的实体会在构造函数结束时死亡。
第二个也是主要的问题是,基于此示例的代码将不会编译。完整的错误太大,无法在这里打印,但我想我知道发生了什么。编译器的错误表明我无法删除不完整的类型。My Component类有一个纯虚拟析构函数,它有一个实现:
inline Component::~Component() { };
在标题的末尾。然而,因为重点是组件实际上是一个接口。从这里我知道unique_ptr销毁需要一个完整的类型。问题是,我该如何解决这个问题?作为参考,我使用gcc 4.4.6。
Component::Component(Entity parent)
通过calue获取parent,所以您将组件添加到此临时组件中,这将在函数结束时消失。原作将错过这次通话。尝试
Component::Component(Entity &parent)
对于另一部分,您必须确保在实例化模板的地方类型是完整的。通常的方法是在类中声明dtor,只需将实现放在定义了所需类型的.cpp中。内联并不是真正必要的。或者,您可以在Entity之前包含其他标头,如果在中不会导致循环包含。
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- C++2440错误-编译器认为字符串是常量字符
- Clang 错误 – 编译器错误或缺少一些细节?
- 视觉C++ 2017 错误?编译器优化表达式
- 配置:错误:C++编译器无法创建可执行文件
- PHP PDO_ODBC配置:错误:C 编译器无法创建可执行文件
- 致命错误 C1001:内部编译器错误(编译器文件"MSC1.cpp",第 1794 行)
- 错误:编译器限制达到简单hello world程序的堆限制
- c++链接错误:编译器找不到函数的定义
- 生成 CImg 时出现致命错误(编译器限制)
- 抛出对齐类型时出现 Clang 运行时错误.编译器错误