是否可以定义一个全局变量并在其中初始化它?

时间:2012-07-03 09:37:01

标签: c++ constructor initialization

我使用全局变量(类的对象)并按如下方式定义:

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

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

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

object_name = class_name(parameters);
来自main()函数的

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

做上面的工作是不是很好的编码风格?

5 个答案:

答案 0 :(得分:3)

没有

在没有充分理由的情况下,不要在C ++中使用全局变量。

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

如果您的全局属于第三方类型,则尤其如此。

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

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

答案 1 :(得分:3)

Construct on first use idiom可以为您省去一些担忧:

// foo.h

class_name& get_obj();

// foo.cpp

class_name& get_obj()
{
    static class_name obj("dir");
    return obj;
}

Another link.

答案 2 :(得分:1)

全局变量几乎总是坏的。但是,如果您没有其他选项(是吗?),我建议您使用指针。这样,您可以在任何位置定义全局指针,并使用operator new在main或任何其他函数中初始化它。但是,这使您负责手动删除对象。

答案 3 :(得分:0)

当然这不是一个好的编码风格。 但并非所有3ed party apis都是“正确的方式”创建的,所以有些情况下你会弯曲规则。如果你这样做,你至少可以严格评论,这样你将来会知道为什么这样做。

答案 4 :(得分:0)

也许这样的事情会有所帮助:

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();