我是一名 C++ 新手,正在尝试使用游戏引擎框架 minko。 Minko 过度使用 shared_ptr 并且我无法理解它们究竟是如何工作的,因为它们似乎逃避了一般的 c++ *ptr 逻辑。
在初始化阶段的某处,通过其成员函数创建并获取了几个对象,例如canvas、sceneManager和rootNode对象。 我试图将它们全部绑定(bind)在一个 Game 类中,除了一些游戏逻辑外,该类应该包含指向每个重要引擎对象的指针。
我遇到了这个问题,我最初尝试使它工作的结果是重复的对象,因为函数调用不起作用,什么也没发生。经过一些调试后,我在指针赋值后添加了 printf 函数,以查看它们实际指向的位置以及它们指向不同的内存地址,这让我想知道它们是否真的被进程复制了,或者发生了其他一些神秘的魔法。
让我们从对象开始。
std::shared_ptr<minko::Canvas> canvas = Canvas::create("RenderTarget", 1280, 1024);
std::shared_ptr<minko::component::SceneManager> sceneManager = SceneManager::create(canvas->context());
std::shared_ptr<minko::scene::Node> root = scene::Node::create("root")
->addComponent(sceneManager);
那些对象中的每一个都包含一个::Ptr 成员属性,它似乎直接包含指针。我没有在 shared_ptr 文档中找到任何对此的引用,所以我认为这一定是特定于游戏引擎的。
现在我有了我的游戏类:
class Game
{
minko::Canvas::Ptr _canvas;
minko::scene::Node _root;
minko::component::SceneManager _sceneManager;
}
在创建上述对象的同一函数中的某处,赋值:
_canvas = canvas;
_root = root;
_sceneManager = sceneManager;
我在每个变量前后尝试了不同种类的 * 和 &,尝试了指针、直接值、指针指针的各种组合,但每次我都进行了两次调试调用:
printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %X\n", _canvas, canvas, _root, root, _sceneManager, sceneManager);
内存值不同,让我相信它们不指向同一个对象。
现在,我该去哪里?文档并没有真正帮助我,只是大量的东西我还没有完全理解,而且我发现的所有这些网站似乎确实需要大量我还不具备的 c++ 知识。必须有一种更简单的方法来理解这一点,而不必积累 5 年以上的 C++ 经验。
最佳答案
_root
和 _sceneManager
被声明为对象,而不是指针。它们永远不会引用您使用 create
函数创建的相同对象。
我不熟悉这个库,但我猜你想使用它们的 Ptr
typedef(它是适当的共享指针类型的别名),就像你已经为 做的一样_ Canvas
。
class Game
{
minko::Canvas::Ptr _canvas;
minko::scene::Node::Ptr _root;
minko::component::SceneManager::Ptr _sceneManager;
}
关于c++ - 似乎无法理解 c++ shared_ptr 和指向其代表对象的可靠指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27358129/