Przekazanie wskaźnika this w konstruktorze. Qt

0

Witam.

Zacznę od tego, że program się kompiluje i działa, ale wypisuje pewne ostrzeżenia. Znam ich genezę i wiem dlaczego się pojawiają jednak brak mi pomysłu na poprawne rozwiązanie.
Problem przedstawie merytorycznie. Sprawa wygląda tak:
Mam 3 klasy, powiedzmy class A, class B,class C
Kllasy znajdują się w takich o to plikach.
plikA.h (zawiera klasę A)
plikBC.h (zawiera klasy B,C)

Co jest kluczowe i proszę o tym pamiętać:
klasa B oraz C za argument w konstruktorze przyjmuje wskaźnik na klasę A (this).
Elementy tych klas są tworzone w konstruktorze klasy A.

Co dalej:
W konstruktorze klasy A tworzę sobie obiekty z klasy B (np w QMainWindow kolejne pod okno QDialog). Tworzone obiekty klasy B w konstruktorze jako argument przyjmują wskaźnik na klasę A (this). To po to, aby mieć swobodny dostęp do eobiektów klasy A (przyjaźń).

Teraz, zauważyłem, że fajnie byłoby zrobić dziedziczenie w pliku plikBCD.h czyli;
class C :public class B
Zatem na liście inicjalizacyjnej konstruktora klasy BC podaje JAWNE wywołanie konstruktora klasy C (normalna zasada dziedziczenia).
C::C(A*wsk):wsk(wsk) , B(wsk)
obiekt klasy C tworzę oczywiście w klasie A w ten sposób:
C*nowyobiektC = new C(this);
Tu jednak pojawia się ostrzeżenie nazywane przez kompilator.
'class C:wsk' will be initialized after
Co doskonale rozumiem, ponieważ zgodnie z zasadą najpierw jest tworzony obiekt B (bazowy), a że obiekt bazowy potrzebuje wskaźnik na obiekt klasy A w konstruktorze (wsk) musi tak jakby "poczekać", aż go dostanie dzięki inicjalizacji obiektu klasy B.
Problem polega na tym, że nie potrafię wymyślić jak można by inaczej, dać bazowej klasie B wskaźnik na klasę A na tej liście. Może jakiś globalny wskaźnik, albo wskaźnik domyślny (jest coś takiego?) ?

1
C::C(A*wsk)
    :B(wsk)
    ,wsk(wsk)
{}

Ten warrning ostrzega jedynie, że wymuszono normalną kolejność inicjalizacji i jest ona inna niż ta zapisana na liście inicjalizacyjnej. Jeśli poprawisz listę inicjalizacyjną na właściwą kolejność warrnig zniknie.

Pamiętaj, że w Qt masz sygnały i sloty i należy tak projektować klasy by znały siebie nawzajem jak najmniej. Zależności miedzy obiektami w Qt powinien realizować za pomocą connect właściciel danego obiektu.
Bez dokładnej wiedzy czym u ciebie jest A, B i C trudno pwieidzieć jak ci pomóc.

0

Faktycznie, problem znikł, liczyła się kolejność. Dziękuje za szybką i trafną odpowiedź.

Wiem, że bez pokazywania kodu oczy masz, macie zawiązanie. Jednak, jakbym miał tutaj wkleić dziesiątki lin kodu, tłumaczenie stałoby się jeszcze bardziej zawiłe. W każdym razie udało się mi wytłumaczyć, a Tobie zrozumieć i odpowiedzieć i o to chodziło :)
Chciałbym zapytać co miałeś dokładnie na myśli w tym zdaniu.
Pamiętaj, że w Qt masz sygnały i sloty i należy tak projektować klasy by znały siebie nawzajem jak najmniej. Zależności miedzy obiektami w Qt powinien realizować za pomocą connect właściciel danego obiektu.

Jeśli chodzi o mój program. klasa A to QMainWindow Klasa B i C (jest jeszcze są D,E,F,G...) to malutkie klasy dziedziczące po QDialog. To takie małe okienka, które wyskakują po kliknięciu jakiejś akcji w QMainWindow. W Okienka te wpisuje się zdawkowe informacje np. liczba pytań,, imię i nazwisko, zaznacza jakiś radio button itd, odpowiedź w tych okienkach uruchamia kolejne okno, ale już z skonkretyzowaną treścią. Wszystko oczywiście dzieje się z udziałem connect poprzez sloty. Jednak potrzebuje cały czas dostęp do QMainWindow, bo w nim są stworzone obiekty, na których pracować muszą obiekty innych klas.

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