在 header 中声明并初始化向量(也包括其他 STL 容器)

Declare and initialize vector in header (also, other STL containers)

现在我正在 header 文件中创建矢量。请注意,我不只是宣布它。

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

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

我想知道这是不是

我找了一圈,是的。

注意:这可能是一种糟糕的编码习惯,我明白了。我想知道的是它是否真的 不正确?

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

谢谢。

它是有效的 C++,但不是好的设计。您正在头文件中定义一个全局对象。这有两个问题:"global" 位和 "in a header file" 位。

先从头文件问题说起。 C++ 有一个称为单一定义规则的规则,其中一部分要求您在整个程序中不能对一个对象有多个定义。如果您将此头文件包含在多个实现文件中(请记住,这就像将头文件的内容复制并粘贴到您的源文件中),您将有多个定义,因此打破了一个定义规则。

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

您问的是:

I'd like to know if this is correct (will it backfire?)

如果您 #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 被定义了不止一次的链接器错误。

你还说:

This is not in the context of a proper class, it's just a variable used by many functions.

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

.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;
}