Problem ze zrozumieniem inicjacji wskaznika
Ostatnio zmodyfikowano 2013-10-03 00:56
MarcinX Temat założony przez niniejszego użytkownika |
Problem ze zrozumieniem inicjacji wskaznika » 2013-10-02 20:39:57 Witam użytkowników, Mam problem ze zrozumieniem pewnego zabiegu w przykładzie. Dotyczy to przykładu w kursie: "Kurs C++/Dodatkowe materiały/Funkcje w klasie, czyli metody" Zrozumiałem fajnie o co chodzi z listami jednokierunkowymi, super sprawa. Nie rozumiem tylko jednej rzeczy. W klasie deklaruje wskaznik: protected: OsobaCL * m_nastepnaOsoba;
oraz metody: public: void DodajOsobeNaKoniec(); void Inicjuj();
metody wygladaja następująco: void OsobaCL::DodajOsobeNaKoniec() { OsobaCL * tOstatniaOsoba = this; cout << "tOstatniaOsoba = this = " << tOstatniaOsoba << " " << this << "\n"; cout << "m_nastepnaOsoba: " << m_nastepnaOsoba << "\n"; cout << "tOstatniaOsoba->m_nastepnaOsoba: " << tOstatniaOsoba->m_nastepnaOsoba << "\n \n"; while( tOstatniaOsoba->m_nastepnaOsoba != NULL ) { tOstatniaOsoba = tOstatniaOsoba->m_nastepnaOsoba; cout << "tOstatniaOsoba = " << tOstatniaOsoba << "\n"; } OsobaCL * tNowaOsoba = new OsobaCL; cout << "tNowaOsoba = " << tNowaOsoba << "\n"; tNowaOsoba->Inicjuj(); tNowaOsoba->Wypelnij(); tOstatniaOsoba->m_nastepnaOsoba = tNowaOsoba; cout << "tOstatniaOsoba->m_nastepnaOsoba: " << tOstatniaOsoba->m_nastepnaOsoba << "\n \n"; cout << "\n"; }
void OsobaCL::Inicjuj() { m_nastepnaOsoba = NULL; }
Za nic nie mogę z metody DodajOsobeNaKoniec() zrozumieć tego: Zrobiłem test i faktycznie jeśli nie zainicjuje wskaźnika to wyświetla mi w konsoli, że m_nastepnaOsoba = 0xffffffff. Próbując dalej działać na liście wyskakuje błąd krytyczny. Ja to czuje tak (może właśnie coś źle zrozumiałem): Inne zmienne same się zainicjowały podczas tworzenia obiektu. Obiekty utworzone w sekcji main() automatycznie inicjują ten wskaźnik (na 0) przy tworzeniu. Tutaj ja rozumiem, że tworzę obiekt za pomocą metody (jakby obiekt w obiekcie) - i tu gdzieś może być haczyk. Jeśli coś źle nazywam lub rozumuję, to proszę o pomoc. Z góry dziękuję. |
|
pekfos |
» 2013-10-02 21:33:18 Jeśli dodajesz osobę na koniec, to następnego elementu nie ma, więc wskaźnik m_nastepnaOsoba trzeba wyzerować. Tu robi to metoda Inicjuj(). |
|
MarcinX Temat założony przez niniejszego użytkownika |
» 2013-10-02 22:28:23 No wciąż nie mogę dojść jak to jest. Co powoduje, że następnego elementu nie ma? Jeśli robię to: OsobaCL * tNowaOsoba = new OsobaCL; to nie powinien w pamięci utworzyć się wskaźnik tNastepnaOsoba (zerowy) należący do obiektu typu OsobaCL tNowaOsoba? |
|
Monika90 |
» 2013-10-03 00:32:40 powinien w pamięci utworzyć się wskaźnik tNastepnaOsoba (zerowy) należący do obiektu typu OsobaCL tNowaOsoba? |
Wskaźnik się utworzy jako składowa obiektu, ale jeżeli klasa OsobaCL nie ma zdefiniowanego konstruktora, który ten wskaźnik inicjalizuje, to nie będzie on zainicjalizowany. |
|
MarcinX Temat założony przez niniejszego użytkownika |
» 2013-10-03 00:56:30 Teraz kapuje! :) Zmyliło mnie to, że w sekcji main() utworzyłem sobie taki obiekt (pierwszy listy) i nie robiłem inicjacji wskaźnika, a mimo to pokazywało mi że nastepnaOsoba przyjmuje NULL. W sekcji main() tworzę sobie pierwszą osobę: OsobaCL * pierwszaOsoba = new OsobaCL; cout << "Sprawdzam adres obiektu pierwszaOsoba: " << pierwszaOsoba << endl; cout << "Zobaczmy na co wskazuje (jesli wskazuje) nastepnaOsoba w obiekcie pierwszaOsoba: " << pierwszaOsoba->GetNastepnaOsoba() << endl;
i tutaj jak uruchamiam programik to zawsze pierwszaOsoba->GetNastepnaOsoba() pokazuje mi, że przyjęło 0 . Stąd wywnioskowałem, że podczas definicji wskaźnik ma ustawione NULL. Tworząc obiekt następny, ale w metodzie , wywołanie adresu wskaźnika tym samym sposobem pokazywało mi dziwne wartości i następował crash (bo nie zrobiłem inicjuj() - teraz już wiem) Wiecie dlaczego może tak być? Że zawsze wskaźnik jest ustawiony na 0 przy pierwszym obiekcie? Dziękuję za wskazówki! |
|
« 1 » |