forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   СИНГЛТОНЫ (http://forum.boolean.name/showthread.php?t=8978)

Mr_F_ 23.08.2009 00:04

СИНГЛТОНЫ
 
Да что за %&^18#*! На кой :?№* такие извращения? Почему незя нормально юзать глоб переменные в раздельной компиляции?

в общем,

я взял с википедии такую штуку:

template<typename T> class Singleton
{

public:
static T& Instance()
{
static T theSingleInstance; // у класса T есть конструктор по умолчанию
return theSingleInstance;
}
};


потом допустим юзаю так:

class Render:public Singleton<Render> {
public:
void BlahBlahBlah();
};

но когда я пишу так:

Render::Instance() ТО хренов MSVC++ ни фига не одобряет добавление '->' хотя по идее инстанс должен вовзращать указатель (разве нет?)

если не сложно, накатайте кто-нибудь простейший пример юзанья синглтона, на геймдеве нашёл ссылку токо на жыыырный код.

Horror 23.08.2009 00:47

Ответ: СИНГЛТОНЫ
 
я тож новичек в си
но мне что подсказывает что указаетель это *
static T* Instance()
а асперсант это ссылка вроде)
и соответсвенно
Код:

static T* Instance()
{
  static T theSingleInstance; // у класса T есть конструктор по умолчанию
  return &theSingleInstance;
} так чтоли (

и так должно по стрелке!
и вообще както не читабельно код офрмлен)

и я не уверен что статик делает глобыльным?
вроде extern, а статик внутри модуля

jimon 23.08.2009 12:03

Ответ: СИНГЛТОНЫ
 
вот довольно качественное решение :
1) в хидере где нужен доступ к синглтону пишем
Код:

EXPORT_TYPE my_type * EXPORT_CALL GetMyType();
EXPORT_TYPE void EXPORT_CALL CreateSingletonMyType();

2) в реализации пишем такое :
Код:

my_type * _self_my_type = NULL;
my_type * EXPORT_CALL GetMyType()
{
return _self_my_type;
}
void EXPORT_CALL CreateSingletonMyType()
{
_self_my_type = new my_type;
}
void SetMyType(my_type * _self)
{
if (_self_my_type && ( _self != NULL))
{
FATAL_ERROR
}
else
_self_my_type = _self;
}


my_type::my_type()
{
SetMyType(this);
...
}

my_type::~my_type()
{
SetMyType(NULL);
}

3) в функции инициализации библиотеки просто вызываем CreateSingletonMyType, а потом просто удалям нужный нам класс и всё
в принципе CreateSingletonMyType можно и не выносить на обозрение

ps. всё это делается через макросы

alcoSHoLiK 23.08.2009 23:34

Ответ: СИНГЛТОНЫ
 
Автор, метод instance() возвращает ссылку. Используй вместо стрелки (->) точку (.).

Mr_F_ 23.08.2009 23:57

Ответ: СИНГЛТОНЫ
 
да, все уже разобрался :-D

слово "синглтон" испугало меня и не дало увидеть суть :-D


Часовой пояс GMT +4, время: 09:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot