【问题标题】:Global variables in Qt 5.3Qt 5.3 中的全局变量
【发布时间】:2014-07-18 07:23:55
【问题描述】:

在 Visual Studio 2012 (C++) 中,在开始时声明变量以使其具有全局范围并同时设置变量的值就足够了。 Qt 5.3如何创建全局变量并初始化?

我试图在头文件中声明它,但我有一个问题:“只能在类中初始化静态 const 整数数据成员”。

提前致谢!

【问题讨论】:

  • (1) 发布文字,而不是图片。 (2) 看来你是在处理普通的类成员变量(不是全局变量),所以这个问题没有意义。最简单的解决方法是将成员变量初始化移动到类构造函数。 (3) 这个问题似乎与Qt或OpenCV没有任何关系。
  • 那些是成员,而不是全局变量,初始化也不应该在 VS 中工作。另外,oVideoWriter 是如何隐形的?您是否尝试在成员函数之外使用它?
  • 全局变量是邪恶的。改用类变量。
  • @AndrewMedico 好的,我做到了。(2)这个问题有什么意义?我尝试初始化成员变量(dialog.cpp),但仍然收到消息:“未使用的变量”。 (3)也许这个问题似乎与OpenCV没有任何关系......但它是关于QT以及如何在这里创建全局变量并初始化它们。
  • @molbdnilo 我的意思是,我在 dialog.cpp 中收到消息“未声明的标识符”,尽管我在 dialog.h 中声明了这个变量。抱歉,我不明白你的最后一个问题。

标签: c++ qt opencv


【解决方案1】:

全局变量

要创建一个“全局”变量,您需要让所有人都可以使用它,并且您需要将其声明一次,并且只声明一次。

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

免责声明:

一般来说,全局变量和公共静态成员有点危险/不受欢迎,尤其是当您不确定自己在做什么时。对象和方法以及私有和受保护的所有 OOP 优点都消失了,可读性也下降了。可维护性可能会变得混乱。请参阅下面更深入的 SO 答案:

Are global variables bad?

Q设置

对于一些全局设置,我使用QSettings 取得了巨大成功。

http://qt-project.org/doc/qt-5/QSettings.html#details

https://stackoverflow.com/a/17554182/999943

希望对您有所帮助。

【讨论】:

  • 为什么 don't use don't use #include &lt;QString&gt; 在 global.h 中?为什么你将Class QString; 封装在QT_BEGIN_NAMESPACEQT_END_NAMESPACE 中?
  • 您的免责声明非常有帮助。请各位读者仔细阅读。
  • 我在代码的 cmets 中描述了原因。它加快了编译时间。
  • 前向声明 class QString; 被 Qt 命名空间包裹,因为 QString 是 Qt 命名空间的一部分。在几个例子中,我已经看到了这种做法。更好/更长的解释在这里:wiki.qt.io/Qt-In-Namespace
  • 当你说任何部分时,它是否包含在void定义中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
相关资源
最近更新 更多