2011-01-27 2 views
3

J'ai converti certaines de mes classes de mathématiques en modèles et d'utiliser des listes d'initialisation, et je rencontre un problème lorsque la classe héritée doit accéder aux membres de la classe de base à l'initialisation.C++ Classes et listes d'initialisation héritées

Voici le code:

template <typename T> 
struct xCoord2 
{ 
    T x; 
    T y; 

    xCoord2(T _x, T _y) : x(_x), y(_y) {}; 
}; 

template <typename T> 
struct xCoord3 : xCoord2<T> 
{ 
    typedef xCoord2<T> B; 

    T z; 

    // All Error 
    xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {}; 
    xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {}; 

    // Works 
    xCoord3(T _x, T _y, T _z) { B::x = 0; B::y = 0; z = 0; }; 
}; 

Est-il possible d'utiliser des listes d'initialisation des classes héritées?

+1

Un 'xCoord3' est-il vraiment un' xCoord2'? Ou partagent-ils simplement certains membres de données? C'est un cas où l'héritage pourrait ne pas être une bonne idée s'il n'y a pas de relation is-a entre les deux classes. –

+0

L'exemple est seulement une partie de chaque classe, mais l'héritage est très utile ici, car il permet d'effectuer des calculs entre les deux types. –

Répondre

7

Vous devez appeler le constructeur de la classe de base:

xCoord3(T _x, T _y, T _z) : xCoord2(_x, _y), z(_z) { } 

Ce ne serait pas différent si ceux-ci étaient des classes sans modèle: vous ne pouvez initialiser les classes de base et les variables membres de la classe dérivée dans le constructeur de classe dérivée .

Questions connexes