在 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;
}
现在我正在 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;
}