class A {
public:
A(int num):mData(num){ }
~A( ) { }
int GetData( ) const { return mData; }
void SetData(int data) { mData = data; }
private:
int mData;
};
class B {
public:
B(int num=0):pa(new A(num)) { Anum=new int(1); }
~B( ) {
if(*Anum==1){
delete pa;
delete Anum;
}
*Anum--;
}
B(const B& rhs) {
Anum=rhs.Anum;
*Anum++;
pa=rhs.pa;
}
B& operator=(const B& rhs) { //rhs的数据 应该是: A * const pa、int * const Anum;
if ( this!=&rhs ) {
this->~B();
pa=rhs.pa;
Anum=rhs.Anum;
*Anum++;
}
return *this;
}
A* operator->( ) const {return pa;}
void GetData() const { return pa->GetData();}
void SetData(int data) {
if(*Anum!=1){ //Copy on write 写时复制。
pa=new A (data);
this->~B();
Anum=new int(1);
}
else
pa->SetData(data);
}
private:
A* pa;
int *Anum;//如果不用指针,无法做到给所有人更改 这个计数。
};