请问一个引用类的问题?
//引用类class Ref{public: Ref(void) : m_nRef(1) {} ~Ref(void){}private: int m_nRef;public: int AddRef() { m_nRef++; return m_nRef; } int Release() { m_nRef--; return m_nRef; }};//测试类class test{public: test(void); ~test(void);public: Ref *m_pRef; void operator = (const test & testx) { if (m_pRef) delete m_pRef; m_pRef = testx.m_pRef; m_pRef->AddRef(); }};test::test(void){ m_pRef = new Ref;}test::~test(void){ if (m_pRef->Release() == 0) { delete m_pRef; }}
test& operator = (const test & testx) { if (m_pRef)//没看明白你的逻辑,这里为什么要delete? delete m_pRef; m_pRef = testx.m_pRef;//既然前面已经delete了,而这里却对一个已经释放了内存空间的对象进行赋值。 m_pRef->AddRef(); }
[解决办法]
test test2 = test1; //这里并不会调用 = 重定义操作
是的,这里会调用拷贝构造函数,所以你需要在拷贝构造函数里面对引用次数做相应的处理。
[解决办法]
test test2 = test1;
这是要调用复制构造函数。因为私有成员有个指针,要深度复制。
[解决办法]
但是已经delete了啊 还怎么深度复制呢?
[解决办法]
void operator = (const test & testx)
有问题啊, 怎么返回void?
test& operator=(const test& testx)
[解决办法]
=操作符重载都写成这样还觉得自己没错,那你还问什么问题呢?