我使用全局变量(类的对象)并按如下方式定义:
//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()函数的。
但是该类是第三方类,它不接受在没有我们为构造函数提供参数的情况下创建的对象。也许它没有默认的无参数构造函数。
做上面的工作是不是很好的编码风格?
答案 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;
}
答案 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();