我正在使用一个大多数工作正常的类,但我正在做一些功能,我可能会有一个递归函数返回类类型的NULL
指针作为控件,所以它可能是为我的类对象指定一个NULL
指针,这么长篇小说:
Thing& Thing::operator=(Thing * _other){
if (_other == NULL){
*this = NULL; // compiler throws here
return *this;
}
// does other assignment work
return *this;
}
我的编译器VS2010抛出this
不是I值。那么如何将值设置为NULL
,或者甚至可以从内部将项目设置为NULL?
编辑:修改this
到*this
虽然由于某种原因,程序会因为对赋值运算符的无限调用而中断。不知道发生了什么
答案 0 :(得分:2)
您无法直接将值设置为this
指针。因此
this = NULL;
在语义和语法上都是错误的。
您可以使用例外来检查_other
是否为NULL
。例如:
class null_object_exception : public virtual exception {};
...
if (_other == NULL) throw null_object_exception();
执行NULL
作业:
Thing the_thing, other_thing;
try { the_thing = &other_thing; }
catch( const null_object_exception& e ) { the_thing = NULL; }
答案 1 :(得分:2)
你正在尝试写一个“可空”的课程。将“null”状态视为Thing实例所处的状态之一,并且不要使用指针语义对其进行卷积。
一般方法是在类中添加一个布尔标志,用于跟踪实例是否处于null状态。我会像这样实现它:
class Thing
{
private:
bool m_null;
public:
void setnull() { m_null = true; }
bool isnull() const { return m_null; }
Thing() : m_null(true) {}
... // rest of class
};
现在默认的赋值运算符工作正常。
答案 2 :(得分:1)
您无法分配给this
。
另外,您应该通过const
引用来获取您的参数,因此Thing& operator= (const Thing& other)
在C ++中有一个很好的SO问题 - 关于运算符重载的faq标记,你可以找到它here
答案 3 :(得分:1)
Thing类的成员变量是什么? 如果你想表明对象是以某种方式没有值或没有初始化,你最好分配fileds 0(对于整数)和null(对于指针)等,而不是分配“this”这是恒定的。
答案 4 :(得分:1)
简短的回答,不,你不能在C ++中分配给this
。
更长的答案;为了让你的赋值运算符被调用,你必须有一个像;
这样的结构MyObject a;
a = NULL; // can change the content of `a` but not which object the name `a` refers to.
如果你正在考虑这个结构;
MyObject *a;
a = NULL;
您的赋值运算符甚至不会被调用,因为它是对象上的运算符,而不是指针。分配给指针a
将无需您定义赋值运算符。