Уникальный экземпляр базового класса - PullRequest
1 голос
/ 26 апреля 2009

Я разрабатываю C ++ dll, который содержит три класса: скажем, базовый класс 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 ++ (borland: очень хорошая идея / рад).

Я экспортирую Derived1 с помощью метода facotry, а с помощью клиентского кода Derived1 создает экземпляры Derived2. И Derived1, и Derived2 совместно используют функцию указателя, содержащуюся в другой dll, поэтому я поместил эту функцию указателя в Базовый класс.

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

Как я могу предотвратить множественные экземпляры Base?

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

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

1 Ответ

1 голос
/ 26 апреля 2009

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

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...