我想通过继承扩展Linux共享对象中的类的C ++ namespace
。可能出现的问题是什么,特别是涉及静态对象和成员数据?
// 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。
答案 0 :(得分:2)
不同翻译单元中(类)全局静态变量的初始化顺序为undefined。但是,如果将类静态变量Pi包装到成员函数中,则将其替换为本地静态对象。有效的C ++第4项:“通过用本地静态对象替换非本地静态对象,避免跨翻译单元的初始化顺序问题。”如果对象保持全局静态,则可能会在其他代码使用它之前保持未初始化状态。
protected:
static double PI()
{
static double PI = 3.141;
return PI;
}