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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Непонятная ошибка undefined reference to  (Прочитано 30571 раз)
alexis031182
Гость
« Ответ #15 : Май 28, 2012, 19:18 »

Удаляется так:
delete FlagObject::instance;
в "основном" классе)))
Не удобно
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #16 : Май 28, 2012, 22:21 »

Тоже может быть не удобно и противоречит паттерну "одиночка", но сейчас делаю так:
.h
Код
C++ (Qt)
class Example : public QObject
{
   Q_OBJECT
public:
   explicit Example(QObject *parent = 0);
   static Example* instanse();
   //...
 
private:
   static Example* _instanse;
   //...
};

.cpp
Код
C++ (Qt)
Example* Example::_instanse = 0;
 
Example::Example(QObject *parent) :
   QObject(parent)
{
   if (!_instanse)
       _instanse = this;
   //...
}
 
Example *Example::instanse()
{
   return _instanse;
}

в основном классе в конструкторе создаем единственный экземпляр класса:
Код
C++ (Qt)
   new Example(this);

и в любом месте программы для получения указателя на наш класс:
Код
C++ (Qt)
   Example* ex = Example::instanse();
При уничтожении основного класса корректно уничтожается и наш "одиночка".
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Alex_C
Гость
« Ответ #17 : Май 28, 2012, 23:14 »

Вы наверное не до конца понимаете принцип патерна-одиночки - иначе зачем "единственный экземпляр класса"? Все нормально - не надо следовать моде - создавать никому не нужные, но "правильные" паттерны. Я думаю тут паттерн не нужен.
Записан
alexis031182
Гость
« Ответ #18 : Май 28, 2012, 23:34 »

Вот пример синглтона (Майерса) из вики:
Код:
class OnlyOne
{
public:
   static OnlyOne &Instance() {
      static OnlyOne theSingleInstance;
      return theSingleInstance;
   }

private:       
   OnlyOne() {}
   OnlyOne(const OnlyOne&);
   OnlyOne &operator=(const OnlyOne&);
};
Что мне здесь нравится:
- единственный объект класса создаётся статически - нет нужды заботиться о его удалении;
- доступ к объекту класса можно получить лишь в одной точке, функции - Instance();
- конструктор, конструктор копирования и оператор присваивания объявлены как private, что исключает создание и манипуляции с копиями единственного объекта класса во вне;
- конструктор копирования и оператор присваивания не имеют определения - имеем error от компилятора при попытке использования изнутри;
Записан
andrew.k
Гость
« Ответ #19 : Май 29, 2012, 02:59 »

Если оставить его публичным смысла в функции getInstance

Удалять как тогда? Кстати идея то совсем не моя - в инете есть весьма хорошая статья по поводу использования сингл-паттерна.
Видимо ты ее не прочитал.
Записан
sidsukana
Гость
« Ответ #20 : Май 29, 2012, 06:07 »

Если это класс Q_OBJECT то можно объявить вместо тех 3 строчек макрос Q_DISABLE_COPY(MyClass).
Записан
alexis031182
Гость
« Ответ #21 : Май 29, 2012, 07:29 »

Если это класс Q_OBJECT то можно объявить вместо тех 3 строчек макрос Q_DISABLE_COPY(MyClass).
Вместо двух
Записан
Alex_C
Гость
« Ответ #22 : Июнь 14, 2012, 15:00 »

Видимо ты ее не прочитал.

Еще раз хочу поднять тему про паттерн-одиночка.

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

Для меня получается правильный вариант, предложенный Kurles. Однако пока не понятен вопрос - как правильно удалить теперь паттерн с вызовом его деструктора при завершении работы программы?
Записан
mutineer
Гость
« Ответ #23 : Июнь 14, 2012, 15:08 »

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

Это ж статический объект, не будет он уничтожаться при выходе из функции
« Последнее редактирование: Июнь 14, 2012, 15:10 от mutineer » Записан
Alex_C
Гость
« Ответ #24 : Июнь 14, 2012, 15:14 »

Это ж статический объект, не будет он уничтожаться при выходе из функции

Сейчас дебаггером проверил:
Если я в ф-ции определяю OnlyOne s = OnlyOne::Instance; (паттерн определен как у alexis031182)
при выходе из ф-ции вызывается деструктор OnlyOne. Это и верно - переменная s - получается локальная.
Записан
alexis031182
Гость
« Ответ #25 : Июнь 14, 2012, 15:17 »

Сейчас дебаггером проверил:
Если я в ф-ции определяю OnlyOne s = OnlyOne::Instance; (паттерн определен как у alexis031182)
при выходе из ф-ции вызывается деструктор OnlyOne. Это и верно - переменная s - получается локальная.
Улыбающийся
Код:
OnlyOne &s = OnlyOne::Instance;
Записан
mutineer
Гость
« Ответ #26 : Июнь 14, 2012, 15:21 »

Это ж статический объект, не будет он уничтожаться при выходе из функции

Сейчас дебаггером проверил:
Если я в ф-ции определяю OnlyOne s = OnlyOne::Instance; (паттерн определен как у alexis031182)
при выходе из ф-ции вызывается деструктор OnlyOne. Это и верно - переменная s - получается локальная.


А вот у меня такая строка не компилируется и правильно делает - конструктор копирования приватный ведь, а тут происходит как раз создание нового объекта копированием. Ну или просто создание нового объекта (конструктор по умолчанию приватный) и выполнение оператора =(который тоже приватный). Так что фигня у тебя какая-то
Записан
iroln
Гость
« Ответ #27 : Июнь 14, 2012, 15:40 »

Нет конечно. Это один из самых простых и "правильных"паттернов))
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #28 : Июнь 14, 2012, 21:25 »

Для меня получается правильный вариант, предложенный Kurles. Однако пока не понятен вопрос - как правильно удалить теперь паттерн с вызовом его деструктора при завершении работы программы?

Если синглтон наследуется от QObject и является ребёнком какого-то основного объекта типа окна, то он сам удалится.
« Последнее редактирование: Июнь 14, 2012, 21:28 от Alex Custov » Записан
Alex_C
Гость
« Ответ #29 : Июнь 15, 2012, 14:14 »

Если синглтон наследуется от QObject и является ребёнком какого-то основного объекта типа окна, то он сам удалится.

Да, думаю самый правильный метод.
В соседней ветке как раз дали ссылку на реализацию подобного сиглтона
http://blog.ufna.ru/2010/04/24/singleton-for-qt
однако в данной реализации мне вот что не понятно - при использовании синглтона типа

Код:
class MapObject
{
public:
    static MapObject *getInstance()
    {
        if(!instance)
            instance = new MapObject();
        return instance;
    }
    ~MapObject();

private:
    static MapObject *instance;
    MapObject();
}

Мы при помощи instance = new MapObject(); создаем новый объект вызывая его метод Create.
А если пользоваться тем примером, что приведен по ссылке

Код:
    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;

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


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