2013-06-25 46 views
0

所以我有一個基類,它有一個私有成員和派生類,它也有一些成員,基類定義了一個operator =,這是我的問題:在派生類和切片中使用operator =的正確方法

這是做到這一點的正確方法還是有更好的方法? 我一直在做任何切片嗎?

class A 
{ 
private: 
int* Arr; 
public: 
A(){ 
    Arr=new int[10]; 
    for(int i=0;i<10;i++){ 
     Arr[i]=2*i; 
    } 
} 
const A& operator=(const A& a){ 
    delete []Arr; 
    Arr=new int[10]; 
    for(int i=0;i<10;i++){ 
     Arr[i]=a.Arr[i]; 
    } 
    return *this; 
} 
}; 

class B: public A 
{ 
private: 
int * Arr2; 
public: 
B(){ 
    Arr2=new int[10]; 
    for(int i=0;i<10;i++){ 
     Arr2[i]=3*i; 
    } 
} 
const B& operator=(const B& b){ 
    A::operator=(b); 
    delete []Arr2; 
    Arr2=new int[10]; 
    for(int i=0;i<10;i++){ 
     Arr2[i]=b.Arr2[i]; 
    } 
    return *this; 
} 
}; 

我知道這不是一個完美的代碼,但我只是寫了一個簡單的問題。

+1

這不是異常安全或自分配安全的(這是有趣的閱讀:http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom)..除此之外,它看起來大致確定。 –

+0

是的,我知道,我沒有異常安全的自我分配安全預防方法。關於其他問題呢?代碼中是否有切片(甚至是安全的)? – petric

+0

你希望這條線能做什麼:A :: operator =(b); – doctorlove

回答

1

大量的研究後,嗯,我得出這樣的結論:

雖然這種利用基類賦值運算符將正常工作

A::operator=(b) 

的代碼仍然需要,因爲它在評論中提到的,提供合適的異常安全,自賦值安全 保證。

此外,由於我們需要實現一個賦值運算符,這也意味着由rule of three我們將需要實現一個複製構造函數和here將導致不必要的代碼重複。

那麼我們如何解決所有這些問題(可能還有更多..)? 最好的爲什麼我發現是使用Copy-and-Swap-Idiom。除了那篇文章提供的內容之外,我認爲不需要進一步的解釋。

-1

你應該寫複製構造算子。

+0

以及如何 會幫助我?我想分配一個對象到一個現有的對象而不是創建一個新的。 – petric

+0

Yean,這沒有幫助。 – BlackMamba

0

你想要什麼不是類的層次結構。分配給基礎對象以獲取派生對象的屬性是不可能的。基礎對象將始終保持爲基礎對象。如果你想擁有多態行爲,但保持合理的值語義,封裝非多態類中多態性

class A_impl; 

class A { 
public: 
    //Public interface: 
    //... 

private: 
    //Assuming `value_ptr` similar to 
    //https://bitbucket.org/martinhofernandes/wheels/src/17aee21522ce8d07c7a74b138e528fadf04d62ed/include/wheels/smart_ptr/value_ptr.h%2B%2B?at=default 
    value_ptr<A_impl> impl; 
}; 


class A_impl { 
public: 
    //Implementation interface: 
    //virtual ... 
    //virtual ~A_impl() {} 
}; 

class B : public A_impl { 
public: 
    //Implementation: 
    //... 
}; 
+0

這實際上不是我的意思,我需要能夠將派生類分配給對方,同時確保基類私有成員正確分配 – petric

+0

在這種情況下,只需轉發到'A :: operator =',就像您一樣在問題的代碼中。 – Mankarse