0

我是 C++ 新手,正在尝试使用游戏引擎框架 minko。Minko 过度使用 shared_ptr 并且我无法理解它们是如何工作的,因为它们似乎逃避了一般的 c++ *ptr 逻辑。

在初始化阶段的某个地方,通过它们的成员函数创建和获取了几个对象,例如 canvas、sceneManager 和 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);

这些对象中的每一个都包含一个 ::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++ 大师经验。

4

2 回答 2

3

_root并被_sceneManager声明为对象,而不是指针。它们永远不会引用您使用该create函数创建的相同对象。

我不熟悉这个库,但我猜你想使用它们的Ptrtypedef(它为适当的共享指针类型提供别名),就像你已经在为_canvas.

class Game
{
    minko::Canvas::Ptr _canvas;
    minko::scene::Node::Ptr _root;
    minko::component::SceneManager::Ptr _sceneManager;
}
于 2014-12-08T12:38:46.583 回答
1

使用函数通过语句std::shared_ptr::get()访问托管对象指针。printf()

printf("MEMTEST: canvas: %p vs %p , root: %p vs %p , scenemgr: %p vs %p\n"
      , _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 %X\n"
      , _canvas.get(), canvas.get()
      , _root.get(), root.get()
      , _sceneManager.get(), sceneManager.get());

由于它们是非常无用的,因此无法比较shared_ptr<>实例中的任何内容。

于 2014-12-08T12:35:58.417 回答