Witam,
w jaki sposób zrobić kontruktor kopiujący konstruktora domyślnego, bo próbuję:
macierz a();
macierz a2(aa);
niestety, to nie działa.
http://ideone.com/Ng1hZs
Witam,
w jaki sposób zrobić kontruktor kopiujący konstruktora domyślnego, bo próbuję:
macierz a();
macierz a2(aa);
niestety, to nie działa.
http://ideone.com/Ng1hZs
macierz::macierz(const macierz &mk)
{
m_height=mk.m_height;
m_width=mk.m_width;
tab=new double*[mk.m_height];
for(int h=0;h<mk.m_height;++h)
{
tab[i]=new double[m_width];
for(int w=0;w<mk.m_width;++w) tab[h][w]=mk.tab[h][w];
}
}
zrobiłem coś takiego:
macierz();
macierz(macierz);
i wtedy korzystam z wcześniej zadeklarowanego konstruktora kopiującego.
Na ekranie pojawiło się to samo. Czy to jest poprawne?
EDIT: Ok. Widzę, że w/w kod jest potrzebny, tylko nie wiem jakie jest wywołanie tego konstruktora kopiującego, macierz(macierz);?
macierz M;
macierz A(M); // jawne wywołanie konstruktora kopiującego
macierz B=M; // wywołanie konstruktora kopiującego spowodowane przez http://en.wikipedia.org/wiki/Copy_elision
void funA(macierz m); // przy wywołaniu tej funkcji parametr przekazywany poprzez konstruktor kopiujący
macierz funB(); // przy wywołaniu tej funkcji zwracana wartość poprzez konstruktor kopiujący (ale optymalizator to może usunąć)
wywołuje pierwszy kopiujący:
macierz();
macierz(macierz);
następnie drugi, ale ten wtedy nie działa, ze względu na wywołanie macierz(macierz):
macierz mk(5, 5);
macierz mk2(mk);
Jako pierwszy kopiujacy wywołuje Twój kod. Następnie wywołuje ten:
macierz::macierz(macierz& mk) {
tab = new double*[mk.m_width];
m_width = mk.m_width;
for (int i = 0; i < mk.m_height; i++){
tab[i] = new double[mk.m_height];
tab[i] = mk.tab[i];
}
cout << "\n";
for (int i = 0; i < mk.m_height; i++){
cout << "\n";
for (int j = 0; j < mk.m_width; j++)
printf("%2g ", tab[i][j]);
}
}
analogicznie:
macierz();
macierz(macierz);
macierz mk(5, 5);
macierz mk2(mk);
no dobra, ale ja chce skopiować też ten konstruktor:
macierz::macierz(int height, int width){
m_height = height;
m_width = width;
tab = new double*[m_width];
for (int i = 0; i < m_width; i++)
tab[i] = new double[m_height];
}
Konstruktor kopiujący nie kopiuje konstruktorów, konstruktor kopiujący kopiuje obiekty.
ten konstruktor po poprawieniu:
macierz::macierz(unsigned height,unsigned width):m_height(height),m_width(width)
{
tab=new double*[m_height];
for(unsigned h= 0;h<m_height;++h) tab[h]=new double[m_width];
}
może zostać.
nie mam sił do tego.
może mi ktoś napisać, żeby program kopiował obiekt kontruktora domyślnego i obiekt konstruktora macierz::macierz(int height, int width){
żeby program kopiował obiekt kontruktora domyślnego i obiekt konstruktora macierz::macierz(int height, int width)
Wiesz w ogóle o czym piszesz? Czym jest "obiekt konstruktora domyślnego" ? Takie coś nie istnieje.