2013-06-04 137 views
1

以任何方式危險嗎?我不知道其他的做法,但似乎很可疑。危險的做法?

class cA 
{ 
public: 
    cA(){} 
    ~cA(){} 
    int a; 
//say class have tons of members.. 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cA obj; 
    cA *ptr = new cA; 
    *ptr = obj; 
    //ofc there is a 'delete ptr;' after 
} 

如果我記得沒錯的C++這意味着cA對象將被創建並ptr將指向它,我必須這樣做,以插入長壽命容器(vector<cA*>)。

將obj的內容從堆棧複製到堆的方式有效嗎?

編輯可能的解決方案?

class cA 
{ 
public: 
    cA(){} 
    ~cA(){} 
    int a; 
    void Copy(cA & ref) 
    { 
     a = ref.a; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cA obj; 
    cA *ptr = new cA; 
    ptr->Copy(obj); 
+1

取決於其他成員。如果班級擁有資源,是的。記錄三條規則。 –

+0

關於資源的好處,關於如何安全完成的好主意?我想創建一個'Copy(cA&a)'方法並手動複製所有成員。 –

+1

@ViniyoShouta:只使用標準拷貝構造函數(隱式生成或用戶定義)。正如Luchian所指出的那樣,你需要了解什麼是[三規則](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-ree)(或C + +11)。 – syam

回答

2

而不是這種形式:

cA obj; 
cA *ptr = new cA; 
ptr->Copy(obj); 

爲什麼這種形式的?

cA obj; 
cA *ptr = new cA(ob); 

您的副本構造函數如下所示。還應該有一個賦值操作符。

class cA 
{ 
public: 
    cA(){} 
    CA(const cA& ref) 
    { 
     a = ref.a; 
    } 
    ~cA(){} 

    cA& operator=(const cA& p) { 
     if (this != &p) { // make sure not same object 
      a = p.a; 
     } 
     return *this; // Return ref for multiple assignment 
    } 

    int a; 
}; 

而且沒有什麼你做之前是不會有危險,但也許只是一點點更難理解。

+0

沒有它不難,它好多了,非常感謝這個答案! –

+0

如果複製語義已經被類數據成員正確實現,那麼寫複製構造函數和複製賦值運算符是絕對沒有意義的。 OP沒有發佈該類的實際內容,但該示例中發佈的內容不需要額外的定義。而且,使用原始的基於賦值的方法沒有任何問題。 – AnT

+0

當然,你是對的。我剛剛完成。然後,如果有人看到這一點,並需要做深度複製,他們可以看到他們將執行這些。 – Matt

2

這不是一個危險的做法,但是如果你是該類筆者cA,覆蓋operator=,以便它正確的副本。

也沿着這些相同的路線實現複製構造函數。

1

這很好。但這取決於。

如果您的類是普通的舊數據類型(例如,如果它是所有簡單的非指針或非資源管理成員),則不需要實現複製構造函數或賦值運算符。舉例來說,如果cA只是持有一堆浮點數,整數和布爾值,你需要簡單地複製每個成員的值,那麼自動編譯器生成的拷貝構造函數將會很好。

但是,如果它包含指向某些內部資源的指針,則需要實現正確處理底層資源複製(「深層」副本)的複製構造函數和賦值運算符。

如果您打算繼承cA,則只需要虛擬析構函數。否則,你只是無故添加vtable指針膨脹到類的每個實例。如果你不打算繼承子類,並且正在使用C++ 11,那麼你可以將你的類設置爲final,這意味着如果有人試圖子類化cA(這會給它們一個編譯器),你不必擔心虛擬析構問題錯誤)。

此外,它可以幫助進行創建新類時自動聲明覆制構造函數和賦值運算符爲private的練習。然後,當您嘗試執行復制分配時會出現編譯器錯誤,此時您可以刪除聲明以允許編譯器生成自動版本。通過這種方式,您可以對自己班級的使用情況有更多的控制權和反饋意見,並且可以在稍後避免出現一些意外。