定义一个全局变量并在那里初始化它本身可以吗?

is it alright to define a global variable and initialize it there itself?

本文关键字:它本身 初始化 在那里 全局变量 一个 定义      更新时间:2023-10-16

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

//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();
相关文章: