Я новичок в 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+ лет гуру на С ++.
_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 %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<>
экземпляров.