[c++] Kopiowanie bez referencji

Mam pytanie z programowania, a na forach tematycznych ci co wiedzą, nie powiedzą, a ci co myślą, że wiedzą, to nie są mi w stanie pomóc. Chodzi mi o kopiowanie wartości obiektów klas stworzonych samemu. Chce przepisać niejako wszystkie wartości z jednego obiektu do kolejnego, ale kod:

for(int i=0;i<10;i++)

obiekt1[i]=obiekt2[i];

powoduje przypisanie obiektów, referencję, przez co zmiana jednego powoduję zmianę drugiego, co jest zbędne i przeszkadzające. Gdy dla przykładowej klasy

Tklasa{

int a;

int b;

int c;

}

nie ma problemu, mogę przypisać każdą wartość

for(int i=0;i<10;i++){

obiekt1[i]->a=obiekt2[i]->a;

obiekt1[i]->b=obiekt2[i]->b;

obiekt1[i]->c=obiekt2[i]->c;}

to przy 100 wartościach, czy 200 jakich potrzebuje taki system nie zdaje egzaminu. Jak mogę w jednej linijce kopiować same wartości z obiektu nie przypisując do siebie samych obiektów?

Pytanie co przechowują tablice obiekt1 i obiekt2, jeśli wskaźniki jak sugeruje trzeci kod, to przepisane zostaną wartości wskaźników, a nie obiekty. To, czy takie zachowanie ma sens, zależy od konkretnego przypadku. Trzeci przykład kodu jest raczej mało sensowny. Jeśli już, to *(obiekt1_) = *(obiekt2__), o ile te tablice przechowują wskaźniki._

tablice przechowują i wskaźniki i zwykłe zmienne. Trzeci przykład kodu powoduje kopiowanie samych wartości krok po kroku, może nie powinien, nie wiem, ale to robi. *(obiekt1_) = *(obiekt2__) powoduje: error C2582: ‘operator =’ function is unavailable in ‘KPlanPelny’_

Najlepiej zawsze w klasie jest stworzyć konstruktor kopiujący oraz przeciążyć operator =. kiedys dla zabawy mapisałem sobie taka klase mam nadzieje że Ci pomoże :

class pierwsza

{

  protected:

          int * wiek;

          string imie;

  public:

         pierwsza(void)

         {

         wiek = new int(0);

         imie = "nie podano";

         cout<<"\nkonstruktor domniemany klasa pierwsza\n";              

         }    


         pierwsza(int ile, string nazwa) : imie(nazwa)

         {

         wiek = new int(ile);  

         cout<<"\nkonstruktor podstawowy klasa pierwsza\n";           

         }


         pierwsza(const pierwsza & wzor)

         {

         wiek = new int;         

         *wiek = *(wzor.wiek);

         imie = wzor.imie;   

         cout<<"\nkonstruktor kopiujacy klasa pierwsza\n";           

         }


         ~pierwsza()

         {

         delete wiek;

         imie = "";   

         cout<<"destruktor klasa pierwsza";        

         }


         pierwsza & operator= (const pierwsza & wzor) 

         {

         //spr czy nie sam na siebie//

         if(this==&wzor) return * this;

         //czesc destrukcyjna//

         delete wiek;

         imie = "";

         //czesc przypisywania;

         wiek = new int;         

         *wiek = *(wzor.wiek);

         imie = wzor.imie;   

         cout<<"\npszypisanie klasa pierwsza\n";              

         return *this;

         }


         void kurczak()

         {

            cout<<"kukuryku";       

         }


         friend ostream & operator << ( ostream & ekran, const pierwsza & wzor) 

         {

         ekran<<"Imie: "<
         return ekran;       

         }


};

Świetne przedstawienie konstruktorów :). Pomocne, choc mi chodziło o coś na skróty. Konstruktora nie mam, ale stworzyłem sobie funkcję kopiującą, która, jak konstruktor krok po kroku, zmienna po zmiennej kopiuje same wartości, ale musiałem wypisać wszystkie zmienne z palca, a myślałem,że da się w jednej linijce. Nie mniej wielkie dzięki za odpowiedź, kilka pomysłów mi do czegoś jeszcze podsunąłeś :slight_smile:

Przecież można w jednej linijce, czytaj uważnie co napisał nr47.

A przeczytałeś moją odpowiedź co jest poniżej? Blapiter przeczytał i dał inną radę, niestety dłuższą w zapisie, a podana przez nr42 nie działa, co już zresztą napisałem,oraz podałem kod błędu.

To jest ta sam rada, tylko że blapiter pokazał jak trzeba poprawnie stworzyć klasę która by poprawnie reagowała na zapis który zaproponował nr47.

acha, to co innego. dzięki za odpowiedź. :smiley: