我想在我的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();
}
我希望编辑能增加清晰度。
一切顺利, 理查德
答案 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
}
然而,在另一个类中静态地包含设置会做同样的事情并且稍微有点组织。