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

Kopiowanie listy obiektów

Ostatnio zmodyfikowano 2015-12-12 14:41
Autor Wiadomość
dzarson
Temat założony przez niniejszego użytkownika
Kopiowanie listy obiektów
» 2015-12-11 19:31:10
Cześć :)

Mam problem ze skopiowaniem listy obiektów. Lista sama w sobie także jest obiektem.
Tworzę listę, a następnie muszę mieć w innym obiekcie taką samą z takimi samymi danymi itd. Lista jest jednokierunkowa.

Lista A;
A.tworzenielisty();
Lista B;
B=A;

Dlaczego coś takiego działa w ten sposób, że jeśli zmodyfikuję listę A to B też się zmienia?
Sprawdziłam adres komórki pamięci, w której znajduje się pierwszy element listy A i jest on taki sam jak adres komórki B.
Jak inaczej do tego podejść?

Z góry dziękuję za odpowiedź.
P-141785
1aam2am1
» 2015-12-11 19:54:34
Jeżeli lista jest twoją własna klasą to musisz zadeklarować sobie operator przypisania i konstruktor kopjujący
P-141787
dzarson
Temat założony przez niniejszego użytkownika
» 2015-12-11 20:20:19
a dlaczego te dwie rzeczy?
P-141788
1aam2am1
» 2015-12-11 21:19:32
operator przypisania dlatego, że jeżeli np. (a = b;). a już istniało wykonuje się operator przypisania.
a jeżeli (Lista a = b;)  dla zwiększenia prędkości wykonywania kodu niektóre kompilatory zamiast wywoływać konstruktor a potem operator przypisania. Wywołują tylko konstruktor kopiujący co ma być szybsze. (Optymalizacja)
P-141790
Gibas11
» 2015-12-11 21:25:59
Zamiast pisać cały konstruktor kopiujący możesz po prostu w środku wywołać operator przypisania, będzie prościej.
P-141792
mateczek
» 2015-12-12 14:41:11

wskaźniki trzeba uważać to przykład z wyjaśnieniem dlaczego ??
C/C++
#include <iostream>
#include<string>
using namespace std;
struct _osoba {
    string * imie;
    string * nazwisko;
    _osoba() {
        imie = new string;
        nazwisko = new string;
       
    }
    void zapisz( const string im, const string naz ) {
        * imie = im;
        * nazwisko = naz;
       
    }
    void przedstaw() {
        cout <<* imie << " " <<* nazwisko << endl;
    }
    ~_osoba() {
        delete imie;
        delete nazwisko;
    }
};

int main()
{
    _osoba ja, inna;
    ja.zapisz( "marek", "marecki" );
    inna = ja; // tutaj jest straszne ała !!! ponieważ
   
    /*
      *1 domyślny operator przypisania podmienił nie napisy ale adresy !!! co spawaia 
      *     ja.imie i inna.imie poakazują dokładnie na ten samą przestrzeń adresową !!!
      *2 straciliśmy wskaźnik do obszaru pamięci zarezerwowanetg da osoby inna!!!
      *
      * i to jeszcze nie koniec problemów !!!!
      */
   
   
    inna.zapisz( "piotrek", "piotrowski" ); //zmieniam "inna" zmienia się "ja"
    ja.przedstaw(); // widać ???
   
    // porównanie adresow - widać że pokazują na tą samą pamięć a miały mieć tylko takie same napisy!!!
   
    cout << "adrees imienia ja" <<&( ja.imie ) << endl;
    cout << "adres imienia inna" <<& inna.imie << endl;
   
   
   
}
//tu jest najgorzej bo destruktor obiektu "ja" niszczy pamięc a potem destruktor obiektu inna niszczy to samo raz jeszcze


http://zapodaj.net/images​/7fcb9958dd95a.png wynik tego armagedonu!!!
P-141817
« 1 »
  Strona 1 z 1