2009-04-26 7 views
1

Я разрабатываю dll C++, который содержит три класса: скажем, базовый класс Base, Derived1 и Derived2 класс. Сценарий:Уникальный экземпляр базового класса

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 
} 

DLL, я создаю с MS VC++ 2008 Express, что я хочу использовать под TurboC++ (Борланд: очень хороший язь/рад).

Я экспортирую Derived1 через фактографический метод и по коду клиента Derived1 делает экземпляры Derived2. Оба Derived1 и Derived2 совместно используют функцию указателя, содержащуюся в другой DLL, поэтому я помещаю эту функцию указателя в класс Base.

В этом проблема. Однажды я создаю один экземпляр (по умолчанию) и он может создавать несколько экземпляров Derived2, конструктор класса Base называется еще раз (1 для Derived1 и несколько раз для Derived2).

Как предотвратить множественные инстанции базы?

Еще один вопрос:

С сценарии я описал ранее, Derived1 вызов нескольких intances из Derived2 и как Derived1 и Derived2 расширяет уникальный общий базовый класс. Я спрашиваю: плохой дизайн? Есть ли другой дизайн классов и их иерархия наследования лучше, чем я использовал?

ответ

1

Вы не можете предотвратить несколько экземпляров базы. Вы можете предотвратить появление нескольких экземпляров указателя - сделать его статическим:

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

    private: 

     static sometype * myptr; 
}; 

В исходном файле C++ вам нужно будет определить myptr:

sometype * Base::myptr = 0; 
+0

Поскольку каждый экземпляр Derived * является Базе :: Base() ctor - экземпляр Base, вы не можете действительно предотвратить несколько экземпляров Base, потому что они вам абсолютно нужны. Нейл абсолютно прав о том, чтобы сделать staticProt static, чтобы решить вашу проблему. – AndreasT