在头文件中声明和初始化向量(也是其他STL容器)

时间:2015-03-05 21:31:14

标签: c++ stl header global-variables

现在我在头文件中创建一个向量。记住,我不只是宣布它。

std::vector<int> attacked_nodes = std::vector<int> ();

它工作正常,但它给了我一些疑惑。这不是在适当的类的上下文中,它只是许多函数使用的变量。

我想知道这是不是

  • 正确(会适得其反吗?)
  • 可接受的做法(可能不是

我四处寻找,是的。

注意:这可能是一个糟糕的编码习惯,我明白了。我想知道的是,它实际上不正确

我不想使用new来创建指针,也许我可以使用new并保存引用?这是still inelegant,但可能有用。

感谢。

2 个答案:

答案 0 :(得分:5)

它是有效的C ++,但它并不是一个好的设计。您在头文件中定义了一个全局对象。这有两个问题:&#34;全球&#34;位和头文件中的&#34;&#34;位。

让我们从头文件问题开始。 C ++有一个称为单定义规则的规则,其中一部分规则要求您不要在整个程序中有多个对象定义。如果将此头文件包含在多个实现文件中(请记住,它就像将头文件的内容复制并粘贴到源文件中一样),您将拥有多个定义,因此会破坏一个定义规则。

现在全局状态的问题在于它隐藏了依赖关系。您提到您有许多使用此对象的函数,但是从这些函数的调用站点中它们使用该对象并不清楚。即使您使用完全相同的参数调用它们,您的函数也可能返回不同的结果,这仅仅是因为此全局状态可能已更改。这是糟糕的界面设计,使得功能更难以测试(和信任)。

答案 1 :(得分:2)

你问:

  

我想知道这是否正确(这会适得其反吗?)

如果您在多个翻译单元中#include .h文件,则此操作不正确。是的,它会适得其反。使用以下命令创建一个简单项目:

A.H

std::vector<int> attacked_nodes = std::vector<int> ();

a.cpp

#include "a.h"
void foo() {}

的main.cpp

#include "a.h"

int main() {}

您将看到关于attached_nodes多次定义的链接器错误。

你也说过:

  

这不是在适当的类的上下文中,它只是许多函数使用的变量。

当您拥有许多功能访问的全局状态时,最好使用功能接口提供对数据的访问。

.h文件:

std::vector<int>& get_attacked_nodes();

在实施中:

static std::vector<int> attacked_nodes = std::vector<int> ();
std::vector<int>& get_attacked_nodes()
{
   return attacked_nodes;
}