C ++中一组函数的静态变量

时间:2015-11-10 18:52:06

标签: c++ namespaces

我被告知使用全局变量是一种不好的做法 - 我准备同意。我已经知道你可以编写一个函数,每次以下面的方式调用它时返回一个不同的值:

unsigned int foo() {
   static unsigned int i = 0;
   return i++;
}

有没有办法存储一些只有可读/可写的变量,比如几个函数?例如,假设我有一个unordered_map<unsigned int, unsigned int>,我想要一些函数,来添加/删除元素。如果不使用全局变量,这是可行的吗?

3 个答案:

答案 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)

  

有没有办法存储一些只有可读/可写的变量,比方说,有几个函数?

您可以将变量设为类的privatestatic数据成员,并将函数声明为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();
}

但我说这是一个相当不寻常的习语。

为什么不将这些功能转换为成员函数