2011-09-22 37 views
5

Tôi đã đọc interesting things về thành ngữ sao chép và hoán đổi. Câu hỏi của tôi là liên quan đến việc thực hiện phương thức swap khi kế thừa từ một lớp khác.thành ngữ sao chép và hoán đổi, với thừa kế

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 ??? 
    } 
    .../... 
}; 

Trả lời

9

Bạn sẽ trao đổi các subobjects:

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

Bạn có thể cần phải thực hiện chức năng hoán đổi cho Bar, nếu std::swap không thực hiện công việc. Cũng xin lưu ý rằng swap phải là người không phải là thành viên (và một người bạn nếu cần).

+0

Ok, cảm ơn, tôi đã cố gắng dàn diễn viên, nhưng tôi sử dụng 'Bar' thay vì 'Bar &' ... – gregseth

+0

Để tránh đúc, bạn có thể làm "Bar & a_bar = a, & b_bar = b; hoán đổi (a_bar, b_bar);" –

2

Chỉ cần quăng nó lên đến cơ sở và để cho các công việc biên dịch nó ra:

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

0

Bạn thường sẽ được làm việc đó như thế này:

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

Trừ trường hợp 'Bar' không thực hiện' Bar :: swap (Bar & b) '. Và xem liên kết tôi đã đăng về phương thức bên trong/bên ngoài. – gregseth

+0

Ok, phương pháp của bạn không được khai báo là tĩnh hoặc bạn bè, vì vậy nó làm tôi bối rối, nhưng tôi đã không đọc liên kết vì vậy đó là lỗi của tôi. –

Các vấn đề liên quan