Я не знаю достаточно глубокого, тонкого C ++, чтобы объяснить проблему, с которой вы сталкиваетесь. Однако я знаю, что гораздо легче убедиться, что класс ведет себя так, как вы ожидаете, если вы следуете правилу Трех , которое нарушает код, который вы опубликовали. По сути, в нем говорится, что если вы определяете любое из следующего, вы должны определить все три:
- Destructor
- Конструктор копирования
- Оператор присваивания
Также обратите внимание, что реализация оператора присваивания должна правильно обрабатывать случай, когда объект присваивается самому себе (так называемое «самопредставление»). Следующее должно работать правильно (не проверено):
#include <iostream>
#include <string>
using namespace std;
class C {
public:
C(int n) {
x = new int(n);
}
C(const C &other): C(other.getX()) { }
~C( ) {
delete x;
}
void operator=(const C &other) {
// Just assign over x. You could reallocate if you first test
// that x != other.x (the pointers, not contents). The test is
// needed to make sure the code is self-assignment-safe.
*x = *(other.x);
}
int getX() {return *x;}
private:
int* x;
};
void main( ) {
C obj1 = C(3);
obj1 = C(4);
cout << obj1.getX() << endl;
}