Poznaj C++ w$ godziny0187

Poznaj C++ w$ godziny0187



176 Godzina 12

EFEKT DZIAŁANIA:

Compile error: Attempting to return a reference to a local object!


Ten program nie skompiluje się pod kompilatorami firmy Borland. Kompilatory firmy Microsoft skompilują ten kod, ale trzeba zaznaczyć, że jest to błędne podejście.


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.

Zwracanie referencji do obiektu na stercie

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:    // 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!


Ten program nie skompiluje się pod kompilatorami firmy Borland. Kompilatory firmy Microsoft skompilują ten kod. ale trzeba zaznaczyć, że jest to błędne podejście.


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.

Zwracanie referencji do obiektu na stercie

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:


Wyszukiwarka

Podobne podstrony:
Poznaj C++ w$ godziny0216 Przeciążanie operatorów 207 EFEKT DZIAŁANIA: Compile error! Unable to conv
Poznaj C++ w$ godziny0183 172 Godzina 12 172 Godzina 12 EFEKT DZIAŁANIA: Tworzenie kota... Konstrukt
Poznaj C++ w$ godziny0028 12 Godzina 1 Przepisz program dokładnie. Pamiętaj o wszystkich znakach. Np
Poznaj C++ w$ godziny0077 Funkcje 63EFEKT DZIAŁANIA: Podaj temperaturę w stopniach Fehrenheit-a: 212
Poznaj C++ w$ godziny0055 40 Godzina 4EFEKT DZIAŁANIA; a: Ob: 0x: Oy: 35 a: 9 b: 7 x: 16 y: 16 W lin
Poznaj C++ w$ godziny0063 48 Godzina 4 12:    cout « "


Poznaj C++ w$ godziny0066 Instrukcje i wyrażenia 51 11:    if (x > 10) 12:  &
Poznaj C++ w$ godziny0084 70 Godzina 5 70 Godzina 5 8: 9: 10 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0100 86 Godzina 6 86 Godzina 6 11 12 13 14 15 16 17 18 19 20
Poznaj C++ w$ godziny0101 Proste klasy 87 Linia 12 rozpoczyna sekcję prywatną, która w tym wypadku s
Poznaj C++ w$ godziny0117 Godzina 8Zaawansowane sterowanie programem Działanie każdego większego pro
Poznaj C++ w$ godziny0121 Zaawansowane sterowanie programem 109 W liniach 12-15 wprowadzamy wartości
Poznaj C++ w$ godziny0130 118 Godzina 8 11:    { 12:    lieznik++; 13:
Poznaj C++ w$ godziny0131 Zaawansowane sterowanie programem 119EFEKT DZIAŁANIA: No to ile razy sie p
Poznaj C++ w$ godziny0174 Referencje 163 Linie 24-26 zamieniają wartości. Efekt zamiany wypisywany j
Poznaj C++ w$ godziny0179 168 Godzina 12 Występuje tutaj jeszcze jeden, dodatkowy koszt. Każda kopia
Poznaj C++ w$ godziny0181 170 Godzina 12 wyrzucany z pamięci poprzez wywołanie destruktora. Widać to
Poznaj C++ w$ godziny0185 174 Godzina 12 52:    // FunkcjaDruga pobiera referencje do
Poznaj C++ w$ godziny0189 178 Godzina 12 problem. Do jakiego obiektu odnosi się rKot po wykonaniu li

więcej podobnych podstron