gpt4 book ai didi

c++ - 如何将 shared_ptr 从一个父类转换到另一个父类?

转载 作者:太空宇宙 更新时间:2023-11-03 10:24:04 33 4
gpt4 key购买 nike

我正在重新设计我的游戏引擎以使用smart-pointers。我有一个 Object 类,一切都继承自该类。我有一个可渲染的 GameObject,因此它继承自 IRenderable(一个定义纯虚拟渲染函数的类)并且不继承自 Object。我有一个 RenderSystem,它应该为场景中的所有 IRenderable 保存一个 shared_ptr

我遇到的问题是如何将我的 GameObject shared_ptr 转换为 RenderSystem 的 IRenderable?

我尝试过的想法:

  • RenderSystem 使用 GameObject 的 shared_ptr 但这不起作用,因为它很危险,因为并非所有游戏对象都是可渲染的。
  • 让 IRenderable 从 Object 继承,这应该允许我从它继承。这意味着 IRenderable 不再是一个接口(interface),因为 Object 包含其他功能。

这完全可以用原始指针实现,因此,我觉得有一些方法可以用智能指针实现相同的结果

例子:

// Object.h
class Object : public enable_shared_from_this<Object> { ... }
// GameObject.h
class GameObject : public Object { ... }
// MeshRenderer.h
class MeshRenderer : public GameObject, IRenderable {
public:
void initialize()
{
// Not able to cast Object to IRenderable
RenderSystem::instance().addRenderable(getShared());

// AND

// Not able to cast Object to IRenderable

RenderSystem::instance().addRenderable(std::static_pointer_cast<IRenderable>(getShared()));
}
}
// RenderSystem.h
class RenderSystem
{
std::list<std::shared_ptr<IRenderable>> m_renderables;
public:
void addRenderable(std::shared_ptr<IRenderable> ptr)
{
m_renderables.push_back(ptr);
}
}

// main.cpp
...
auto meshRenderer = std::shared_ptr<MeshRenderer>();
...

最佳答案

你不能做 static_pointer_cast直接来自 shared_ptr<Object>shared_ptr<IRenderable>因为这些类型是不相关的。

但是您可以转换为派生类型,然后允许隐式转换为 shared_ptr<IRenderable> :

auto p = std::static_pointer_cast<MeshRenderer>(getShared());
std::shared_ptr<IRenderer> q = p;

这执行从第一个基类到派生类型的显式转换,然后是到第二个基类的隐式转换。这是静态允许的,因为已知派生类型与两个基相关,但不相关基之间的直接转换是不可能的。

关于c++ - 如何将 shared_ptr 从一个父类转换到另一个父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774156/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com