crossplatform.ru

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


  Ответ в Singletone и qt
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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

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

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

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

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

Litkevich Yuriy Дата 27.9.2009, 17:00
  ufna, а почему ты конструктор класса ни в шаблоннном классе ни в наследнике не прячешь?
Одна из особенностей одиночек - недоступность трёх членов:
конструктор, конструктор копирования, оператор присваивания.
maxvanceffer Дата 27.9.2009, 16:58
  Так ребята сделал по книжке Э.Гамма ,Р.Хелм, Р.Джонсон и есть ощибка от компилятора :

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;

Вот что это и где ето нужно обьевлять ?
maxvanceffer Дата 27.9.2009, 15:37
  Ух как закрученно у тебя )))
ufna Дата 27.9.2009, 15:11
  Может быть, поможет. Я сам сделал вот так:

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 Дата 27.9.2009, 14:44
  Да я понемаю его опасность. Но задача такова что есть много классов окан где нужна информация из этого синглтона. То есть класс синглтон в моей программе это класс данных.
Тут мне он и нужен. Чтобы эта инфа была видна во всех классах. И все классы знали что и где лежит.
Почему я прикрутил к этому вопросу кт , это что у кт есть класс глобал, в котором много чего. И я о нём я знаю очень мало. Только то что пока использовал. И думал может в кт глобал есть что то подобное уже готовое !
rnd Дата 27.9.2009, 10:11
  сообс-но qt и сингелтон - это ортогональыне понятия, т.е. никак не связаны. Есть несколько основных способов реализации (подробнее в книгах Майерса, Александреску и Уилсона). А вообще сингелтон - довольно опасный паттерн, у которого есть нетривиальные моменты. Если есть возможность - лучше обойтись не глобальным доступом к объекту, а передачей указателя во все необходимый функции.
Если сингелтонов несколько - установить явный порядок создания\уничтожения.
ViGOur Дата 27.9.2009, 1:20
  Глянь тему: Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи.
Или просто поиск: Singleton
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 18.4.2024, 21:43