crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Singletone и qt, Знаю зло но помогите плиз
maxvanceffer
  опции профиля:
сообщение 27.9.2009, 0:07
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ребято кто подскажет как правильно реализовать паттерн сишлтон в кт ? Потому что пыталься разными способами из гугла и все выводили разного рода ошбики или ещё что то ...
Подскажите может в кт есть в классе глобал что то или в какую сторону копать ссылки , спс!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.9.2009, 1:20
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Глянь тему: Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи.
Или просто поиск: Singleton
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rnd
  опции профиля:
сообщение 27.9.2009, 10:11
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 54
Регистрация: 22.7.2009
Пользователь №: 930

Спасибо сказали: 1 раз(а)




Репутация:   0  


сообс-но qt и сингелтон - это ортогональыне понятия, т.е. никак не связаны. Есть несколько основных способов реализации (подробнее в книгах Майерса, Александреску и Уилсона). А вообще сингелтон - довольно опасный паттерн, у которого есть нетривиальные моменты. Если есть возможность - лучше обойтись не глобальным доступом к объекту, а передачей указателя во все необходимый функции.
Если сингелтонов несколько - установить явный порядок создания\уничтожения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 27.9.2009, 14:44
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

Спасибо сказали: 0 раз(а)




Репутация:   0  


Да я понемаю его опасность. Но задача такова что есть много классов окан где нужна информация из этого синглтона. То есть класс синглтон в моей программе это класс данных.
Тут мне он и нужен. Чтобы эта инфа была видна во всех классах. И все классы знали что и где лежит.
Почему я прикрутил к этому вопросу кт , это что у кт есть класс глобал, в котором много чего. И я о нём я знаю очень мало. Только то что пока использовал. И думал может в кт глобал есть что то подобное уже готовое !

Сообщение отредактировал maxvanceffer - 27.9.2009, 14:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 27.9.2009, 15:11
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


Может быть, поможет. Я сам сделал вот так:

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.

Сообщение отредактировал ufna - 27.9.2009, 15:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 27.9.2009, 15:37
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ух как закрученно у тебя )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maxvanceffer
  опции профиля:
сообщение 27.9.2009, 16:58
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 72
Регистрация: 30.5.2009
Из: Moldova
Пользователь №: 790

Спасибо сказали: 0 раз(а)




Репутация:   0  


Так ребята сделал по книжке Э.Гамма ,Р.Хелм, Р.Джонсон и есть ощибка от компилятора :

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
  опции профиля:
сообщение 27.9.2009, 17:00
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ufna, а почему ты конструктор класса ни в шаблоннном классе ни в наследнике не прячешь?
Одна из особенностей одиночек - недоступность трёх членов:
конструктор, конструктор копирования, оператор присваивания.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 27.9.2009, 17:44
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(maxvanceffer @ 27.9.2009, 17:58) *
Но я заметил одну вещь которую я возможно не понял и не сделал это во всех примерах есть такая вешь как :
Singleton* Singletone::_instance = 0;

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

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

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

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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 27.9.2009, 19:08
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

Спасибо сказали: 29 раз(а)




Репутация:   5  


когда этот класс делал, о синглетонах не знал. Потому сделал то, что мне было нужно - т.е. простой доступ к единому инстансу класса, причем если вдруг создаю где-то еще такое, то узнаю точно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 16:13