J'utilise l'héritage privé dans l'implémentation de deux classes très liées. Le using Base::X;
est très utile et élégant. Cependant, je n'arrive pas à trouver une solution élégante pour réutiliser la fonction d'échange de la classe de base.Héritage privé et échange
class A
{
public:
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;
A clone();
void swap(A& other);
};
class Const_A : private A
{
public:
// I think using A::A; will be valid in C++0x
Const_A(const A& copy) : A(copy) { }
// very elegant, concise, meaningful
using A::cbegin;
// I'd love to write using A::begin;, but I only want the const overload
// this is just forwarding to the const overload, still elegant
const_iterator begin() const
{ return A::begin(); }
// A little more work than just forwarding the function but still uber simple
Const_A clone()
{ return Const_A(A::clone()); }
// What should I do here?
void swap(Const_A& other)
{ /* ??? */ }
};
Jusqu'à présent, la seule chose que je peux trouver est copier-coller « la définition de Const_A::swap
dans » A::swap
définition s, beurk!
Existe-t-il une solution élégante pour réutiliser le swap de la classe de base privée?
Existe-t-il une façon plus simple d'implémenter ce que j'essaie de faire ici (un wrapper const pour une classe)?
Vouliez-vous dire à 'revenir iterator' (! Au lieu de' const_iterator') pour 'begin'? Sinon, je ne vois pas le sens d'avoir deux fonctions, et de surcharger la fonction dans votre classe dérivée. –
'std :: vector <> :: begin() -> itérateur' et' std :: vector <> :: begin() const -> const_iterator'. C'est exactement ce que j'ai fait et mes classes ont une sémantique similaire. Ai-je mal compris votre question? –
l'ai eu, vous avez raison. Mais à quoi sert la méthode 'cbegin'? –