Название: [РЕШЕНО] Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 14, 2012, 23:04 Пишу программу на Qt которая авторизируется на сайте и держит информацию о сессии в куках (jar)
Пока все происходило в одном классе все было очевидно, но дальше я хочу разложить функционал по полочкам и сделать единый класс для работы с авторизацией и передачей данных на сайт который будет содержать одинаковые данные и будет создан один раз при запуске приложения, то же самое хочу сделать с настройками, при изменении настроек информация, через сигнал будет рассылаться куда нужно. Все говорят, что плохо работать с классом по указателю, но разве лучше создавать отдельные экземпляры класса в разных местах, каждый сделает свое дело и не скажет об этом туда где создан другой экземпляр, у того свой сигнал. В общем можно создавать классы и подключив их к main.cpp сделать их глобальными? Я только несколько недель экспериментирую с C++ и пока это самая большая проблема, философия. Все равно объекты приходится передавать по ссылке в класс который заполнит их данными, борясь с воплями компилятора на каждом шагу, но эти переданные объекты созданы в разных классах у них разные сигналы, просто мы экономим время на копирование кода, а проблема остается. В общем почему то очевидное спрятано глубоко, в примерах не раскрывается простота передачи данных, один класс другому друг, а один класс двум классам не друг а два друга которые знать не знают про то, что есть вторая пара друзей. В общем как с этим бороться если это возможно? Спасибо. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: ufna от Июнь 14, 2012, 23:09 Вот то, о чем постоянно говорит Igors.. надо С++ учить ДО Qt, а не во время или после :)
Цитировать Все говорят, что плохо работать с классом по указателю, но разве лучше создавать отдельные экземпляры класса в разных местах, каждый сделает свое дело и не скажет об этом туда где создан другой экземпляр, у того свой сигнал. не знаю кто они все, видимо те самые, которые врут. "Глобальный" класс - может быть синглетон (http://blog.ufna.ru/2010/04/24/singleton-for-qt) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: mutineer от Июнь 14, 2012, 23:23 В общем как с этим бороться если это возможно? Спасибо. Вот исходя из вышенаписанного напрашиваются две рекомендации: 1) Научиться излагать мысли более понятно 2) Выучить С++ Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 14, 2012, 23:52 Стоп стоп это форум, чем вы думаете я занимаясь.
Не нужно копировать чужие мысли, лучше написать свое мнение и обосновать его как это сделал я. Но я бы хотел просто получить ответ не переходя на личности если что. Лучше учиться думать свои мысли чем не иметь их. К стати как где смотреть про это в С++ вы хотя бы знаете? например пространства имен или предварительное объявление класса, как вы узнали про то что вы не поняли моих мыслей? Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: ufna от Июнь 15, 2012, 00:14 как вы узнали про то что вы не поняли моих мыслей? (http://ufna.ru/images/smiles/1_3_1.gif) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: mutineer от Июнь 15, 2012, 00:21 Я бы ответил по существу, вот только суть вопроса постоянно ускользает из-за сумбурности твоего изложения
Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 15, 2012, 02:02 Я бы ответил по существу, вот только суть вопроса постоянно ускользает из-за сумбурности твоего изложения Это по тому что меня сбивает ясней не могу если бы мог не писал бы на форум а взял бы и сделал сам Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Serr500 от Июнь 15, 2012, 08:24 1) Глобальный объект можно создать и в C++. Например, так.
global.h Код: extern TMyClass g_MyObject; Код: TMyClass g_MyObject Код: #include "global.h" 2) Синглтон Мейерса - самое подходящее в данном случае решение. http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования) (http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Igors от Июнь 15, 2012, 10:29 1) Глобальный объект можно создать и в C++. Например, так. Все так, но причем тут ++? Это и на "просто С" так же :)Стоп стоп это форум, чем вы думаете я занимаясь. Мне нравится такой подход, но чего такой конфуз с глобальными переменными? :)Не нужно копировать чужие мысли, лучше написать свое мнение и обосновать его как это сделал я. Но я бы хотел просто получить ответ не переходя на личности если что. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Serr500 от Июнь 15, 2012, 10:36 Все так, но причем тут ++? Это и на "просто С" так же :) Про существование "просто C" я давно уже забыл... ;)Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 15, 2012, 11:44 2) Синглтон Мейерса - самое подходящее в данном случае решение. http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования) (http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)) Спасибо за наводку, использовал Синглтон на PHP что бы писать логи в файл, но не думал что он есть и в C++.Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: kambala от Июнь 15, 2012, 12:18 2) Синглтон Мейерса - самое подходящее в данном случае решение. http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования) (http://ru.wikipedia.org/wiki/Одиночка_(шаблон_проектирования)) Спасибо за наводку, использовал Синглтон на PHP что бы писать логи в файл, но не думал что он есть и в C++.Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 15, 2012, 12:36 Мне нравится такой подход, но чего такой конфуз с глобальными переменными? :) Пытаюсь освоить Qt С++ на практике, хочется делать приложения которые можно будет относительно легко масштабировать, назначить синглтон например ответственным за авторизацию и постоянно его опрашивать откуда захочу, а не слетела ли авторизация, а есть ли соединение с сервером и т.д.Я до сих пор не уверен, что глобоидальные объекты именно глобальные, по тому, что авторы языка и те кто на нем успешно пишут как то по другому мыслят. Идеально когда порог вхождения в язык небольшой, а потом если что-то нужно делать более качественно или функционально доучиваешься, в С++ и подобных надо сразу знать все или у тебя ничего дельного кроме helo world не получится. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Igors от Июнь 15, 2012, 12:43 Я до сих пор не уверен, что глобоидальные объекты именно глобальные, по тому, что авторы языка и те кто на нем успешно пишут как то по другому мыслят. Идеально когда порог вхождения в язык небольшой, а потом если что-то нужно делать более качественно или функционально доучиваешься, в С++ и подобных надо сразу знать все или у тебя ничего дельного кроме helo world не получится. Любая переменная в С/С++ есть ячейка памяти - со всеми вытекающими: максимальная эффективность и гибкость и (с др стороны) полная незащищенность, отсутствие вумных "сборщиков мусора" и.т.п. "С" был придуман как замена ассемблеру, и, несмотря на все попытки извращенцев, это остается так. Ну а недостатки - это продолжение достоинств, и наоборотНазвание: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 15, 2012, 14:02 Я до сих пор не уверен, что глобоидальные объекты именно глобальные, по тому, что авторы языка и те кто на нем успешно пишут как то по другому мыслят. Идеально когда порог вхождения в язык небольшой, а потом если что-то нужно делать более качественно или функционально доучиваешься, в С++ и подобных надо сразу знать все или у тебя ничего дельного кроме helo world не получится. Любая переменная в С/С++ есть ячейка памяти - со всеми вытекающими: максимальная эффективность и гибкость и (с др стороны) полная незащищенность, отсутствие вумных "сборщиков мусора" и.т.п. "С" был придуман как замена ассемблеру, и, несмотря на все попытки извращенцев, это остается так. Ну а недостатки - это продолжение достоинств, и наоборотНазвание: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Igors от Июнь 15, 2012, 14:06 Сейчас все так быстро меняется, что к тому же С++ например хорошо бы изучить еще криптографию, работу с устройствами например aladin, сотню другую разных вещей, Людей которые занимаются "сотней разных вещей" обычно называют "летунами" и отношение к ним не очень хорошее :)Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: CuteBunny от Июнь 15, 2012, 16:28 В Qt же есть глобальная переменная qApp - указатель на текущее приложение - всегда един, в теории можно от него создать потомка и положить туда какие-нибудь данные и создать методы для доступа к ним.
Поправьте, если не прав ??? З.Ы.: я бы наверное так все равно не стал делать... :) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 15, 2012, 16:33 Вот то, о чем постоянно говорит Igors.. надо С++ учить ДО Qt, а не во время или после :) Блин вот из за того что на верху было написано, не прочел то что ниже, сейчас нашел ту же ссылку через гугл http://blog.ufna.ru/2010/04/24/singleton-for-qt домен был как ник ufna.Цитировать Все говорят, что плохо работать с классом по указателю, но разве лучше создавать отдельные экземпляры класса в разных местах, каждый сделает свое дело и не скажет об этом туда где создан другой экземпляр, у того свой сигнал. не знаю кто они все, видимо те самые, которые врут. "Глобальный" класс - может быть синглетон (http://blog.ufna.ru/2010/04/24/singleton-for-qt) В общем спасибо за ссылку. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Авварон от Июнь 15, 2012, 16:38 facepalm.jpg
Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 16, 2012, 00:25 Попробовал создать singleton но как я предчувствовал он не глобальный, работает только в самом классе, подключить я его не могу поскольку просто выдается ошибки, перепробовал много вариантов, осталось еще бесконечность, в общем нереально понять для меня такое.
Вот пример под винду, программа запускается но переменная MY_CLASS.ttt не создается по тому что когда я пытаюсь передать в класс MainWindow класс Test выдается куча ошибок. В общем исходники прикрепил к посту, делал по этой статье, http://blog.ufna.ru/2010/04/24/singleton-for-qt в интернете есть еще всего одно место с примером, http://www.qtcentre.org/wiki/index.php?title=Singleton_pattern#Further_Reading но там я в обще не уловил как это можно собрать. Все больше примеров нет. А если статическим классом сделать, будет он поддерживать сигналы и слоты? Не получилось объявить статический класс, QT ругается на синтаксис Код: public static class Session {} Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 16, 2012, 19:31 Наверное надо было в другую тему писать, все таки вопрос довольно сложный если нет ответов.
Пока не получилось сделать из класса наследуемого от qobject синглтон с сигналом, точней не получилось разнести код на h и cpp а без этого qt похоже думает, что это не сигнал а статическая процедура, сигнал это та же процедура без тела. Купил книжку М.Самерфильда а там тоже ничего, похоже я попал в мир экстрасенсов ;D Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: alexis031182 от Июнь 16, 2012, 19:51 Наверное надо было в другую тему писать, все таки вопрос довольно сложный если нет ответов. От перемены мест слагаемых сумма не меняется.Пока не получилось сделать из класса наследуемого от qobject синглтон с сигналом, точней не получилось разнести код на h и cpp а без этого qt похоже думает, что это не сигнал а статическая процедура, сигнал это та же процедура без тела. Мне кажется, что Вы рановато взялись за паттерны. Для начала Вам необходимо очистить сознание от пых-пыха, иначе ничего хорошего не выйдет.Купил книжку М.Самерфильда а там тоже ничего, похоже я попал в мир экстрасенсов ;D Код: public static class Session {} Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: kambala от Июнь 16, 2012, 19:53 а проблема-то в чем? вовсе не обязательно использовать класс уфны для синглтона.
Код
Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 16, 2012, 20:44 а проблема-то в чем? вовсе не обязательно использовать класс уфны для синглтона. не могу найти шаблон который можно использовать, ваш шаблон смог внедрить за несколько минут, но при запуске выдает сообщение Цитировать Object::connect: No such signal QObject::mysignal(int) in test2.cpp:10 &A::instance() получается не содержит необходимого сигнала mysignalМы передали объект по ссылке и одновременно про инициализировали или как то нужно это сделать до передачи а передать все таки уже объект типа A? A * a = new A::instance(); test1.h Код: #ifndef TEST1_H test2.h Код: #ifndef TEST2_H Код: #include "test2.h" Код: #include <QtCore/QCoreApplication> Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: kambala от Июнь 16, 2012, 21:46 мне умный компилятор подсказал в чем проблема и не дал проекту скомпилироваться:
Цитировать ..\hello\hello.cpp(21): Error: Class declarations lacks Q_OBJECT macro. как только ты добавишь Q_OBJECT в класс A, всё сразу заработает (не забудь только после ttt->run() написать A::instance().test())Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 16, 2012, 22:23 мне умный компилятор подсказал в чем проблема и не дал проекту скомпилироваться: К стати забыл что его нужно вызвать было, но это после успешного соединения слотов.Цитировать ..\hello\hello.cpp(21): Error: Class declarations lacks Q_OBJECT macro. как только ты добавишь Q_OBJECT в класс A, всё сразу заработает (не забудь только после ttt->run() написать A::instance().test())A::instance().test() Добавил в класс A Код: class A : public QObject Предлагает покопаться в HEX кодах test2.o и не находит референс на класс А Цитировать G:\Programs\QT_Project\SingletonTest1/test1.h:6: undefined reference to `vtable for A' пока закоментилdebug/test2.o: In function `A': G:\Programs\QT_Project\SingletonTest1/test1.h:20: undefined reference to `vtable for A' collect2: ld returned 1 exit status mingw32-make.exe[1]: *** [debug\SingletonTest1.exe] Error 1 mingw32-make.exe: *** [debug] Error 2 //ttt->run(); //A::instance().test(); Я приложил файл к сообщению, там проект что бы не гадать если хотите посмотреть, а сообщение Error: Class declarations lacks Q_OBJECT macro. у меня выдается только после того как я за комментировал //ttt->run(); Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: kambala от Июнь 16, 2012, 23:00 избавься от singleton.h – после этого всё будет работать. ну и в данном случае ttt лучше создавать на стеке (т.е. не делать указателем).
и в test2.h:5 убери ; – после инклудов точку с запятой не ставят. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 16, 2012, 23:35 избавься от singleton.h – после этого всё будет работать. ну и в данном случае ttt лучше создавать на стеке (т.е. не делать указателем). Да все заработало спасибо, вот она какая глобальная переменная на самом деле, если сравнить с PHPи в test2.h:5 убери ; – после инклудов точку с запятой не ставят. GLOBAL $VAR = 123; А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще? Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: kambala от Июнь 17, 2012, 01:35 создать переменную на стеке значит объявить её не указателем. пойди поучи C++.
Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Igors от Июнь 17, 2012, 02:28 А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще? Стек - область/кусок памяти для хранения временных данных. Компилятор автоматычно размещает все локальные переменные на стеке, при выходе из ф-ции эта память освобождается.Хз как можно программировать (пусть на PHP) не зная что такое стек, регистры, команды ??? ??? Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: fuCtor от Июнь 17, 2012, 14:42 избавься от singleton.h – после этого всё будет работать. ну и в данном случае ttt лучше создавать на стеке (т.е. не делать указателем). Да все заработало спасибо, вот она какая глобальная переменная на самом деле, если сравнить с PHPи в test2.h:5 убери ; – после инклудов точку с запятой не ставят. GLOBAL $VAR = 123; А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще? Глобальная переменная все же это: extern int var; А singleton это singleton, не стоит путать теплое с мягким. Список литературы: http://alenacpp.blogspot.com/2006/09/blog-post_19.html или уж отсюда для начала можно: http://www.programmersclub.ru/main/ Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Igors от Июнь 17, 2012, 14:48 Глобальная переменная все же это: Из хорошей старой книжкиextern int var; А singleton это singleton, не стоит путать теплое с мягким. Цитировать ..на котором красовалась надпись ВАСТОК-2. Я подошел и исправил обе ошибки: ВОСТОГ-2 :)Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 17, 2012, 17:25 создать переменную на стеке значит объявить её не указателем. пойди поучи C++. Если я пойду читать про С++ будет 2 вещи1) Я не смогу понять как реализовать прочитанное, к сожалению жизнь такая, что постоянная беготня лишает чувства которое возникает когда что то понял, если это тупо не работает значит не понял, если работает значит понял. 2) Если не смогу быстро реализовать несколько мелких проектов, боюсь времени и желания у меня уже может не быть. В общем каждый выкручивается как может. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 17, 2012, 18:05 А стек это http://doc.qt.nokia.com/4.7-snapshot/qstack.html или что то еще? Стек - область/кусок памяти для хранения временных данных. Компилятор автоматычно размещает все локальные переменные на стеке, при выходе из ф-ции эта память освобождается.Хз как можно программировать (пусть на PHP) не зная что такое стек, регистры, команды ??? ??? http://www.yaap.info/page/debug_backtrace-ili-kak-poluchit-stek-vyzova а в низу приписка Цитировать Надеюсь, что все вы об этой функции знаете, но используете ее крайне редко (поскольку пишете код без ошибок и надобности в дебаге ;). Описал ее, чтоб не забыть самому =) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: fuCtor от Июнь 17, 2012, 19:44 Глобальная переменная все же это: Из хорошей старой книжкиextern int var; А singleton это singleton, не стоит путать теплое с мягким. Цитировать ..на котором красовалась надпись ВАСТОК-2. Я подошел и исправил обе ошибки: ВОСТОГ-2 :)Теперь сижу и думаю... толи это значит что я что-то сморозил не то ))) толи нет )) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: mutineer от Июнь 17, 2012, 22:07 создать переменную на стеке значит объявить её не указателем. пойди поучи C++. Если я пойду читать про С++ будет 2 вещи1) Я не смогу понять как реализовать прочитанное, к сожалению жизнь такая, что постоянная беготня лишает чувства которое возникает когда что то понял, если это тупо не работает значит не понял, если работает значит понял. 2) Если не смогу быстро реализовать несколько мелких проектов, боюсь времени и желания у меня уже может не быть. В общем каждый выкручивается как может. После такого признания в лени количество желающих помочь может резко сократиться:) Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: voron1980 от Июнь 18, 2012, 01:39 После такого признания в лени количество желающих помочь может резко сократиться:) Да это так, можете почитать о лени http://www.google.ru/#hl=ru&newwindow=1&sclient=psy-ab&q=%D0%BB%D0%B5%D0%BD%D1%8C+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%BD%D1%8B%D0%B9+%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC&oq=%D0%BB%D0%B5%D0%BD%D1%8C+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%BD%D1%8B%D0%B9+&aq=0K&aqi=g-K1&aql=&gs_l=hp.3.0.0i30.1110.3847.0.5020.14.13.0.1.1.3.685.2811.4j4j2j2j0j1.13.0...0.0.N7WgE4WjdZI&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=c76977525d0870fe&biw=1020&bih=563 (http://www.google.ru/#hl=ru&newwindow=1&sclient=psy-ab&q=%D0%BB%D0%B5%D0%BD%D1%8C+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%BD%D1%8B%D0%B9+%D0%BC%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%B7%D0%BC&oq=%D0%BB%D0%B5%D0%BD%D1%8C+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%BD%D1%8B%D0%B9+&aq=0K&aqi=g-K1&aql=&gs_l=hp.3.0.0i30.1110.3847.0.5020.14.13.0.1.1.3.685.2811.4j4j2j2j0j1.13.0...0.0.N7WgE4WjdZI&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=c76977525d0870fe&biw=1020&bih=563) думаю мы бы с вами сидели без работы если у людей отсутствовало чувство лени, они бы не захотели ничего автоматизировать, а делали бы все в ручную. Ну и желание что-то делать на С++ у меня пока отбили, хороший урок для меня. Название: Re: Есть ли в Qt аналог глобальных объектов как в PHP? Отправлено: Alex_C от Июнь 18, 2012, 09:13 Но теперь проект не компилируется Предлагает покопаться в HEX кодах test2.o и не находит референс на класс А G:\Programs\QT_Project\SingletonTest1/test1.h:6: undefined reference to `vtable for A' Кстати на будущее: если в гугле набрать Код: undefined reference to `vtable for A' При возникновении подобного рода ошибок. проект нужно очистить, удалив все файлы, которые создает компиллятор и пересобрать проект. И эта ошибка с вероятностью 90% пропадет. Я это делаю при помощи батника: Код: del /S /Q Obj Код: debug:OBJECTS_DIR = ./Obj/debug |