Qt i unique_ptr

0

Próbuję nieco odnowić kod gry,
zmieniłem tradycyjny wskaźnik na unique_ptr i otrzymuje taki błąd przy próbie kompilacji:

 no viable conversion from 'std::unique_ptr<Pacman>' to 'QGraphicsItem *'
    scene -> addItem(pacman);
                     ^~~~~~

Jakieś sugestie?

0

A przed tą zmianą to co tam stało? Bo raczej nie wskaźnik typu Pacman*.

0

Przed zmianą było tak:

Pacman *pacman;

następnie inicjalizacja w metodzie:

pacman = new Pacman;
scene -> addItem(pacman);

Pacman dziedziczy po klasie QGraphicsItem, natomiast scene wygląda następująco:

QGraphicsScene *scene;
4

W ogólnym przypadku żeby dostać goły wskaźnik, możesz wołać .get().

scene->addItem(pacman.get());

Natomiast w tym przypadku będzie źle, bo QGraphicsScene będzie próbował zwolnić ten wskaźnik, który jest przekazywany do addItem(), więc będzie dwukrotnie zwalniany (drugi raz w destruktorze unique_ptr). Dlatego unique_ptr musi zrzec się tego wskaźnika

scene->addItem(pacman.release());
2

Mam wątpliwości czy ma sens dla samej zasady używać tutaj unique_ptr.
Raczej powinni pozbyć się gołych wskaźników po stronie Qt...

1

qt korzysta z relacji rodzic dziecko
http://doc.qt.io/qt-5/objecttrees.html

To z czego qt niekorzysta musisz zwolnić sam i tu można użyć unique czy shared.

Qt ma własne inteligentne wskaźniki ale raczej nie widziałem żeby w przykładach były używane a inni też nie widziałem żeby z nich korzystali.

0

@Azarien: pewnie nie są, prawdopodobnie w większości projektów też nie trzeba ich używać i jechać na tym co kiedyś. Po prostu skończyłem projekt i staram się go unowocześnić/testować różne rzeczy. Temat zresztą nie dotyczy tego czy jest sens, tylko jak :P

@recovery i @twonek dziękuję bardzo. Przy rozwiązaniu z get() i release() niestety program się wysypuje - to znaczy nie powoduje to błędów przy kompilacji ale po starcie gry(czyli na etapie dodawania Pacmana do planszy) okno zostaje zamknięte. Chyba do obiektów dziedziczących po klasach Qt rzeczywiście więcej jest problemów z użyciem unique niż gołego wskaźnika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1