Ребято кто подскажет как правильно реализовать паттерн сишлтон в кт ? Потому что пыталься разными способами из гугла и все выводили разного рода ошбики или ещё что то ...
Подскажите может в кт есть в классе глобал что то или в какую сторону копать ссылки , спс!
Глянь тему: http://www.forum.crossplatform.ru/index.php?showtopic=678&hl=singleton.
Или просто поиск: http://www.forum.crossplatform.ru/index.php?act=Search&CODE=show&searchid=b68477ab4a0994400299bc44b311f88e&search_in=posts&result_type=topics&highlite=%2Bsingleton
сообс-но qt и сингелтон - это ортогональыне понятия, т.е. никак не связаны. Есть несколько основных способов реализации (подробнее в книгах Майерса, Александреску и Уилсона). А вообще сингелтон - довольно опасный паттерн, у которого есть нетривиальные моменты. Если есть возможность - лучше обойтись не глобальным доступом к объекту, а передачей указателя во все необходимый функции.
Если сингелтонов несколько - установить явный порядок создания\уничтожения.
Да я понемаю его опасность. Но задача такова что есть много классов окан где нужна информация из этого синглтона. То есть класс синглтон в моей программе это класс данных.
Тут мне он и нужен. Чтобы эта инфа была видна во всех классах. И все классы знали что и где лежит.
Почему я прикрутил к этому вопросу кт , это что у кт есть класс глобал, в котором много чего. И я о нём я знаю очень мало. Только то что пока использовал. И думал может в кт глобал есть что то подобное уже готовое !
Может быть, поможет. Я сам сделал вот так:
//-----------------------------------------------------------------------------
// File: a_singleton.h
//
// Desc: An one-instance class
//-----------------------------------------------------------------------------
#ifndef A_SINGLETON_H
#define A_SINGLETON_H
#include <QtGlobal>
// disable the warning regarding 'this' pointers being used in
// base member initializer list. Singletons rely on this action
// #pragma warning(disable : 4355)
//--------------------------------------------------------------------------------------
// Name: cSingleton
// Desc: A singleton is a type of class of which only one instance may
// exist. This is commonly used for management classes used to
// control system-wide resources.
//--------------------------------------------------------------------------------------
template <class T>
class cSingleton
{
public:
// the singleton must be constructed with a reference to the controlled object
//--------------------------------------------------------------------------------------
cSingleton(T& rObject)
{
Q_ASSERT_X(!s_pInstance, "constructor", "Only one instance of this class is permitted.");
s_pInstance = &rObject;
}
// the singleton accessor
//--------------------------------------------------------------------------------------
~cSingleton()
{
Q_ASSERT_X(s_pInstance, "destructor", "The singleton instance is invalid.");
s_pInstance = 0;
}
// the singleton accessor
//--------------------------------------------------------------------------------------
static T& instance()
{
Q_ASSERT_X(s_pInstance, "instancing", "The singleton has not yet been created.");
return (*s_pInstance);
}
private:
// Data...
//--------------------------------------------------------------------------------------
static T* s_pInstance;
// Nonexistant Functions...
//--------------------------------------------------------------------------------------
cSingleton( const cSingleton& Src);
cSingleton& operator=( const cSingleton& Src);
};
template <class T> T* cSingleton<T>::s_pInstance = 0;
#endif // A_SINGLETON_H
<...>
#include "a_singleton.h"
// Defines for geting instance
class cMyClass;
#define MY_CLASS_OBJECT cMyClass::instance()
//--------------------------------------------------------------------------------------
// Name: cMyClass
// Desc: Simple example of singleton Qt-class
//--------------------------------------------------------------------------------------
class cMyClass :
public QObject, public cSingleton<cMyClass>
{
Q_OBJECT
public:
// Constructor & destructor
//----------------------------------------------------------------------------------
cMyClass(QObject *parent = 0);
<...>
// cMyClass class constructor
//--------------------------------------------------------------------------------------
cMyClass::cMyClass(QObject *parent)
: QObject(parent), cSingleton<cMyClass>(*this)
{
<...>
Ух как закрученно у тебя )))
Так ребята сделал по книжке Э.Гамма ,Р.Хелм, Р.Джонсон и есть ощибка от компилятора :
c:/Qt/2009.03/qt/include/QtCore/../../src/corelib/tools/qlist.h:(.text$_ZN4user8INSTANSEEv[user::INSTANSE:-1: error: undefined reference to
`user::instance'
Но я заметил одну вещь которую я возможно не понял и не сделал это во всех примерах есть такая вешь как :
Singleton* Singletone::_instance = 0;
Вот что это и где ето нужно обьевлять ?
ufna, а почему ты конструктор класса ни в шаблоннном классе ни в наследнике не прячешь?
Одна из особенностей одиночек - недоступность трёх членов:
конструктор, конструктор копирования, оператор присваивания.
когда этот класс делал, о синглетонах не знал. Потому сделал то, что мне было нужно - т.е. простой доступ к единому инстансу класса, причем если вдруг создаю где-то еще такое, то узнаю точно.
http://www.forum.crossplatform.ru/index.php?showtopic=678&view=findpost&p=24594 (выложил свой вариант)
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)