2012-02-06 101 views
0

我需要爲具有許多成員的類實現賦值運算符,而這些成員不是我手動賦值的。我可以先製作一個淺存儲器副本,然後執行必要的初始化?在賦值運算符內部製作淺拷貝

class C 
{ 
    public: 
    C &operator=(const C &rhs) 
    { 
     if (&rhs == this) 
      return *this; 
     memcpy(this, &rhs, sizeof(C)); 
     Init(rhs); 
     return *this; 
    } 

    ......... 
}; 

謝謝。

+0

我不知道,但你必須先檢查自賦值。例如如果(this ==&rhs)返回* this; – mcnicholls 2012-02-06 17:05:25

+3

@mcnicholls:那麼,實現'='的理想方法是** Copy和Swap Idiom **。 – 2012-02-06 17:06:06

+0

@Als:是的,我記得看過這種方法,看起來確實是最好的方法。 – mcnicholls 2012-02-06 17:16:06

回答

1

那麼你可以,但所有複製的指針成員(如果有的話)將指向同一個對象,如果該對象超出了作用域,那麼您將留下一個指向它的所有其他對象的懸掛指針。

2

否。除非對象具有POD類型,否則這是未定義的行爲。而用戶定義的賦值運算符意味着它不是POD。而在 的做法,它可能會失敗的原因有很多。

一種可能的解決方案是定義一個嵌套POD類型與所述數據 成員,並簡單地將其指定,例如:

class C 
{ 
    struct Data { /* ... */ }; 
    Data myData; 
public: 
    C& operator=(C const& other) 
    { 
     myData = other.myData; 
     return *this; 
    } 
}; 

當然,這意味着你需要不斷指每個構件 如myData.x,而不僅僅是x

0

您正試圖使用​​運算符取消引用C++引用。除非你爲這個類定義了operator *,否則它不會工作。

我的意思是一致

memcpy(this, *rhs, sizeof(C)); 
+0

修復了,謝謝。 – jackhab 2012-02-07 07:35:34