项目中的C ++全局常量

时间:2013-08-02 00:02:03

标签: c++ qt global-variables

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

类似于:mainvar.h

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

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

目前我有一个头文件,但得到链接器错误:LNK2005用于双重定义。

然后,有#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();
}

我希望编辑能增加清晰度。

一切顺利, 理查德

2 个答案:

答案 0 :(得分:2)

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

global.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

globals.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..

用法:

code.cpp

#include "globals.h"

...

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

...

答案 1 :(得分:1)

我认为你想要的是:

mainvar.cpp

QString settingsFileStr; //some initialization too probably

mainvar.h

extern Qstring settingsFileStr;

的main.cpp

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

using namespace std;

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

然而,在另一个类中静态地包含设置会做同样的事情并且稍微有点组织。