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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите новичку с QMap  (Прочитано 7765 раз)
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";
}
Записан
Zigmar
Гость
« Ответ #1 : Май 02, 2005, 22:05 »

Цитата: "Andreas"
глобальную переменную

Ты сам себе объяснил в чём проблемма...
Записан
Andreas
Гость
« Ответ #2 : Май 03, 2005, 10:30 »

Да, но я не знаю как сделать правильно.
Записан
Andreas
Гость
« Ответ #3 : Май 03, 2005, 13:04 »

Наконец-то разобрался в чем дело  Веселый
Если кому-то интересно то проблема была в том, что я не разобрался с вопросами внутреннего и внешнего связывания статического класса памяти. Поэтому, в примере выше я невольно применил внутреннее связывание для переменной 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]
Записан
Sergeich
Гость
« Ответ #4 : Май 03, 2005, 14:50 »

Вообще-то использование глобальных переменных в С++ крайне не рекомендуется, вместо этого лучше использовать паттерн Singleton ( см. Э.Гамма и др. "Паттерны проектирования" http://www.ozon.ru/context/detail/id/115172/ или Qt Quaterly 10, "Implementing Model/View/Controller", class PaletteModelManager )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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