Niedawno odkryłem, że gdy mam wskaźniki w klasie, muszę określić konstruktora Kopiuj.Kopiuj konstruktora ze wskaźnikami
Aby się tego nauczyć, wykonałem poniższy prosty kod. Kompiluje, ale daje mi błąd wykonania podczas wykonywania konstruktora kopiowania.
Próbuję skopiować tylko wartość ze wskaźnika skopiowanego obiektu, ale unikaję przypisywania tego samego adresu.
Co jest nie tak?
class TRY{
public:
TRY();
~TRY();
TRY(TRY const &);
int *pointer;
void setPointer(int);
};
void TRY::setPointer(int a){
*pointer = a;
return;
}
TRY::TRY(){}
TRY::~TRY(){}
TRY::TRY(TRY const & copyTRY){
int a = *copyTRY.pointer;
*pointer = a;
}
int main(){
TRY a;
a.setPointer(5);
TRY b = a;
b.setPointer(8);
cout << "Address of object a = " << &a << endl;
cout << "Address of object b = " << &b << endl;
cout << "Address of a.pointer = " << a.pointer << endl;
cout << "Address of b.pointer = " << b.pointer << endl;
cout << "Value in a.pointer = " << *a.pointer << endl;
cout << "Value in b.pointer = " << *b.pointer << endl;
return 0;
}
będę stosując tę koncepcję dla innych klas z dużą ilością wskazówek w nim, gdzie należy skopiować wszystkie wartości z dnia obiektu do drugiego. Kopiowanie jest początkowo niezbędne dla tego kodu, więc chciałbym zachować możliwość kopiowania (nie będę ukrywał konstruktora kopii jako prywatnego).
Poza tym prawdziwa klasa, którą muszę wprowadzić, ma 10 wskaźników i może się zmieniać z czasem. Nie jest tam nieco mądrzejszy sposób na głęboki konstruktor kopiujący w C++? ...
Nie zapomnij usunąć m_p przed przydzieleniem mu nowego obiektu. – xtofl
Nie zdefiniowałem operatora przypisania, to tylko konstruktor kopii. Dlatego nie ma potrzeby usuwania m_p. – Naveen
W konstruktorze, m_p początkowo będzie niezdefiniowane, dopóki nie zostanie jawnie umieszczone na liście inicjalizacyjnej. Jeśli spróbujesz usunąć niezdefiniowany wskaźnik, wystąpią złe rzeczy. –