Russian Qt Forum
Ноябрь 24, 2024, 22:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Непонятная ошибка undefined reference to  (Прочитано 30537 раз)
Alex_C
Гость
« Ответ #30 : Июнь 15, 2012, 15:04 »

В общем на основе
http://blog.ufna.ru/2010/04/24/singleton-for-qt
сделал свой шаблон синглтона. На мой взгляд более простой в использовании.

Код
C++ (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: uSingleton
// 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 uSingleton
{
public:
 
   // the singleton must be constructed with a reference to the controlled object
   //----------------------------------------------------------------------
   uSingleton(T& rObject)
   {
       Q_ASSERT_X(!s_pInstance, "constructor", "Only one instance of this class is permitted.");
       s_pInstance = &rObject;
   }
 
   // the singleton accessor
   //----------------------------------------------------------------------
   ~uSingleton()
   {
       Q_ASSERT_X(s_pInstance, "destructor", "The singleton instance is invalid.");
       s_pInstance = 0;
   }
 
   // the singleton accessor
   //----------------------------------------------------------------------
   static T& instance()
   {
       if(!s_pInstance)
           s_pInstance = new T();
       Q_ASSERT_X(s_pInstance, "instancing", "The singleton has not yet been created.");
       return (*s_pInstance);
   }
 
   // delete singleton
   static void deleteSingleton()
   {
       if(s_pInstance)
       {
           delete s_pInstance;
           s_pInstance = 0;
       }
   }
 
private:
   // Data...
   //----------------------------------------------------------------------
   static T* s_pInstance;
 
   // Nonexistant Functions...
   //----------------------------------------------------------------------
   uSingleton(const uSingleton& Src);
   uSingleton& operator=(const uSingleton& Src);
 
};
template <class T> T* uSingleton<T>::s_pInstance = 0;
 
#endif // A_SINGLETON_H
 

Теперь его действительно можно использовать просто

Код:
MY_CLASS.testFunc();

как и указано в ссылке.
Ф-ция static void deleteSingleton() нужна для удаления синглтона.

P.S. А какую кнопочку нажать, чтоб ком у меня в сообщениях выделялся цветами? Улыбающийся
« Последнее редактирование: Июнь 15, 2012, 15:19 от Alex_C » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #31 : Июнь 15, 2012, 15:12 »

code=cpp
Записан
Alex_C
Гость
« Ответ #32 : Июнь 15, 2012, 15:19 »

code=cpp

Спасибо большое!
Записан
andrew.k
Гость
« Ответ #33 : Июнь 15, 2012, 16:19 »

code=cpp

Спасибо большое!
А сама кнопочка - это комбобокс под конопочками жирностью/курсивом, там можно выбрать язык расцветки.
Записан
Alex_C
Гость
« Ответ #34 : Июнь 15, 2012, 20:54 »

А сама кнопочка - это комбобокс под конопочками жирностью/курсивом, там можно выбрать язык расцветки.

Вот тут пожалуйста по подробнее - я этот комбобокс конечно видел - меня и удивляло, что ничего не подсвечивается Улыбающийся
Вот сейчас пишу - у меня там написано "C++ (Qt)" - а если нажимаешь на кнопку "Код" - все серым вставляется.
Вот когда ручками дописываешь code=cpp - все ок! Что я не так делаю?
Записан
andrew.k
Гость
« Ответ #35 : Июнь 15, 2012, 22:56 »

А сама кнопочка - это комбобокс под конопочками жирностью/курсивом, там можно выбрать язык расцветки.

Вот тут пожалуйста по подробнее - я этот комбобокс конечно видел - меня и удивляло, что ничего не подсвечивается Улыбающийся
Вот сейчас пишу - у меня там написано "C++ (Qt)" - а если нажимаешь на кнопку "Код" - все серым вставляется.
Вот когда ручками дописываешь code=cpp - все ок! Что я не так делаю?
Я затрудняюсь ответить, что ты делаешь не так)
Выбери в этом списке любой элемент, кроме первого (он почему-то называется С++ Qt, хотя имеет значение "ничего не выбрано") и вставится нужный тег.
Действующий С++ Qt находится ниже.
Записан
Alex_C
Гость
« Ответ #36 : Июнь 16, 2012, 14:53 »

Выбери в этом списке любой элемент, кроме первого (он почему-то называется С++ Qt, хотя имеет значение "ничего не выбрано") и вставится нужный тег.
Действующий С++ Qt находится ниже.

Спасибо! Действительно,  смущает, что первый элемент как бы С++ Qt . Вот по этому и не получалось. Еще раз спасибо!
Записан
twp
Гость
« Ответ #37 : Июнь 18, 2012, 14:13 »

В общем на основе
http://blog.ufna.ru/2010/04/24/singleton-for-qt
сделал свой шаблон синглтона. На мой взгляд более простой в использовании.


Вместо
Код
C++ (Qt)
static T* s_pInstance;
 
лучше использовать QScopedPointer т.е.
Код
C++ (Qt)
static QScopedPointer<T> s_pInstance;
...
template <class T>
QScopedPointer<T> uSingleton<T>::s_pInstance;
 
Тогда deleteSingleton() в принципе не нужен, поскольку QScopedPointer будет автоматически удалять указатель при закрытии приложения.
Записан
andrew.k
Гость
« Ответ #38 : Июнь 18, 2012, 18:49 »

В общем на основе
http://blog.ufna.ru/2010/04/24/singleton-for-qt
сделал свой шаблон синглтона. На мой взгляд более простой в использовании.


Вместо
Код
C++ (Qt)
static T* s_pInstance;
 
лучше использовать QScopedPointer т.е.
Код
C++ (Qt)
static QScopedPointer<T> s_pInstance;
...
template <class T>
QScopedPointer<T> uSingleton<T>::s_pInstance;
 
Тогда deleteSingleton() в принципе не нужен, поскольку QScopedPointer будет автоматически удалять указатель при закрытии приложения.
А почему нельзя просто static SingletonClass pInstance;
Зачем создавать динамически, а потом думать, как удалить?
Записан
Alex_C
Гость
« Ответ #39 : Июнь 19, 2012, 11:00 »

Тогда deleteSingleton() в принципе не нужен, поскольку QScopedPointer будет автоматически удалять указатель при закрытии приложения.

Да спасибо! Отличная идея!
Записан
Alex_C
Гость
« Ответ #40 : Июнь 19, 2012, 11:03 »

А почему нельзя просто static SingletonClass pInstance;
Зачем создавать динамически, а потом думать, как удалить?

Может я чего не правильно сделал, но при этом у меня не происходило вызова конструктора.
Записан
andrew.k
Гость
« Ответ #41 : Июнь 19, 2012, 12:02 »

А почему нельзя просто static SingletonClass pInstance;
Зачем создавать динамически, а потом думать, как удалить?

Может я чего не правильно сделал, но при этом у меня не происходило вызова конструктора.
Это невозможно.
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.222 секунд. Запросов: 23.