2

我想namespace通过继承来扩展 Linux 共享对象中的类的 C++。可能会出现哪些问题,尤其是涉及静态对象和成员数据的问题?

// as a crude example (note: untested code)
// compiled into libBase.so
namespace foo
{
    class Cfoo
    {
    protected:
        static double Pi; // defined outside header
    public:
        Cfoo () {}
        double fooPi () { Pi *= Pi; return Pi; }
    };
}

// compiled into libDerived.so
namespace foo
{
    class Cbar : public Cfoo
    {
        double barPi () { Pi = sqrt(Pi); return Pi; }
    };
} 

平台:RHEL 5 上的 GCC 4.5。

4

1 回答 1

2

不同翻译单元中(类)全局静态变量的初始化顺序是未定义的。但是,如果将类静态变量 Pi 包装到成员函数中,则将其替换为本地静态对象。Effective C++ Item 4:“通过用本地静态对象替换非本地静态对象来避免跨翻译单元的初始化顺序问题。”。如果对象保持全局静态,则它可能会在其他代码使用它之前保持未初始化。

protected:
     static double PI()
     {
         static double PI = 3.141;
         return PI; 
     }
于 2013-05-07T16:41:13.820 回答