我是一个 c++ 新手,正在尝试使用游戏引擎框架 minko。Minko 过度使用shared_ptr,我无法理解它们的工作原理,因为它们似乎逃脱了一般的 c++ *ptr 逻辑。
在初始化阶段的某个地方,通过其成员函数(如画布、场景管理器和 rootNode 对象(创建和获取多个对象。我试图将它们全部绑定到一个 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);
这些对象中的每一个都包含一个 ::P tr 成员属性,该属性似乎直接包含指针。我在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 %pn", _canvas, canvas, _root, root, _sceneManager, sceneManager);
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %Xn", _canvas, canvas, _root, root, _sceneManager, sceneManager);
记忆值不同,导致我相信它们不指向同一个对象。
现在,我该何去何从?文档并没有真正帮助我,只是大量我还不完全理解的东西,似乎我找到的所有这些网站都需要大量的 c++ 知识,我还没有。必须有一种更简单的方法来理解这一点,而不必积累5 +年的C++大师。
_root
和_sceneManager
被声明为对象,而不是指针。它们永远不会引用您使用 create
函数创建的相同对象。
我不熟悉该库,但我想您想使用他们的 Ptr
typedefs(别名适当的共享指针类型(,就像您已经为 _canvas
所做的那样。
class Game
{
minko::Canvas::Ptr _canvas;
minko::scene::Node::Ptr _root;
minko::component::SceneManager::Ptr _sceneManager;
}
使用 std::shared_ptr::get()
函数通过 printf()
语句访问托管对象指针。
printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %pn"
, _canvas.get(), canvas.get()
, _root.get(), root.get()
, _sceneManager.get(), sceneManager.get());
printf("MEMTEST: canvas: %X vs %X , root: %X vs %X , scenemgr: %X vs %Xn"
, _canvas.get(), canvas.get()
, _root.get(), root.get()
, _sceneManager.get(), sceneManager.get());
因为它们是 非常无用的,从shared_ptr<>
实例中比较任何东西。