Название: Помогите новичку с QMap Отправлено: Andreas от Май 02, 2005, 11:08 Я хочу сделать в своей программе глобальную переменную типа QMap, чтобы ее было видно везде, но у меня ничего не получается.
Подскажите, что я делаю не так. Файл main.cpp: #include <qapplication.h> #include "mainform.h" int main(int argc, char *argv[]) { QApplication app(argc, argv); MainForm *mainWin = new MainForm; app.setMainWidget(mainWin); mainWin->show(); return app.exec(); } Файл global.h: #ifndef GLOBALVARIABLE_H #define GLOBALVARIABLE_H #include <qmap.h> #include <qstring.h> #include <qvariant.h> static QMap<QString, QVariant> config; // конфигурация приложения #endif // GLOBAL_H Файл mainform.h: #ifndef MAINFORM_H #define MAINFORM_H #include <qapplication.h> #include <qmainwindow.h> #include "global.h" #include "test.h" class MainForm : public QMainWindow { public: MainForm( QWidget* parent = 0, const char* name = 0); ~MainForm(){}; }; #endif // MAINFORM_H Файл mainform.cpp: #include "mainform.h" #include "global.h" #include "test.h" #include <iostream> MainForm::MainForm( QWidget* parent, const char* name) : QMainWindow( parent, name, WDestructiveClose) { config["v1"]="First"; Test *mt = new Test; QString x1 = config["v1"].toString(); QString x2 = config["v2"].toString(); std::cout<<"v1= "<<x1<<" v2="<<x2<<"\n"; } Файл test.h: #ifndef TEST_H #define TEST_H #include "global.h" class Test { public: Test(); }; #endif Файл test.cpp: #include "global.h" #include "test.h" Test::Test() { config["v2"]="Second"; } Название: Re: Помогите новичку с QMap Отправлено: Zigmar от Май 02, 2005, 22:05 Цитата: "Andreas" глобальную переменную Ты сам себе объяснил в чём проблемма... Название: Помогите новичку с QMap Отправлено: Andreas от Май 03, 2005, 10:30 Да, но я не знаю как сделать правильно.
Название: Помогите новичку с QMap Отправлено: Andreas от Май 03, 2005, 13:04 Наконец-то разобрался в чем дело :D
Если кому-то интересно то проблема была в том, что я не разобрался с вопросами внутреннего и внешнего связывания статического класса памяти. Поэтому, в примере выше я невольно применил внутреннее связывание для переменной config и в классе Test у меня создавался новый экземпляр QMap. Что-бы все работало правильно я выкинул файл global.h исключительно для упрощения кода. Добавил в файл main.cpp сразу после директив #include строку: QMap<QString, QVariant> config; // статическая область видимости, внешнее связывание Добавил в файлы mainform.cpp и test.cpp строки: #include <qmap.h> #include <qstring.h> #include <qvariant.h> extern QMap<QString, QVariant> config; Ключевое слово extern говорит о том, что моя переменная была объявленна ранее и фактически ее можно рассматривать как создание ссылки на объявленную раннее переменную config. Теперь все работает отлично. [/code] Название: Помогите новичку с QMap Отправлено: Sergeich от Май 03, 2005, 14:50 Вообще-то использование глобальных переменных в С++ крайне не рекомендуется, вместо этого лучше использовать паттерн Singleton ( см. Э.Гамма и др. "Паттерны проектирования" http://www.ozon.ru/context/detail/id/115172/ или Qt Quaterly 10, "Implementing Model/View/Controller", class PaletteModelManager )
|