定义一个全局变量并在那里初始化它本身可以吗?
is it alright to define a global variable and initialize it there itself?
我使用一个全局变量(类的对象)并定义如下:
//foo.h
extern class_name obj_name;
//foo.cpp
class_name obj_name("directory of a .ttf file");
我将 foo.h 包含在我的 main 中.cpp我的 main() 函数所在的位置。
问题是我不太习惯在那里初始化它,因为它不在函数内部。它是公开的。我更喜欢调用一个初始化对象的"init()"函数,如下所示:
object_name = class_name(parameters);
从 main() 函数。
但是该类是第三方类,它不接受在没有我们为构造函数提供参数的情况下创建的对象。也许它没有默认的无参数构造函数。
做我上面做的事情是好的编码风格吗?
No.
没有充分的理由,不要在C++中使用全局变量。
- 您将遇到"静态初始化顺序惨败"。
- 你会得到丑陋的意大利面条代码。
- 您的代码将难以测试。
如果您的全局是第三方类型,则尤其如此。
考虑使用更好的方法,例如允许延迟初始化的工厂方法。或者只是将对象传递给需要它的函数。
还可以考虑用您自己的类包装该第三方类 - 仅提供测试它所需的最小接口,并使用指向该抽象基类的指针。 (或者,如果第三方库支持它 - 使用他们提供的最少的接口,你可以侥幸使用)
首次使用成语构造可以为您省去一些后顾之忧:
// foo.h
class_name& get_obj();
// foo.cpp
class_name& get_obj()
{
static class_name obj("dir");
return obj;
}
另一个链接。
全局变量几乎总是不好的。但是,前提是您没有其他选择(您吗?我会重新评论使用指针。通过这种方式,您可以在任何位置定义全局指针,并使用运算符 new 在 main 或任何其他函数中初始化它。但是,这使您负责手动删除对象。
当然,
这不是一种好的编码风格。但并非所有 3ed 派对 API 都是以"正确的方式"创建的,因此在某些情况下您会改变规则。如果你这样做,你至少可以严格地评论它,这样你以后就会知道你为什么这样做。
也许这样的事情会有所帮助:
class ObjectFactory
{
public:
static class_name* getObject()
{
if( ptr )
return ptr;
else
{
ptr = new class_name( <args> );
return ptr;
}
}
private:
static class_name* ptr;
ObjectFactory() : ptr(NULL) {}
}
每次你需要使用这个对象时,你总是可以做的:
class_name *p = ObjectFactory::getObject();
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++ VISUAL STUDIO:GLFWwindow没有初始化,即使它是在文档中编写的并且以前工作过
- 初始化类中的指针数组,并在另一个类中检索它
- 是否可以在编译时初始化对象的 C 样式函数指针,以便它调用对象的成员函数?
- 初始化一个由 p 指向的新 INTSTK,它最多可以存储 m 个
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 如何在线程中初始化对象,然后在其他地方使用它?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 如果使用返回引用的函数初始化"auto"var,为什么它不声明引用类型?
- 为什么当它打破初始化列表的顺序规则时它会起作用
- 当尝试使用它来初始化数组时,未识别C const静态成员
- 定义一个全局变量并在那里初始化它本身可以吗?
- 尝试使用它来初始化类的成员值时出现initializer_list编译错误
- 变量本身初始化
- std::vector<> 使用 resize() 派生,它不初始化原语和转发construct_back
- 可以使用变量本身初始化表达式