Wpis z mikrobloga

#programowanie #cpp #qt
Pytanie o void pointery. Mam sobie bazową klasę O oraz klasy A i B które z niej dziedziczą. No i mam obiekt A w pointerze A* a. Pobieram go sobie taką funkcją:

void* getAsVoid() { qDebug() << static_cast(a); qDebug() << static_cast(a)->name; return static_cast(a); }
printuje sobie tutaj z casta do O adres i nazwę (const QString) żeby sprawdzić czy wszystko ok i jest ok. No i później tam gdzie to wziąłem, robię coś takiego:

auto a = static_cast(getAsVoid());
qDebug() << a;
qDebug() << a->name;

No i najpierw mi printuje adres, jest taki sam. Ale nazwy już nie printuje, wywala mi błąd:

ASSERT: "size == 0 || offset < 0 || size_t(offset) >= sizeof(QArrayData)"

Nigdy nie musiałem void pointerów używać, czy robię źle coś oczywistego?
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@MamCieNaHita: no przecież przy samym przekazywaniu printuję nazwę właśnie po to żeby sprawdzić czy żyje, to jedno po drugim następuje jak widać w drugiej części kodu. A to w ogóle obiekt statyczny... no spróbuję, ale nigdy mi się tego nie chce robić... myślałem, że może po prostu nie da się tak robić jak próbuję czy coś... ;c
  • Odpowiedz
@s_theCapt: nie możesz castować Derived* -> void* -> Base*, bo przy castowaniu Derived* -> Base* może dojść do przesunięć(vptr, itp). jak chcesz potem z voida do Base* to musisz Derived* -> Base* -> void* -> Base*
  • Odpowiedz
@s_theCapt: Generalnie jak używasz Qt to nie schodzisz poniżej QObject*, i zamaist static_cast robisz qobject_cast (chociaż dynamic_cast też może być).
A dokładniej jeżeli przechowujesz w obiekcie wskaźnik to jeszcze bezpieczniej używać QPointer.
Jeżeli potrzebujesz coś przekazywać poza QObjecttami to uzywasz QVariant.
Dzięki temu C++ staje się dużo bardziej bezpieczny.
  • Odpowiedz