【发布时间】:2013-04-23 12:27:14
【问题描述】:
如何在 C++ 中重载运算符&?我试过这个:
#ifndef OBJECT_H
#define OBJECT_H
#include<cstdlib>
#include<iostream>
namespace TestNS{
class Object{
private:
int ptrCount;
public:
Object(): ptrCount(1){
std::cout << "Object created." << std::endl;
}
void *operator new(size_t size);
void operator delete(void *p);
Object *operator& (Object obj);
};
void *Object::operator new(size_t size){
std::cout << "Pointer created through the 'new' operator." << std::endl;
return malloc(size);
}
void Object::operator delete(void *p){
Object * x = (Object *) p;
if (!x->ptrCount){
free(x);
std::cout << "Object erased." << std::endl;
}
else{
std::cout << "Object NOT erased. The " << x->ptrCount << "references are exist."
<< std::endl;
}
}
Object *Object::operator& (Object obj){
++(obj.ptrCount);
std::cout << "Counter is increased." << std::endl;
return &obj;
}
}
#endif
主要功能:
#include<iostream>
#include"Object.h"
namespace AB = TestNS;
int main(int argc, char **argv){
AB::Object obj1;
AB::Object *ptrObj3 = &obj1; // the operator& wasn't called.
AB::Object *ptrObj4 = &obj1; // the operator& wasn't called.
AB::Object *obj2ptr = new AB::Object();
}
输出结果:
对象已创建。
通过'new'操作符创建的指针。
对象已创建。
我的 operator& 没有被调用。为什么?
【问题讨论】:
-
试试
AB::Object *ptrObj5 = obj1 & obj1;,你就会知道为什么。 -
我认为你在这里做的是一个非常糟糕的主意。用于引用计数的 operator& 会导致悲伤。
-
因为它是一个不完整的解决方案。特别是如果您从运算符返回原始指针。至少,返回一些减少销毁引用计数的东西。但是重载地址操作符的问题是它使处理对象变得很烦人。另外,普通引用而不是指针呢?我只能说 Object& 或 = *somePointer,而你无法跟踪它。基本上,这个方案有很多漏洞可以通过,您将花费所有时间调试引用计数错误。
-
首先,重载一元
&通常是个坏主意。如果必须,那么您的设计就有缺陷——&应该基于侵入式引用计数(std::enable_shared_from_this或自定义解决方案)返回一个指向this的智能指针。不要重载运算符new和delete,这不是这些重载的用途——相反,隐藏构造函数并提供static smart_ptr<Object> CreatePtr( Args&&... args )包装器。请注意,自动存储中或另一个非垃圾收集对象中不能存在垃圾收集对象,因此这种设计会导致性能下降。
标签: c++