回答
每个人都在喋喋不休地说“全局变种是邪恶的”,但我说几乎所有的东西都可以被使用或被滥用。另外,如果globals本质上是坏的,他们根本就不会被允许摆在首位。在全局的情况下,有一个偶然的误操作非常消极的后果相当的潜力,但他们是100%的罚款,如果你真的知道你在做什么:
// globals.h - for including globals
extern int globalInt; // note the "extern" part
// globals.cpp - implementing the globals
int globalInt = 667;
它也可能是一个非常不错的主意使用命名空间避免命名冲突并保持范围更清晰,除非您对命名约定特别谨慎,这是命名空间的老式“C”方式。
另外,特别是如果您使用多个线程,创建一个接口来访问封装的全局内容也是一个好主意,这些内容也将具有模块化锁定,或者尽可能无锁定地使用(例如直接使用原子)。
但是全球并不一定是唯一的解决方案。根据你真正需要的东西,单身人士或者静态类成员可能会这样做,同时保持它更整洁一些,避免使用邪恶的全局变量。
如果您只是在UI线程(用于QApplication ui应用程序)或主线程(用于QCoreApplication控制台应用程序)中使用此全局变量,那么编码会很方便,您可以设计一个自定义数据结构。但是如果使用它在多线程环境中,您应该需要互斥锁或原子来保护全局变量。
你认为你可以帮我一个例子的实现吗? –
应该尽量避免使用全局变量。
但是你可以在你想要使用它的每个地方为全局变量和#include“globals.h”创建头文件。然后你可以正常使用每个变量。
但是不会重新定义它包含在每个类中的变量? –
这样的变量必须在某个地方定义一次,然后在不同的编译单元中使用。但是,为了使用某些东西,你知道,你需要告诉编译器它存在(声明它)。 extern
关键字可以让你声明即东西存在别的地方。
为了构建你的代码,你可以做什么xkenshin14x(样的?)建议:
global.h
#pragma once
#include <string>
// Declaration
namespace global
{
extern int i;
extern float f;
extern ::std::string s;
}
global.cpp
#include "global.h"
// Definition
namespace global
{
int i = 100;
float f = 20.0f;
::std::string s = "string";
}
main.cpp
#include "global.h"
int main(int argc, char *argv[])
{
std::cout << global::i << " " << global::f << " " << global::s;
return 0;
}
这是很好的使用命名空间在这种情况下,因为它可以让你避免名称冲突的固有的全局变量。
或者,可以将所有全局内容封装在一个“全局”对象中。我引用了“全球化”,是因为这确实目标是静态的,以一个全球性的功能,因此在技术上没有全局变量参与 :)
这里是一个只有头实现:
global.h
#pragma once
class Global
{
public:
int i = 100;
float f = 20.0f;
// and other "global" variable
public:
Global() = default;
Global(const Global&) = delete;
Global(Global&&) = delete;
static Global& Instance()
{
static Global global;
return global;
}
};
namespace {
Global& global = Global::Instance();
}
// static Global& global = Global::Instance(); if you like
test.h
#pragma once
#include "global.h"
struct Test
{
void ChangeGlobal() {
global.i++;
}
};
main。CPP
#include <iostream>
#include "global.h"
#include "test.h"
int main()
{
Test t;
std::cout << global.i << " " << global.f << std::endl;
t.ChangeGlobal();
std::cout << global.i << " " << global.f << std::endl;
return 0;
}
有一个这样的做法至少有两个好处:
- 您不要随便使用任何全局对象。
- 在您的
Global
类中,您可以在需要的地方添加带有互斥锁的变量存取器。例如,void SetSomething(const Something& something) { ... }
之前(而不是/之后)downvoting你可以写评论有关这个问题,我一定会修复它。 – WindyFields
- 1. 声明由所有类访问的全局变量C++
- 2. Codeigniter创建和访问全局变量
- 3. NSUserDefaults创建全局访问变量
- 4. 全局类访问变量
- 5. 使用Python + Pylons创建一个全局函数,可以从所有类访问
- 6. 在一个类中创建一个es6变量全局变量
- 7. 如何跨所有包一个全局变量访问在golang
- 8. 在Objective-C中,如何创建一个全局可访问的全局配置?
- 9. 无法访问一个全局变量
- 10. 访问一个全局变量
- 11. 无法访问一个全局变量
- 12. 从C#访问C全局变量'errno'
- 13. angular4 - 创建一个全局变量,也可以在视图中访问
- 14. 在所有文件中可访问的全局变量codeigniter
- 15. 用JavaScript创建一个全局变量
- 16. 如何创建一个全局变量?
- 17. 创建一个全局变量rails 3.1
- 18. 创建一个全局类的objective-c?
- 19. 使用qt创建全局QHash变量C++
- 20. 从java中访问全局C变量
- 21. C++ - 访问全局变量对象
- 22. 在类之外访问全局变量
- 23. 全局变量 - 从视图类访问
- 24. 访问javascript全局变量
- 25. 访问全局变量
- 26. 全局访问变量
- 27. JSP访问全局变量
- 28. AS3:访问全局变量
- 29. 访问全局变量
- 30. 访问全局变量
是的,为什么你不应该这样做:https://stackoverflow.com/questions/484635/are-global-variables-bad – MrEricSir