Konstruktor kopiujący
Ostatnio zmodyfikowano 2018-12-03 11:32
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 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; } };
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; }
|
|
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. |
|
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: 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. |
|
pekfos |
» 2018-12-03 10:56:13 Ma wyglądać jak konstruktor kopiujący Konstruktory i destruktoryi 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. |
|
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: Osoba( Osoba & osoba ) { this->adres = new DaneAdresowe( * osoba.adres ); }
|
|
« 1 » |