176 Godzina 12
EFEKT DZIAŁANIA:
Compile error: Attempting to return a reference to a local object!
W liniach 7—17 deklarowana jest klasa ZwyklyKot. W linii 26 referencja do obiektu zadeklarowanej klasy jest inicjalizowana obiektem zwracanym przez funkcję Funkcja, zadeklarowanej w linii 22 tak, aby zwracała referencje do obiektu klasy ZwyklyKot.
Funkcja deklaruje lokalny obiekt klasy ZwyklyKot i inicjalizuje jego wagę i wiek. Następnie zwraca referencje to tego, lokalnego obiektu. Niektóre kompilatory wychwycą ten oczywisty błąd i nie pozwolą na uruchomienie programu. Inne skompilują to bez zastrzeżeń, ale efekt działania takiego programu jest nieprzewidywalny. Kiedy Funkcja ulegnie zakończeniu, to lokalny obiekt, Frisky, zostanie wyrzucony z pamięci. Referencja zwrócona z funkcji odnosiłaby się do nieistniejącego obiektu co jest oczywiście sprzeczne z definicją referencji.
Możesz rozwiązać stworzony w programie 12.4. problem poprzez zmianę funkcji Funkcja tak, aby tworzyła obiekt klasy ZwyklyKot na stercie. Dzięki temu, po zakończeniu funkcji, taki obiekt będzie nadal istniał.
Pojawia się tutaj kolejny problem: Co zrobić z pamięcią zarezerwowaną dla obiektu Frisky po zakończeniu wszystkich operacji. Listing 12.5 ilustruje ten problem.
1: // Listing 12.5
2: // Problemy ze znikająca pamięcią
3: finclude <iostream.h>
4:
5: class ZwyklyKot
6: {
7: public:
8: ZwyklyKot (int wiek, int waga);
9: -ZwyklyKot() {}
10: int PobierzWiek() { return jegoWiek; )
11: int PobierzWaga() { return jegoWaga; }
12:
13: private:
14: int jegoWiek;
15: int jegoWaga;
16: >;
17:
Compile error: Attempting to return a reference to a local object!
ANALIZA
W liniach 7—17 deklarowana jest klasa ZwyklyKot. W linii 26 referen-[ cja do obiektu zadeklarowanej klasy jest inicjalizowana obiektem zwracanym przez funkcję Funkcja, zadeklarowanej w linii 22 tak, aby zwracała referencje do obiektu klasy ZwyklyKot.
Funkcja deklaruje lokalny obiekt klasy ZwyklyKot i inicjalizuje jego wagę i wiek. Następnie zwraca referencje to tego, lokalnego obiektu. Niektóre kompilatory wychwycą ten oczywisty błąd i nie pozwolą na uruchomienie programu. Inne skompilują to bez zastrzeżeń, ale efekt działania takiego programu jest nieprzewidywalny. Kiedy Funkcja ulegnie zakończeniu, to lokalny obiekt, Frisky, zostanie wyrzucony z pamięci. Referencja zwrócona z funkcji odnosiłaby się do nieistniejącego obiektu co jest oczywiście sprzeczne z definicją referencji.
Możesz rozwiązać stworzony w programie 12.4. problem poprzez zmianę funkcji Funkcja tak, aby tworzyła obiekt klasy ZwyklyKot na stercie. Dzięki temu, po zakończeniu funkcji, taki obiekt będzie nadal istniał.
Pojawia się tutaj kolejny problem: Co zrobić z pamięcią zarezerwowaną dla obiektu Frisky po zakończeniu wszystkich operacji. Listing 12.5 ilustruje ten problem.
Listing 12.5. „Znikająca” pamięć
1: // Listing 12.5
2: II Problemy ze znikająca pamięcią
3: #include <iostream.h>
4:
5: class ZwyklyKot
6: {
7: public:
8: ZwyklyKot (int wiek, int waga);
9: -ZwyklyKot() {}
10: int PobierzWiek() ( return jegoWiek; )
11: int PobierzWaga() { return jegoWaga; )
12:
13: private:
14: int jegoWiek;
15: int jegoWaga;
16: } ;
17: