嗨,我遇到了一个问题,我无法找到解决办法。我正在创建一个带有智能指针的实体 - 组件系统。
我得到的错误是:
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);
}
gameobject类附加组件功能:
void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> &component)
{
if (component != nullptr)
{
component_container.push_back(component);
}
}
播放器_Graphics和播放器的声明:
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,派生自PrimaryComponent。
答案 0 :(得分:1)
看起来您使用错误的类型调用GameObject::Attach_Component
。它需要一个std::unique_ptr<PrimaryComponent>
,但您传递的是std::unique_ptr<PlayerGraphics>
修改强>
如果PlayerGraphics
来自PrimaryComponent
,则无关紧要。这不适用于智能指针,只有原始指针。
答案 1 :(得分:1)
问题在于参考:
该行:
namenode_port
应该是:
void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> &component)
然后,当你打电话给它时,而不是:
void GameObject::Attach_Component(std::unique_ptr<PrimaryComponent> component)
你应该这样做:
player->Attach_Component(player_Graphics);
也就是说,该函数应该取得指针的所有权。请注意,原始player->Attach_Component(std::move(player_Graphics));
将设置为null(您将其移入,如果您想保留该对象的引用,那么您使用的是错误的工具)。
您可能想知道为什么在您的代码中直接传递player_Graphics
有效,但传递std::unique_ptr<PrimaryComponent>
却没有。那么解释是你使用的是非const引用,而非const引用只能绑定到同一时间的对象。但是,如果您按值传递参数,那么智能指针将被移动,这一切都将起作用。
这一切都有道理,std::unique_ptr<PlayerGraphics>
意味着是不可复制的,不可共享的,可移动的智能指针。您应该移动指针,而不是通过引用传递它。
TL; DR:如果std::unique_ptr
是B
的子类,您可以将A
移到std::unique_ptr<B>
,但不能将std::unique_ptr<A>
绑定到std::unique_ptr<B>
std::unique_ptr<a>&
类型的引用。
PS。移动和演员的构造函数声明如下:
template <class T, class D = default_delete<T>>
class unique_ptr
{
template <class U, class E>
unique_ptr (unique_ptr<U,E>&& x) noexcept;
};