2

我想在我的 Qt C++ 项目中有一个包含所有全局变量的文件。

类似于:mainvar.h

我可以将其包含在需要访问全局变量的文件中。

它们会在我的设置文件所在的位置保存常量,我可以在其中找到样式表和其他内容。

目前我有一个头文件,但得到 Linker Error: LNK2005 for double definition。

然后,有 #define 和 extern ...

什么是最现代的解决方案,我应该如何解决这个问题?问题是,我还不知道我将拥有多少个全局变量。

我来自 PHP,那里的情况略有不同。期待您的帮助。

编辑1:

好的,在评论之后,这里是一些代码:我已经弹出了旧代码,所以这已经包含了第一个评论中的代码来创建一个类:

QFile settingsFile(GlobalSettings::getSettingsFileStr());
if (!settingsFile.exists())
{
    //create the settings file
    settingsFile.open(QIODevice::ReadWrite);
    settingsFile.close();
    loadSettings("://src/settings_default.ini");
}
else
{
    loadSettings("");
}

在此设置文件中,我保存了用户关闭应用程序时是否显示 TrayIcon 的天气。

稍后我想在 MainWindow 类中使用此设置。如:

QSettings settings(GlobalSettings::getSettingsFileStr(), QSettings::IniFormat);

if ( settings.value("general/trayIcon").toBool() )
{
    event->ignore();
    showTrayIcon();
    this->hide();
}

我希望编辑增加清晰度。

一切顺利,理查德

4

2 回答 2

3

我想你想要的是这样的:

主变量.cpp

QString settingsFileStr; //some initialization too probably

主变量.h

extern Qstring settingsFileStr;

主文件

#include <iostream>
#include "mainvar.h"

using namespace std;

int main(){
  //do stuff with settingsFileStr
}

然而,在另一个类中静态地包含设置会做同样的事情,并且会更有条理。

于 2013-08-02T00:49:07.800 回答
2

由于您使用的是 C++ 和 QT,我会提出以下解决方案(我认为它在源代码中更具可读性并为扩展提供了一些灵活性)..

全局.h

#ifndef _GLOBALS_H
#define _GLOBALS_H

class Globals {
protected:
    static Globals * m_pInstance;

public:

    //Globals * instance();
    static Globals * instance();

    // your global setters/getter

    QString   getMyString();
    void setMyString(const QString & val);

protected:

    QString m_myString;

private:
    Globals();
};

#endif

全局变量.cpp

#include "globals.h"

Globals * Globals::m_pInstance  = NULL;
Globals * Globals::instance() {
      if (!m_pInstance)
          m_pInstance = new Globals();
      return m_pInstance;
}

Globals::Globals() {
   // whatever initialisation code you need to your global vars
}

QString Globals::getMyString() {
   return m_myString;
}

QString Globals::setMyString(const QString & str) {
    m_myStirng = str;
}

etc..

用法:

代码.cpp

#include "globals.h"

...

QString getMyVar = Globals::instance()->getMyString();

...
于 2013-08-02T07:15:18.907 回答