c++ - 定义一个全局变量并在那里自己初始化它可以吗?

标签 c++ constructor initialization

我使用了一个全局变量(一个类的对象),定义如下:

//foo.h
extern class_name obj_name;
//foo.cpp
class_name obj_name("directory of a .ttf file");

我在我的 main() 函数所在的 main.cpp 中包含了 foo.h。

问题是我不太愿意在那里初始化它,因为它不在函数内部。它是公开的。我宁愿调用一个初始化对象的“init()”函数,如:

object_name = class_name(parameters);

来自 main() 函数。

但是该类是第 3 方类,它不接受在我们没有为构造函数提供参数的情况下创建的对象。也许它没有默认的无参数构造函数。

我上面所做的是好的编码风格吗?

最佳答案

没有。

如果没有很好的理由,不要在 C++ 中使用全局变量。

  • 您将遇到“静态初始化顺序失败”。
  • 你会得到难看的意大利面条代码。
  • 您的代码将很难测试。

如果您的全局是第 3 方类型,则尤其如此。

考虑使用更好的方法,例如允许延迟初始化的工厂方法。 或者只是将对象传递给需要它的函数。

还可以考虑用您自己的类包装第 3 方类 - 仅提供测试它所需的最少接口(interface),并使用指向该抽象基类的指针。 (或者,如果第 3 方库支持它 - 使用它们提供的最小界面,您可以使用它)

关于c++ - 定义一个全局变量并在那里自己初始化它可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11308193/

相关文章:

java - 这是初始化变量的正确方法吗

c++ - 非阻塞关闭 - 如何确保数据已发送?

c++ - 使用 CMake 创建包含文件

c++ - 有哪些使用 PostgreSQL 以 C/C++ 编写的开源应用程序?

java - "extends"实际上是做什么的?

Java:从字符串初始化一个类

c++ - 在 C++ 的菱形问题中,为什么我们需要从子类调用 grand_parent 构造函数?

c++ - Codelite 中的项目未编译

c - 使用结构数组内部的数组

c++ - 您将如何使用 C++11 初始化函数结果的 const vector ?