Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Singletone и qt
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
maxvanceffer
Ребято кто подскажет как правильно реализовать паттерн сишлтон в кт ? Потому что пыталься разными способами из гугла и все выводили разного рода ошбики или ещё что то ...
Подскажите может в кт есть в классе глобал что то или в какую сторону копать ссылки , спс!
rnd
сообс-но qt и сингелтон - это ортогональыне понятия, т.е. никак не связаны. Есть несколько основных способов реализации (подробнее в книгах Майерса, Александреску и Уилсона). А вообще сингелтон - довольно опасный паттерн, у которого есть нетривиальные моменты. Если есть возможность - лучше обойтись не глобальным доступом к объекту, а передачей указателя во все необходимый функции.
Если сингелтонов несколько - установить явный порядок создания\уничтожения.
maxvanceffer
Да я понемаю его опасность. Но задача такова что есть много классов окан где нужна информация из этого синглтона. То есть класс синглтон в моей программе это класс данных.
Тут мне он и нужен. Чтобы эта инфа была видна во всех классах. И все классы знали что и где лежит.
Почему я прикрутил к этому вопросу кт , это что у кт есть класс глобал, в котором много чего. И я о нём я знаю очень мало. Только то что пока использовал. И думал может в кт глобал есть что то подобное уже готовое !
ufna
Может быть, поможет. Я сам сделал вот так:

a_singleton.h
//-----------------------------------------------------------------------------
// 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


Соответсвенно, нужный класс создается:

myclass.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);
<...>



myclass.cpp

// cMyClass class constructor
//--------------------------------------------------------------------------------------
cMyClass::cMyClass(QObject *parent)
    : QObject(parent), cSingleton<cMyClass>(*this)
{
<...>



Соответственно, доступ по MY_CLASS_OBJECT.
maxvanceffer
Ух как закрученно у тебя )))
maxvanceffer
Так ребята сделал по книжке Э.Гамма ,Р.Хелм, Р.Джонсон и есть ощибка от компилятора :

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;

Вот что это и где ето нужно обьевлять ?
Litkevich Yuriy
ufna, а почему ты конструктор класса ни в шаблоннном классе ни в наследнике не прячешь?
Одна из особенностей одиночек - недоступность трёх членов:
конструктор, конструктор копирования, оператор присваивания.
BRE
Цитата(maxvanceffer @ 27.9.2009, 17:58) *
Но я заметил одну вещь которую я возможно не понял и не сделал это во всех примерах есть такая вешь как :
Singleton* Singletone::_instance = 0;

Вот что это и где ето нужно обьевлять ?

Это нужно писать в файле реализации. Это определение самой статической переменной.

Цитата(Litkevich Yuriy @ 27.9.2009, 18:00) *
ufna, а почему ты конструктор класса ни в шаблоннном классе ни в наследнике не прячешь?
Одна из особенностей одиночек - недоступность трёх членов:
конструктор, конструктор копирования, оператор присваивания.

Да это не совсем singleton и его по другому не создать.

ufna
когда этот класс делал, о синглетонах не знал. Потому сделал то, что мне было нужно - т.е. простой доступ к единому инстансу класса, причем если вдруг создаю где-то еще такое, то узнаю точно.
Litkevich Yuriy
Обновил старую тему (выложил свой вариант)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.