Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 00:52   #1
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию Реализация паттерна Singleton в случае наследование

Доброго времени суток.
Хотел узнать какой есть хороший способ реализовать паттерн Singleton но в случае когда у меня в иерархии классов наследование.

Нашел один способ: http://sourcemaking.com/design_patterns/singleton/cpp/2
Но он требует изменять основной класс. Может у кого то есть какая нибудь другая идея?
newkobra вне форума Ответить с цитированием
Старый 04.11.2011, 00:58   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

По ссылке - какой-то гибрид одиночки и фабрики.
Просто одиночка наследуется, если хотя бы один конструктор protected.

Какую логику Вы пытаетесь воплотить?
Abstraction вне форума Ответить с цитированием
Старый 04.11.2011, 05:03   #3
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

Примерно следующую:
Класс A - основной. B, C, D... дочерние. В системе только один из них может существовать(но один можна удалить и на его место поставить другой). Хотелось б чтоб B::getInstance(), C::getInstance(), D::getInstance() возвращали екземпляр своего класса(само собой если он подходящего типа), а A::getInstance() возвращал екземпляр класса A
newkobra вне форума Ответить с цитированием
Старый 04.11.2011, 23:11   #4
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

Так что нет идей?
newkobra вне форума Ответить с цитированием
Старый 05.11.2011, 09:47   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Хотите на классы возложить лишнюю логику. Это неправильно. Я бы вообще не рассматривать синглтоны, а ввёл некий класс Manager для управления всем этим делом.
pu4koff вне форума Ответить с цитированием
Старый 05.11.2011, 15:31   #6
newkobra
Пользователь
 
Регистрация: 29.04.2009
Сообщений: 33
По умолчанию

Возможно б так и лучше, но проблема в том что уже большая часть приложения написана с использованием Singleton. Потом появилась необходимость ввести еще один подобний класс. Тепер уже третий, и всегда может существовать только один из них. Но иза похожей функциональности проходиться плодить много лишних класов, именно поетому решил ввести наследование.

Тепер о реализации. После долгих експериментов удалось добиться желаемого еффекта, хотя в одном месте все таки есть критический участок.

Код:
class A
{
protected:
  A(){}
  static A* instance;
public:
  static A* getInstance(){
    return instance;
  }
}

class B : public A
{
protected:
  B() : A(){}
public:
  static B* getInstance(){
    if(instance==NULL)
      instance = new B();
    return dynamic_cast<B*>(instance);
  }
}
Надеюсь что когда писал но ошибка не закралась.
Есть два минуса:
1. Можна сделать A::getInstance() когда не создан раньше екземпляр.
2. Если создан екземпляр класса B, то C::getInstance() тоже приведет к ошибке.
newkobra вне форума Ответить с цитированием
Старый 05.11.2011, 22:30   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

В итоге получаем совсем и не синглтон из-за первого минуса. И кучу дублирования кода из-за реализации getInstance в наследниках.
По поводу второго минуса:
Код:
  static B* getInstance(){
    B* result = dynamic_cast<B*>(instance);
    if(result == NULL) // Не создано ничего или создан объект другого типа (если нужны наследники В, то проблема всплывёт)
    {
      result = new B(); // Создаем новый объект нужного типа

      if (instance != NULL) // Если был таки создан объект другого типа
      {
        delete instance; // Удаляем его, дабы утечки памяти не плодить
      }
      instance = result; // Записываем свежесозданный объект в А, чтобы не потерялся
    }
    return result;
  }
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как авторизоваться в таком случае? grafgrial Общие вопросы Delphi 2 19.09.2011 21:38
Условное форматирование в случае #Н/Д и #ЗНАЧЕН alexsampler Microsoft Office Excel 3 16.09.2011 16:27
Паттерн Singleton против функционального подхода FiloXSee Общие вопросы по программированию, компьютерный форум 11 31.07.2011 18:13
Singleton Selestis Общие вопросы Delphi 5 05.06.2011 13:38
паттерн singleton zhenya.ya Общие вопросы C/C++ 1 26.11.2010 03:11