2013-05-27 85 views
1

好了,所以我有一個看起來像兩個類:修改常量參數參考

class Item 
{ 
    private: 
     HANDLE Parent; 

    public: 
     Item(const Item &I) = delete; 
     Item(Item &&I) = delete; 
     void SetParent(HANDLE Handle); 

     Item& operator = (const Item &I) = delete; 
     Item& operator = (Item &&I); 
}; 

void Item::SetParent(HANDLE Handle) 
{ 
    this->Parent = Handle; 
} 

Item& Item::operator = (Item&& I) {/*Do Move Here*/} 


class Box 
{ 
    private: 
     HANDLE Handle; 

    public: 
     void Add(const Item &I); 
}; 

void Box::Add(const Item &I) 
{ 
    I.SetParent(this->Handle); //Error.. Item I is const. 
} 

我得到的錯誤,我有const是有道理的,但我需要一種方法來項目的setparent我不失能力構建我在的地方像這樣:

Box B(Item()); 

代替:

Item I; 
Box B(I); 

任何想法如何,我可以保持在線construc我可以通過調用SetParent來修改它嗎?

+2

Rvalues引用。 – Xeo

+0

這是否意味着我必須創建兩個函數?一個只需要一個引用(非const)和一個需要RValue引用,這樣我就不會失去非內聯構造? – Brandon

+1

是的,它需要兩個構造函數 - 或者只有一個,如果你可以使它成爲一個模板(請參閱「通用參考」)。 – Xeo

回答

2

解決方法是將Parent成員聲明爲可變,並使SetParent方法保持不變。示例代碼如下並可用online

typedef int HANDLE; 

class Item 
{ 
    private: 
     mutable HANDLE Parent; 

    public: 
     Item(const Item &I) = delete; 
     Item(Item &&I) = delete; 
     void SetParent(HANDLE Handle) const; 

     Item& operator = (const Item &I) = delete; 
     Item& operator = (Item &&I); 
}; 

void Item::SetParent(HANDLE Handle) const 
{ 
    this->Parent = Handle; 
} 

class Box 
{ 
    private: 
     HANDLE Handle; 

    public: 
     void Add(const Item &I); 
    public: 
     Box(const Item &I) { 
      Add(I); 
     } 
}; 

void Box::Add(const Item &I) 
{ 
    I.SetParent(this->Handle); //Error.. Item I is const. 
} 

int main(void) { 
    return 0; 
} 
+1

'mutable'只能用於隱形狀態 - 有或沒有父母不會以「隱形狀態」傳遞,至少對我來說。 – Xeo

+0

嗯我從來沒有見過這個關鍵字可變之前。也許有充分的理由,也許是壞事。這實際上看起來很酷。如前所述,我最終使用了R-Value引用。我會接受這個,因爲它激起了我的興趣,也是當時唯一的答案。 – Brandon