2011-09-22 7 views
5

He leído interesting things sobre el modismo de copiar y cambiar. Mi pregunta es sobre la implementación del método swap al heredar de otra clase.idioma de copiar y cambiar, con herencia

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

Respuesta

9

Se podría intercambiar los subobjetos:

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

puede que tenga que poner en práctica el función de intercambio para Bar, si std::swap no hace el trabajo. También tenga en cuenta que swap debe ser un no miembro (y un amigo si es necesario).

+0

Ok, gracias, probé el elenco, pero solía 'bar' sean en lugar de' 'Bar & ... – gregseth

+0

Para evitar la fundición, que puede hacer "Bar & a_bar = a, & b_bar = b; swap (a_bar, b_bar);" –

2

Sólo echarlo hasta la base y dejar que el compilador a cabo:

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

0

Normalmente estaría haciendo de esta manera:

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

Excepto en el caso en que 'Bar' no implementa un' Bar :: swap (Bar & b) '. Y vea el enlace que publiqué sobre el método interno/externo. – gregseth

+0

Ok, su método no fue declarado estático o amigo, por lo que me confundió, pero no leí el enlace, por lo que es mi culpa. –

Cuestiones relacionadas