Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem ze zrozumieniem inicjacji wskaznika

Ostatnio zmodyfikowano 2013-10-03 00:56
Autor Wiadomość
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:

C/C++
protected:
OsobaCL * m_nastepnaOsoba;

oraz metody:
C/C++
public:
void DodajOsobeNaKoniec();
void Inicjuj();

metody wygladaja następująco:
C/C++
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:
C/C++
tNowaOsoba->Inicjuj();

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ę.
P-93031
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().
P-93036
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?
P-93041
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.
P-93042
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ę:
C/C++
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!
P-93043
« 1 »
  Strona 1 z 1