[C++] Написать Singleton
A& getSingleton
{
static A a;
return a;
}
class Singleton
{
private:
static Singleton * _instance;
Singleton;
public:
static Singleton * Instance { return _instance ? _instance : _instance = new Singleton; }
};
инициализируешь _instance нулем в .cpp:
Singleton * Singleton::_instance = 0;
class Singleton
{
static Singleton* instance(NULL);
Singleton* GetInstance
{
if (instance==NULL)
{
instance=new Singleton;
}
return instance;
}
};

GetInstance должен быть вообще тоже static.
static Singleton* instance(NULL)

хз
bla blablabla
{
static Singleton* instance = 0;
}
А как тогда узнать, есть ли объект, если нельзя указатель инициализировать NULL?
в классе нельзя.
Singleton * Singleton::_instance = 0;
(как будто это просто глобальная переменная)
А вообще советую почитать Андрея Александреску Modern C++ Design. Очень полезная книга.
как инициализировать статические члены класса?
в моем первом посте тоже написано

Всем спасибо.

.....
Singleton* Singleton::getInstance
{
static Singleton* i = 0;
if ( !i )
i = new Singleton;
return i;
}
почему нужно-то? =)

соб-сно, если объект класса будет только один, почему бы в классе и не держать на него указатель?
вот.

хз
полностью солидарен с мадкрозом!
В этом случае упрощается использование таких объявлений, т.к. при этом можно включать данное объявление произвольное число раз (от 0 до бесконечности).
При объявление static переменной в виде члена класса - приходится постоянно контролировать, чтобы мы переменные проинициализировали ровно один раз (не забыли вообще ее объявить, и не объявили ее два раза)
и что-то типа synchronized на getInstance

можешь полный код привести?
Singleton* Singleton::getInstance
{
static Singleton* i = 0;
if ( !i )
i = new Singleton;
return i;
}
Это не всегда обязательно.
Кстати, предыдущее сообщения я не тебе писал

Ну и что из того что ты не мне писал? Тебе интересен ответ на вопрос или кто тебе ответит?
Кстати, синглетон может быть инкапсулирован в другой библиотечке и быть нивидим на уровне функции main (или ее аналога). В то же время для глобальных объектов может автоматически вызываться деструктор, а ты эту возможность игнорируешь...
Еще такой момент: получается, что синглетон может быть запросто удален в любом месте... тоже нехорошо, после такого удаления с ним уже не поработаешь.
2. Я хотел услышать вариант ответа от конкретного человека

а) lib_init lib_done - обычно во многих либах есть такое
б) Не игнорирую. Хотя и несколько по другому. Вот мой первый вариант в этом треде:
A& getSingleton
{
static A a;
return a;
}
2. Если не секрет, то почему именно от конкретного человека? Просто мне это кажется несколько странным

б) Вообще-то "синглтон" - это класс у которого может быть только 1 объект. То что ты написал не подходит по определению
static MySingleton* GetSingleton
{
static MySingleton * singleton = new MySingleton;
return singleton;
}
С управляемой инициализацией:
static MySingleton * GetSingleton
{
static MySingleton * singleton = 0;
if (singleton == 0)
{
InitЧто-тоВажное;
singleton = CreateSingleton;
}
return singleton;
}
внешнее управление инициализацией и удалением
public: static void Init
{
getStorage = new MySingleton;
}
public: static void Done
{
getStorage = 0;
}
public: static MySingleton * GetSingleton
{
return getStorage;
}
protected: static MySingleton* & getStorage
{
static MySingleton * singleton = 0;
return singleton;
}
A& f
{
static A a;
return a;
}
Во-первых, объект будет создан при первом вызове f, это помогает (хотя и не всегда) избежать "гонок" при инициализации. В этом смысле static член класса хуже.
Во-вторых, объект будет (автоматически) удален, если был создан. В этом смысле вариант с new хуже.
Ну когда нужно, в конце программы пишешь delete
А где, простите, конец программы?

SingletonKiller - должен быть отдельным классом
Юзал все это на работе в одном проекте и только сейчас узнал, что называется синглтон. Реализацию придумал сам.

Удалять можно в деструкторе, используя подсчет ссылок на объект.
стандартный AddRef, Release.
Оставить комментарий
Sanjaz
Как написать сабж?