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

Konstruktor kopiujący

Ostatnio zmodyfikowano 2018-12-03 11:32
Autor Wiadomość
jdkrrrrr
Temat założony przez niniejszego użytkownika
Konstruktor kopiujący
» 2018-12-02 23:04:55
Witam, szukam pomocy z następującym zadaniem:

Pol.Popraw przykład tak aby zmiana adresu w skopiowanym obiekcie nie wpływała na obiekt źródłowy. *Jak najprościej
 
C/C++
class DaneAdresowe {
private:
    string miasto, ulica;
   
public:
    DaneAdresowe( string miasto, string ulica ) {
        this->miasto = miasto; this->ulica = ulica;
    }
   
    void wyswietlDane() {
        cout << miasto << " " << ulica << endl;
    }
   
    void zamianaDanych( string noweMiasto, string nowaUlica ) {
        miasto = noweMiasto; ulica = nowaUlica;
    }
};

class Osoba {
public:
    DaneAdresowe * adres;
   
    Osoba( DaneAdresowe * adres ) {
        this->adres = adres;
    }
};

C/C++
int main() {
   
    Osoba jan( new DaneAdresowe( "Warszawa", "Kaliskiego" ) );
   
    Osoba kolegaJana( jan );
   
    jan.adres->wyswietlDane();
    kolegaJana.adres->wyswietlDane();
   
    kolegaJana.adres->zamianaDanych( "Poznan", "Jana Pawła II" );
   
    jan.adres->wyswietlDane();
    kolegaJana.adres->wyswietlDane();
   
    return 0;
}
P-173080
pekfos
» 2018-12-03 00:07:14
Najprościej to nie mieć tam wskaźnika. Powoduje tylko wyciek pamięci.

Ewentualnie możesz też napisać odpowiedni konstruktor kopiujący do klasy Osoba, jeśli "prościej" jest dopisywać kod, niż go usuwać. Żeby użycie tego wskaźnika było tylko wątpliwe, a nie niepoprawne, wypadałoby dopisać też operator przypisania i destruktor.
P-173082
jdkrrrrr
Temat założony przez niniejszego użytkownika
» 2018-12-03 10:08:28
Po usunięciu wskaźnika wyskakuje błąd przy tworzeniu Jana, a funkcji main() mam nie zmieniać.

Próbowałem zmienić kod na coś takiego z marnym efektem:

C/C++
Osoba( DaneAdresowe * adres ) {
    this->adres = new DaneAdresowe( * adres );
}

Mógłbyś powiedzieć coś więcej o tym jak miałby wyglądać ten konstruktor kopiujący, ponieważ jestem zielony w temacie.
P-173084
pekfos
» 2018-12-03 10:56:13
Ma wyglądać jak konstruktor kopiujący
» Programowanie obiektowe, C++ » PodstawyKonstruktory i destruktory lekcja
i ma alokować kopię obiektu DaneAdresowe, zamiast kopiować wskaźnik. Tak jak to próbowałeś zrobić w zwykłym konstruktorze, tyle że tam nie miało to sensu.
P-173085
jdkrrrrr
Temat założony przez niniejszego użytkownika
» 2018-12-03 11:32:57
Dzięki, metodą prób i błędów otrzymałem poprawny rezultat dodając coś takiego:

C/C++
Osoba( Osoba & osoba )
{
    this->adres = new DaneAdresowe( * osoba.adres );
}

P-173086
« 1 »
  Strona 1 z 1