LINUX.ORG.RU

Singleton в качестве родителя (С++)


0

0

Помогите хорошим советом .
Есть класс , нужно чтоб был синглетом и чтоб имел чисто
виртуальные функции.
Как поступить ?И на йух сесть и рыбку съесть (с) Русская народная.

Не охота синглетовское поведение реализовать в каждом потомке,
с другой стороны без виртуальных функций не обойтись , ну и класс
должен быть абстрактным , обязательно .
Какие мысли ?

★★★

Ответ на: комментарий от krum

темплейты нельзя , наследую от QObject (Qt)

kitov ★★★
() автор топика
Ответ на: комментарий от Legioner

>А в чём проблема то?

>static MyClass& instance();

Внутри instance мне прийдётся вызывать конструктор класса ,
что невозможно , ибо абстрактный .

kitov ★★★
() автор топика
Ответ на: комментарий от krum

>Написать темплейт Singleton<class T>, и в нём реализовать синглтоновское >поведение.

Хотя нет , это решение подходящее .

kitov ★★★
() автор топика

> Внутри instance мне прийдётся вызывать конструктор класса , 
> что невозможно , ибо абстрактный . 

тебе надо вызывать конструктор класса-наследника, 
который будет реализовывать абстрактные методы.

Вот смотри:

==header==
class MyAbstractSingletone {
public:
  virtual void foo() = 0;
  
  static MyAbstractSingletone& instance();
};

==source==
class MySingletone1 : public MyAbstractSingletone {
  void foo() { std::for_each(people.begin(), people.end(), kill); }
};

class MySingletone2 : public MyAbstractSingletone {
  void foo() { delete world; world = NULL; }
};

MyAbstractSingletone& MyAbstractSingletone::instance()
{
  static MyAbstractSingletone* s;
  if (s == NULL) {
    s = moon.phase() == 0 ? new MySingletone1 : new MySingletone2;
  }
  return *s;
}

Legioner ★★★★★
()
Ответ на: комментарий от kitov

Можно сделать в синглетоне list(или map<критерий, instance>) указателей на instance-функции потомков. Потомки сами записываются в этот лист(регаются).

YesSSS ★★★
()

Это неправильная постановка вопроса. Если некоторый класс A является базовым для других (B, C), то экземпляры классов B и C будут являться также и экземплярами класса A (являться в смысле is-a-критерия. Если этот критерий не выполняется, то и наследование применять не нужно). Но тогда A не может быть синглетоном.

Если нужна иерархия классов, в которой производные классы являлись бы синглетонами, - придется реализовать поведение синглетона для каждого потомка. Например, так:

template<typename T>
T* GetInstance()
{
    static T* p=0;
    if(!p)
        p=new T;
    return p;
}

class SingletonA
{
public:
    // здесь функциональность
private:
    SingletonA(); // конструктор закрытый, чтобы его не создавал кто попало
    // но при этом:
    friend SingletonA* GetInstance<SingletonA>();
};

anonymous
()

Книгу Александреску "Современное проектирование на С++" вам в помощь. (Hint: погуглите по топику "SingletonHolder C++")

Sectoid ★★★★★
()
Ответ на: комментарий от anonymous

> Это неправильная постановка вопроса. Если некоторый класс A является базовым для других (B, C), то экземпляры классов B и C будут являться также и экземплярами класса A (являться в смысле is-a-критерия. Если этот критерий не выполняется, то и наследование применять не нужно). Но тогда A не может быть синглетоном.

+1. Безотносительно плюсов - концептуально эта задача неразрешима в рамках известных мне ОО языков. Либо надо создать функцию GetInstance, которая создает (или просто возращает) экземпляры всех существующих дочерных классов (в зависимости от входных условий). Либо каждый дочерний класс должен иметь собственную реализацию GetInstance - но тогда вызывающий должен четко знать, кого именно он хочет создать.

ЗЫ В случае единой GetInstance теоретически можно воспользоваться рефлексией и делать всякие смешные штуки - но это уже не к плюсам.

svu ★★★★★
()
Ответ на: комментарий от Sectoid

>Книгу Александреску "Современное проектирование на С++" вам в помощь. (Hint: >погуглите по топику "SingletonHolder C++")

Спасибо за совет.
Книгу заказал , правда ждать долго , пока до Германии дойдёт .

kitov ★★★
() автор топика
Ответ на: комментарий от svu

Действительно неразрешимая задача ,
придётся релизировать синглет
в каждом производном классе .

kitov ★★★
() автор топика
Ответ на: комментарий от kitov

релизировать/реализовать :-)

kitov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.