6 votes

idiome "copy-and-swap", avec héritage

Je lis choses intéressantes sur l'idiome "copier et échanger". Ma question concerne l'implémentation de la swap lorsqu'il hérite d'une autre classe.

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

11voto

Mike Seymour Points 130519

Vous échangeriez les sous-objets :

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

Vous pouvez avoir besoin d'implémenter la fonction swap pour Bar , si std::swap ne fait pas l'affaire. Notez également que swap doit être un non-membre (et un ami si nécessaire).

2voto

Mark B Points 60200

Il suffit de l'intégrer à la base et de laisser le compilateur s'en occuper :

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

0voto

Vaughn Cato Points 30511

Vous le feriez typiquement comme ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X