我被告知使用全局变量是一种不好的做法 - 我准备同意。我已经知道你可以编写一个函数,每次以下面的方式调用它时返回一个不同的值:
unsigned int foo() {
static unsigned int i = 0;
return i++;
}
有没有办法存储一些只有可读/可写的变量,比如几个函数?例如,假设我有一个unordered_map<unsigned int, unsigned int>
,我想要一些函数,来添加/删除元素。如果不使用全局变量,这是可行的吗?
答案 0 :(得分:2)
您可以在自己的.cpp
文件中一起定义这些函数,并在同一unordered_map<unsigned int, unsigned int>
文件中的匿名命名空间中定义.cpp
,以使其仅可在您定义的函数中访问那个文件。
示例cpp文件:
namespace {
std::unordered_map<unsigned int, unsigned int> private_map;
}
void map_add(unsigned int key, unsigned int value) {
private_map.insert(std::pair<unsigned int, unsigned int>(key, value));
}
void map_delete(unsigned int key) {
private_map.erase(key);
}
要使用的头文件:
#ifndef GlobalMap_H
#define GlobalMap_H
void map_add(unsigned int key, unsigned int value);
void map_delete(unsigned int key);
#endif
包含此标题将允许您调用访问地图的功能,但您将无法直接访问地图。
答案 1 :(得分:1)
全局变量不是坏事。它们既不好也不坏,但作为任何工具,它们在满足其目的时都很有用。由于这种特殊的工具往往被滥用,因此有一个普遍的概念,即全局变量很糟糕,ooooggggh&#39;不过,到处都有全球变数。例如,node start.js
通常是一个全局变量。
但是,某些情况需要全局变量。但是看过那些他们很糟糕的事情。人们开始使用别的东西 - 通常是单身人士。单身并不比全局变量更好,只有懒惰的依赖性 - 但许多单身甚至不使用延迟初始化。作为这种方法的结果,每个全局变量都变成了Singleton(幸运的是它已经被许多库支持,并且将全局变为单例只需要几次击键)并且同样的滥用仍在继续。
而不是重复全局变量是不好的&#39; mantra,开发人员应该了解与它们相关的问题,它们有什么好处,并选择适合特定编码需求的工具。
全局变量使代码难以推理。这意味着由于任何函数都可以将值写入其中,因此很难理解值如何随程序执行而变化。例如,如果您意识到某些点的值不正确,您将有时间弄清楚您是如何在那里结束的。在最坏的情况下,你将不得不为整个代码库grep这个变量的名称,如果codebase是1000个文件,名称就像std::cout
那样会很有趣。
我不会告诉你在你的情况下使用什么。已有建议:将其设为类的静态变量,或将其作为给定.cpp文件的局部变量。两者都很好,因为它们限制了潜在的变量变换器的范围 - 对于类的朋友,或者在同一个.cpp文件中定义的函数。采用类方法,您可以将函数和数据都作为类的静态成员 - 这样您就不需要定义朋友。选择是你的。
答案 2 :(得分:0)
有没有办法存储一些只有可读/可写的变量,比方说,有几个函数?
您可以将变量设为类的private
和static
数据成员,并将函数声明为friend
。
#include <iostream>
class Foo
{
private:
static unsigned int i;
friend void f();
friend void g();
friend void h();
};
unsigned int Foo::i = 123;
void f() { std::cout << Foo::i; }
void g() { Foo::i = 456; }
void h() { std::cout << Foo::i; }
int main()
{
f();
g();
h();
}
但我说这是一个相当不寻常的习语。
为什么不将这些功能转换为成员函数?