Не могу понять c ++ shared_ptr и надежные указатели на представляющие их объекты

Я новичок в c ++ и пытаюсь работать с фреймворком gameengine 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, поэтому я предполагаю, что это должно быть связано с игровым движком.

Теперь у меня есть класс Game:

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);

Значения памяти были разными, что привело меня к мысли, что они не указывают на один и тот же объект.

Теперь, куда мне идти отсюда? Документация на самом деле не помогла мне, просто огромное количество вещей, которые я до сих пор не полностью понимаю, и кажется, что все те сайты, которые я нашел, требуют огромного количества знаний о С ++, которых у меня еще нет. Должен быть более простой способ понять это, вместо того, чтобы накопить 5+ лет гуру на С ++.

0

Решение

_root а также _sceneManager объявляются объектами, а не указателями. Они никогда не будут ссылаться на те же объекты, которые вы создали с помощью create функция.

Я не знаком с библиотекой, но я думаю, вы хотите использовать их Ptr typedefs (который псевдоним соответствующих типов общего указателя), так же, как вы уже делаете для _canvas,

class Game
{
minko::Canvas::Ptr _canvas;
minko::scene::Node::Ptr _root;
minko::component::SceneManager::Ptr _sceneManager;
}
3

Другие решения

использование 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<> экземпляров.

1

По вопросам рекламы [email protected]