在Visual Studio 2012 (C++)中,只需在开头声明变量即可使其具有全局作用域,并同时设置变量的值。但是,在Qt 5.3中如何创建全局变量并初始化呢?
我尝试在头文件中声明它,但是遇到了一个问题:“只有静态常量整型数据成员可以在类内进行初始化”。
提前感谢!
我尝试在头文件中声明它,但是遇到了一个问题:“只有静态常量整型数据成员可以在类内进行初始化”。
提前感谢!
要创建一个“全局”变量,您需要使其对所有人可用,并且只需要声明一次。
globals.h
#ifndef GLOBALS_H
#define GLOBALS_H
#include <qtglobal.h>
// ALL THE GLOBAL DECLARATIONS
// don't use #include <QString> here, instead do this:
QT_BEGIN_NAMESPACE
class QString;
QT_END_NAMESPACE
// that way you aren't compiling QString into every header file you put this in...
// aka faster build times.
#define MAGIC_NUM 42
extern qreal g_some_double; // Note the important use of extern!
extern QString g_some_string;
#endif // GLOBALS_H
globals.cpp
#include "globals.h"
#include <QString>
// ALL THE GLOBAL DEFINITIONS
qreal g_some_double = 0.5;
QString g_some_string = "Hello Globals";
现在,如果您想要访问这些危险的全局变量,您需要在任何文件的顶部进行如下设置:
#include "globals.h"
// ...
// short example of usage
qDebug() << g_some_string << MAGIC_NUM;
g_some_double += 0.1;
总之,globals.h
包含了全局函数和变量的所有原型,然后在globals.cpp
中进行描述。
对于这些内容,它们与上面的示例类似,但是它们包含在您的类中。
myclass.h
class MyClass
{
public:
static int s_count; // declaration
}
myclass.cpp
int MyClass::s_count = 0; // initial definition
qDebug() << MyClass::s_count;
或者
MyClass::s_count++;// etc
一般来说,全局变量和公共静态成员有点危险/不被赞同,特别是如果你不确定自己在做什么。所有面向对象编程的好处,如对象、方法、私有和受保护的都会消失,可读性也会下降。而且可维护性会变得混乱。请参见下面更详细的SO答案:
对于一些全局设置,我使用了QSettings
并取得了很大的成功。
http://qt-project.org/doc/qt-5/QSettings.html#details
https://stackoverflow.com/a/17554182/999943
希望这可以帮到您。
#include <QString>
?为什么要将Class QString;
封装在QT_BEGIN_NAMESPACE
和QT_END_NAMESPACE
中? - S.M.Mousaviclass QString;
由于 QString
是 Qt 命名空间的一部分,因此被包装在 Qt 命名空间中。在几个示例中,我已经看到过这种做法。这里有一个更好/更长的解释: http://wiki.qt.io/Qt-In-Namespace - phyattvoid
定义内部? - Sigur
oVideoWriter
怎么会不可见呢?你是尝试在成员函数之外使用它吗? - molbdnilo