[英]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.