2010-11-29 5 views
0

Je définis une classe qui a comme membres privés des pointeurs vers des classes modélisées. J'ai une question concernant la conception d'une telle classe. Plus précisément, si la classe externe doit être modélisée ou non. Depuis, j'initialise les membres privés dans le constructeur de la classe externe, je suppose, c'est correct de le faire. Y a-t-il d'autres alternatives? Un exemple de la déclaration de classe est donnée ci-dessous et toutes les suggestions sont les bienvenues:concevoir des classes de modèle imbriquées

#include <foo.h> 
#include <bar.h> 

template < class FOO_TYPE, class BAR_TYPE > 
class OuterClass{ 
    public: 

     OuterClass(){ 
      this->m_pFoo = new CFoo<FOO_TYPE>(); 
      this->m_pBar = new CBar<BAR_TYPE>(); 
      this->m_nMyInt = 0; 
     } 

     template < class FOO_TYPE > 
     CFoo<FOO_TYPE> * processFoo(); 

     template < class BAR_TYPE > 
     CBar<BAR_TYPE> * processBar(); 

     ~OuterClass(){ 
      delete this->m_pFoo; 
      delete this->m_pBar; 
     } 

    private: 
     int m_nMyInt; 
     CFoo<FOO_TYPE> * m_pFoo; 
     CBar<BAR_TYPE> * m_pBar; 
}; 

Répondre

1

Cela dépend de l'utilisation prévue de la classe externe. Votre code suggère que OuterClass peut être utilisé avec différents types de modèles, il est donc logique de l'avoir aussi comme modèle. En fait, ce type de transfert d'arguments est très courant.

Cependant, si vous voulez plutôt OuterClass d'utiliser uniquement des spécialisations de modèles spécifiques de CFoo et CBar, vous pouvez simplement indiquer le choix FOO_TYPE et BAR_TYPE dans la déclaration des membres correspondants.

1

Dans votre classe processFoo() et processBar() sont définis de manière incorrecte.

Ils ne sont pas des fonctions de modèle dans votre classe, ils sont spécifiquement typés à votre 1er et 2ème paramètre de modèle. CFOO et CBar semblent être des modèles externes. Votre classe échoue également la "règle de 3" en ce qui concerne copy-construction et assignation et n'est pas une exception sauf si le constructeur de CBar jette (dans ce cas votre constructeur lancera, votre destructeur ne sera jamais appelé et m_pFoo ne sera jamais supprimé).

+0

+1 pour "règle de 3", je ne peux pas croire que j'ai manqué cela. – Mephane

+0

en ce qui concerne 'processFoo' et' processBar', vous avez raison, cela ne devrait apparaître que si la classe externe n'est pas modélisée. De plus, je n'ai pas mis tout le code, mais vous avez raison, j'ai besoin du constructeur de copie et de la méthode d'affectation. – Javier

Questions connexes