我想通过继承扩展 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。
最佳答案
不同翻译单元中(类)全局静态变量的初始化顺序为undefined 。但是,如果将类静态变量 Pi 包装到成员函数中,则将其替换为本地静态对象。有效的 C++ 第 4 条:“通过用本地静态对象替换非本地静态对象来避免跨翻译单元的初始化顺序问题。”。如果该对象保持全局静态,则可能会发生在其他代码使用它之前它保持未初始化的情况。
protected:
static double PI()
{
static double PI = 3.141;
return PI;
}
关于c++ - 从共享对象中的类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16423731/