2011-09-22 37 views
5

我讀了interesting things關於複製交換習語。我的問題是關於從另一個類繼承時執行swap方法的問題。複製交換習語,繼承

class Foo : public Bar 
{ 
    int _m1; 
    string _m2; 
    .../... 
public: 
    void swap(Foo &a, Foo &b) 
    { 
     using std::swap; 

     swap(a._m1, b._m1); 
     swap(a._m2, b._m2); 
     // what about the Bar private members ??? 
    } 
    .../... 
}; 

回答

9

你會交換子對象:

swap(static_cast<Bar&>(a), static_cast<Bar&>(b)); 

您可能需要實施交換功能Bar,如果std::swap不能完成這項工作。另請注意,swap應該是非會員(如果需要,還可以是朋友)。

+0

好,非常感謝,我想投,但我用',而不是'酒吧Bar''... – gregseth

+0

爲了避免鑄造,你可以做「Bar&a_bar = a,&b_bar = b; swap(a_bar,b_bar);」 –

2

只投它的基地,讓編譯器做出來:

swap(static_cast<Bar&>(a), static_cast<Bar&)(b));

0

您通常是這樣做的:

class Foo : public Bar 
{ 
    int _m1; 
    string _m2; 
    .../... 
public: 
    void swap(Foo &b) 
    { 
     using std::swap; 

     swap(_m1, b._m1); 
     swap(_m2, b._m2); 
     Bar::swap(b); 
    } 
    .../... 
}; 
+0

除了'Bar'沒有實現'Bar :: swap(Bar&b)'的情況。並查看我發佈的關於內部/外部方法的鏈接。 – gregseth

+0

好的,你的方法沒有被聲明爲靜態或朋友,所以它困惑了我,但我沒有閱讀鏈接,這是我的錯。 –