2012-09-03 72 views
0

假设我们有一些使用extern关键字的外部链接。extern vs Singleton class

我有(在class1.cpp):

MyClass* myClassVar = NULL; 

构造函数初始化以上,和析构函数删除。

然后在class2.cpp和class3.cpp有:

extern MyClass* myClassVar; 

这些类使用myClassVar(做通常的null检查等)。

Singleton会被首选吗? (我知道globals是坏的,而Singleton只是语法糖)。将上面的代码更改为以下代码是否有优势?

static Singleton& getInstance() 
{ 
    static Singleton instance; 

    return instance; 
} 

然后,所有的类就可以了:

Singleton::getInstance() 

回答

6

全局变量遭受初始化命令失败。单独翻译单元中的全局变量将以未指定的顺序进行初始化,因此如果在构造函数中引用另一个变量,则会导致未定义的行为。

第一次调用函数时,初始化函数范围内的静态变量,这或多或少地解决了初始化顺序问题。

但是,更微妙的问题仍然存在;特别是,在对象被销毁之后仍然可以访问对象,并且确保线程安全初始化有一些开销(并且在较早的编译器中,初始化可能根本不是线程安全的)。有没有完全安全的方式来管理非平凡类型的全球可访问的对象,我的建议是尽可能避免它们。

+0

+1这确实是真正的优势。 –

4

既然你说你已经知道的任何类型的全局中的挫折,唯一的好处是,你限制类的实例为1,反对使用extern,您可以在其中定义多种此类变量。

+0

你不能真正定义多个具有相同名称的变量,所以差异不成立。 –

+0

@Als我从来没有说过他们有相同的名字。单身人士完全不允许这样做(即使名称不同)。 –

+0

@LuchianGrigore不完全正确。至少不是在实际意义上。没有什么能够阻止你让单身人士成为一个对象数组而不是一个单一的对象:)尽管这首先击败了单身人士的想法。 – s3rius