Tworzenie obiektów w konstruktorze

0

Witam. Mianowicie mam taki problem:
W konstruktorze pewnego obiektu chce tworzyć obiekty innych klas (a dokładniej wskaźniki do tych obiektów). Napisałem coś takiego:

 C_tlo * ekran;
C_tlo * plansza;
C_zaba * zabaa;

To są pola klasy której w konstruktorze chce tworzyć obiekty klasy c_tlo oraz C_zaba.

Konstruktor wygląda tak:

 C_tlo * ekrann;
ekrann = new C_tlo;

C_tlo * plansza;
plansza = new C_tlo("plansza.bmp");

C_zaba * zabaa;
zabaa = new C_zaba();

I dalej chciałbym się odwoływać do tych obektów w metodach (klasy tej co jest konstruktor).

Kompilator wszystko kompiluje, nie wyrzuca błędu. Program uruchamia się ale działa tak jakby przerywał działanie w momencie kiedy napotka na odwołanie sie do utworzonego obiektu.

Powiedzmy że mamy taką sytuację:

 void C_gra::p(){
Sleep(2000);
zabaa->polozenie_x();
};

Wynikiem takiego kodu jest odpalenia okna programu. Odczekanie 2s i zamknięcie okna.

Natomiast gdy mam kod:

 void C_gra::p(){
zabaa->polozenie_x();
Sleep(2000);
};

To następuje odpalenie okna i od razu zamknięcie. (Nie ma tych 2 sekund przed zamknięciem).

Także pytanie: Jak powinno się tworzyć obiekty w konstruktorze klasy? Gdzie może leżeć błąd.

Ogólnie to program który napisałem działał. Tylko ze wszystkie obiekty miałem tworzone w mainie. i w mainie odwoływałem się do poszczególnych metod i pól. Postanowiłem to wszystko przerzucić do konstruktora gry. No i z jednej strony kompiluje sie i dziala a z drugiej nie działa. Gdzie moze leżeć problem?

Od razu mówie że nie jestem jakimś orłem z programowania.

Pozdrawiam.

0
piotrek89 napisał(a)

Konstruktor wygląda tak:
C_tlo * ekrann;
ekrann = new C_tlo;

C_tlo * plansza;
plansza = new C_tlo("plansza.bmp");

C_zaba * zabaa;
zabaa = new C_zaba();


W konstruktorze zostaw same inicjalizacje, daklaracje wyrzuć. Czyli konstruktor powinien wyglądać tak:

ekrann = new C_tlo;
plansza = new C_tlo("plansza.bmp");
zabaa = new C_zaba();

0

A wyjaśniając: tworzysz nowe wskaźniki lokalne w konstruktorze i do nich przypisujesz nowe obiekty. Wskaźniki, które wchodzą w skład klasy nadal wskazują w kosmos. Z tego powodu jak chcesz ich użyć program przestaje działać poprawnie.

0

A jak mam je połączyć ze sobą?
Jak mam jako pole klasy:
C_tlo * ekran;

I w konstruktorze:

C_tlo * ekran;
ekran = new C_tlo; 

To czy pole klasy (ekran) nie zostanie od razu powiązane z nowym obiektem?

Jak zrobić żeby te wskaźniki nie były lokalne tylko globalne? W obrębie całej klasy?

0
piotrek89 napisał(a)

A jak mam je połączyć ze sobą?
Jak mam jako pole klasy:
C_tlo * ekran;

I w konstruktorze:

C_tlo * ekran;
ekran = new C_tlo; 

To czy pole klasy (ekran) nie zostanie od razu powiązane z nowym obiektem?

Jak zrobić żeby te wskaźniki nie były lokalne tylko globalne? W obrębie całej klasy?

Marsz do sklepu po książkę do C++ (przynajmniej 800 stron) i nie wracaj dopóki nie przeczytasz :P.
W konstruktorze DEKLARUJESZ drugą zmienną o nazwie ekran, która PRZYSŁANIA pole klasy. Jeżeli masz pole klasy o nazwie 'ekran', to jest ono widoczne we wszystkich metodach klasy i nie trzeba (a nawet nie wolno) jej ponownie deklarować.
Krótko mówiąc w DEKLARACJI klasy DEKLARUJESZ zmienne, natomiast w konstruktorze i innych metodach je ew. DEFINIUJESZ.

0

Macie racje Panowie. Dzięki wielkie! Teraz działa idealnie. Faktycznie podstawy programowania obiektowego się kłaniają. :P W ramach swojego usprawiedliwienia dodam iż próbowałem zrobic coś takiego:

 C_tlo * ekran2;
ekran2 = new C_tlo;
ekran=ekran2

Czyli utowrzyć w konstruktorze nowy obiekt ekran2 i przypisać go do ekran (ktory był zadeklarowany jako pole klasy). No i też nie działało.

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