【发布时间】:2015-11-18 23:58:29
【问题描述】:
您好,我遇到了一个无法解决的问题。我正在创建一个带有智能指针的实体组件系统。
我得到的错误是:
std::unique_ptr<PrimaryComponent, std::default_delete<PrimaryComponent>> &类型的引用(非 const 限定)不能用std::unique_ptr<PlayerGraphics, std::default_delete<PlayerGraphics>>类型的值初始化
游戏世界类:
auto GameWorld::Setup_World() -> void
{
player->Attach_Component(player_Graphics);
Add_GameObject(player);
}
游戏对象类附加组件功能:
void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> &component)
{
if (component != nullptr)
{
component_container.push_back(component);
}
}
player_Graphics和player的声明:
class GameWorld
{
private:
std::vector<std::unique_ptr<GameObject>> gameObject_List;
std::unique_ptr<GameObject> player;
std::unique_ptr<PlayerGraphics> player_Graphics
player 是 GameObject,player_Graphics 是派生自 PrimaryComponent 的图形组件。
主要组件类:
class PrimaryComponent
{
protected:
public:
PrimaryComponent();
virtual ~PrimaryComponent();
virtual void Render(GameObject &gameObject) = 0;
virtual void Update(GameObject &gameObject, GameWorld &gameWorld, float gameTime) = 0;
};
PlayerGraphics 类:
class PlayerGraphics :
public GraphicsComponent
{
public:
PlayerGraphics();
virtual ~PlayerGraphics();
virtual void Render(GameObject &gameObject);
virtual void Update(GameObject &gameObject, GameWorld &gameWorld, float gameTime);
};
PlayerGraphics 派生自 GraphicsComponent,而 GraphicsComponent 派生自 PrimaryComponent。
【问题讨论】:
-
player_Graphics是如何声明的?它的确切类型是什么。你不显示它。 -
当
void GameWorld::Setup_World()是所需的形式时,为什么要写auto GameWorld::Setup_World() -> void?看起来更复杂的代码不会执行得更快。它也不会让你变得更聪明。 -
不回答您的问题,但通过引用传递
std::unique_ptr有点矛盾。我的意思是,std::unique_ptr是不可分享的,但通过使用引用,你是在分享它。 -
您似乎用错误的类型调用
GameObject::Attach_Component。如果你打算使用智能指针,它们应该是相同的类型。 -
#Mateusz Grzejek - 不试图让代码更智能,只是玩弄 c++ 11/14 的功能,我知道它不会让代码更快或任何东西。