Konstruktor kopiujący a inicjalizacja tablicy obiektów

0

Witam!

Mam jedno pytanie, czy jezeli inicjalizuje tablice obiektow w ten sposób:

 
#include <iostream>

using namespace std;

class abc
{

  int x, y;

  public:
  abc(int c)
  {
      x=c;
      y=10;
  }
  abc()
  {
      x=120;
      y=120;
  }
  void pokaz()
  {
      cout << x << "   "<< y <<endl;
  }

};

int main()
{
    abc ob1;
    abc ob2 = ob1;
    abc ob3(10);


    abc tablica[5]=      //TUTAJ DOKONUJE INICJALIZACJI 
    {
        abc(29),
        abc(34),
        abc(23),
        abc(),
    };

    for(int i=0; i<5;i++)
    {
        tablica[i].pokaz();
        cout << endl;
    }
    return 0;
}

w klasie moge mieć zdefiniowane własny konstruktor kopiujący, bo powyższy kod działa jak należy, ale poniższy wywala bład:
error: no matching function for call to 'abc::abc(abc)'.

 
#include <iostream>

using namespace std;

class abc
{

  int x, y;

  public:
  abc( abc & obiekt_do_kopiowania)
  {
      this->x = obiekt_do_kopiowania.x;
      this->y = obiekt_do_kopiowania.y;

      cout << "O to ja Kopujacy ----" <<endl;
      cout << x <<" " << y <<endl;
  }
  abc(int c)
  {
      x=c;
      y=10;
  }
  abc()
  {
      x=120;
      y=120;
  }
  void pokaz()
  {
      cout << x << "   "<< y <<endl;
  }

};

int main()
{
    abc ob1;
    abc ob2 = ob1;
    abc ob3(10);


    abc tablica[5]=
    {
        abc(29),
        abc(34),
        abc(23),
        abc(),
    };

    for(int i=0; i<5;i++)
    {
        tablica[i].pokaz();
        cout << endl;
    }
    return 0;
}
0

Zrób abc(const abc &obiekt_do_kopiowania) i powinno być ok

0

Konstruktor kopiujący powinien wyglądać tak:

  abc(const abc &obiekt_do_kopiowania) :
    x(obiekt_do_kopiowania.x),
    y(obiekt_do_kopiowania.y) {

      cout << "O to ja Kopujacy ----" <<endl;
      cout << x <<" " << y <<endl;
  }

Przede wszystkim const jest obowiązkowe. Po drugie to konstruktor, więc możesz użyć listy inicjalizacyjnej.

0

Zrobiłem tak jak mówisz i faktycznie teraz działa, ale dlaczego muszę zabezpieczać się tym "const" w moim konstruktorze kopiującym. poza tym czy w moim kodzie (jak już wprowadze "const" ) czy na ekranie nie powinno pojawić mi się "O to ja Kopujacy ----", bo przeciez podczas tego fragmentu :

abc tablica[5]=
    {
        abc(29), 
        abc(34),
        abc(23),
        abc(),
    }; 

o ile dobrze rozumiem uruchamia sie konstruktor kopiujący niejawnie, a skoro mam zdefiniowany własny, wiec to on powinien ruszyć do pracy i aż 5 razy wypisać "Kopujacy ----", bo według mnie najpierw uruchamia sie konstruktor dla obiektu chwilowego, a pozniej konstruktor kopiujący np dla tablica[0].
Gdzie leży błąd w moim rozumowaniu i jeszcze raz po co musze się zapezpieczać tym "const" .

Pozdrawiam :)

0

const musi być m. in. ze względu na obiekty tymczasowe. Nie można przypisać obiektu tymczasowego do niestałej referencji. (rvalue reference w C++11 pomińmy) Poza tym jaki sens miałoby zmienianie tego obiektu, z którego kopiujesz?

Dlaczego przy inicjalizacji tablicy miały by działać konstruktory kopiujące? Tam nie ma tymczasowych obiektów - 5 obiektów typu abc umieszczanych jest obok siebie w pamięci, to trochę tak jakby 5 zmiennych.

0

rvalue reference w C++11 pomińmy
r-value references otwierają oczy, ukazując że nie każdy obiekt musi być koniecznie kopiowalny.
całkiem dobrze się pisze obiekty które są "movable, non-copyable".

0
Endrju napisał(a):

Poza tym jaki sens miałoby zmienianie tego obiektu, z którego kopiujesz?
powiedz to twórcom auto_ptr :P

0

Ok dzięki bardzo za odpowiedz, juz rozumiem po co ten "const" :) A to z tym moim konstruktorem kopiującym wyczytałem z symfonii, ale prawdopodobnie coś źle zrozumiałem. Jeszcze raz wielkie dzięki za odpowiedz, Pozdrawiam!

1 użytkowników online, w tym zalogowanych: 0, gości: 1