赋值运算符c ++ NULL赋值

时间:2012-03-12 08:10:01

标签: c++ assignment-operator

我正在使用一个大多数工作正常的类,但我正在做一些功能,我可能会有一个递归函数返回类类型的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虽然由于某种原因,程序会因为对赋值运算符的无限调用而中断。不知道发生了什么

5 个答案:

答案 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将无需您定义赋值运算符。