2009-04-26 9 views
1

Je développe une DLL C++ contenant trois classes: classe de base Base, Derived1 et classe Derived2. Le scénario:Instance de classe de base unique

class Base 
{ 
    //ctor, dtor, members and methods here 
} 

class Derived1 : public Base 
{ 
    //ctor, dtor, members and methods here 
} 

class Derived2 : public Base 
{ 
    //ctor, dtor, members and methods here 
} 

Le dll que je crée avec MS VC 2008 Express, que je veux utiliser sous TURBOC++ (borland: très bon ide/rad).

J'exporte Derived1 via la méthode facotry et, via le code client Derived1, crée des instances de Derived2. Les deux Derived1 et Derived2 partagent une fonction de pointeur contenue dans une autre DLL, donc j'ai mis cette fonction de pointeur sous la classe de base.

Voici le problème. Une fois que je crée une instance (par l'usine) de Derived1 et qu'il peut créer plusieurs instances de Derived2, le constructeur de classe Base est appelé plusieurs fois (1 pour Derived1 et plusieurs fois pour Derived2).

Comment puis-je empêcher plusieurs entrées de Base?

Une autre question:

Avec le scénario que je décrit plus haut, Derived1 appeler plusieurs intances de Derived2 et à la fois Derived1 et Derived2 étend la classe unique base commune. Je demande: C'est un mauvais design? Existe-t-il une autre conception des classes et de leur hiérarchie d'héritage mieux que ce que j'ai utilisé?

Répondre

1

Vous ne pouvez pas empêcher plusieurs instances de Base. Vous pouvez empêcher plusieurs instances du pointeur - rendre statique:

class Base { 
    public: 
     // save first pointer I get passed 
     Base(sometype * p) { 
      if (myptr == 0) { 
       myptr = p; 
      } 
     } 

    private: 

     static sometype * myptr; 
}; 

Dans un fichier source C++, vous devez définir myptr:

sometype * Base::myptr = 0; 
+0

Comme tous les cas de dérivés * est à la base :: Base() ctor une instance de Base, vous ne pouvez pas vraiment empêcher plusieurs instances de Base, car vous en avez absolument besoin. Neil a absolument raison de faire de la fonctionPtr static pour résoudre votre problème. – AndreasT

Questions connexes