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

異なる翻訳単位での (クラス) グローバル静的変数の初期化の順序はundefinedです。ただし、クラス静的変数 Pi をメンバー関数にラップする場合は、それをローカルの静的オブジェクトに置き換えます。効果的な C++ 項目 4: 「非ローカル静的オブジェクトをローカル静的オブジェクトに置き換えることにより、翻訳単位全体での初期化順序の問題を回避します。」. オブジェクトがグローバルに静的なままである場合、他のコードが使用する前に初期化されないままになることがあります..

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