组合静态成员和方法

时间:2014-06-04 00:56:15

标签: c++ logging static-methods static-members

考虑一个带有静态成员的类和一个静态方法来设置成员的值(以下是基于@JamesKanze' s example ):

class A_EXPORT InA
{
    public:
     static FILE* ourDest;
     static void setDest( FILE& dest );
};

article (on logging) in Dr. Dobbs表示静态成员和静态方法的组合如下:

// in header file
class A_EXPORT InA
{
    public:
     static FILE*& theDest();  // a static member that is a static method too!
};

// in cpp file
FILE*& InA::theDest()
{
    static FILE* pStream = stderr;
    return pStream;
}

// in user's file
InA::theDest()  =  fopen("log.txt","a"); //std::ofstream( "log.txt" );

问题:组合静态成员和静态方法的优缺点是什么?

2 个答案:

答案 0 :(得分:2)

第二个版本的主要优点是避免静态初始化命令惨败

如果ourDest有构造函数,那么在ourDest的构造函数运行之前,可能会有一个不同的静态对象构造函数尝试使用ourDest ,导致未定义的行为。

但是如果静态对象是在函数内部定义的,那么它是在首次命中该定义时构造的,因此在构造之前不可能访问它。

在您的情况下(类似Dr. Dobbs案例),您的theDest()功能"构建" pStream以类似的方式;这样做可以确保没有人使用pStream并发现它为空。在第一种情况下,outDest如果在调用setDest之前读取,则{{1}}可能为空。

答案 1 :(得分:2)

这种模式通常称为Meyer's singleton,是Singleton设计模式的一种实现。

主要优点是它能够处理static initialization order fiasco,这基本上无法预测静态对象在翻译单元中的初始化顺序。