簡體   English   中英

賦值運算符c ++ NULL賦值

[英]assignment operator c++ NULL assignment

我正在使用一個大多數情況下都可以正常工作的類,但是我正在做一些功能,可能有一個遞歸函數將類類型的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盡管由於某種原因現在程序因無限調用賦值運算符而中斷。 不知道發生了什么

您不能直接為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; }

您正在嘗試編寫“可空”類。 將“空”狀態視為Thing實例可以處於的狀態之一,並且不要用指針語義對其進行卷積。

通用方法是在您的類中添加一個布爾標志,以跟蹤實例是否處於空狀態。 我會這樣實現:

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
};

現在,默認賦值運算符可以正常工作。

不能分配到this

另外,您應該通過const引用獲取參數,因此Thing& operator= (const Thing& other)

C ++-faq標記中有一個關於運算符重載的很棒的SO問題,您可以在這里找到

Thing類的成員變量是什么? 如果要顯示該對象某種程度上沒有值或沒有初始化,則最好將字段分配為0(對於整數)和null(對於指針)等,而不是分配恆定的“ this”。

簡短的答案,不,您不能在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM