【发布时间】:2013-09-18 09:48:58
【问题描述】:
我遇到了一个奇怪的问题,
在A类中声明一个名为B类的静态成员变量。并在cpp文件中初始化。但是 B 类的构造函数从未被调用过。我尝试使用一些小测试,可以正常调用测试构造函数。所以这对我们的生产系统来说很奇怪。
这样的代码,在hpp中:
class Test
{
public:
Test()
{
ofstream file("/tmp/wup.txt",ios::app);
file << "wup in test" << endl;
file.close();
}
};
//## An extended personality
class TsdNAExtPersonality : public TsdNAPersonality{
public:
TsdNAExtPersonality(
s_gg62_personRec * gg62Header,
TsdNAFunctionType requiredFunctionType);
private:
static Test test;
public:
TsdNAExtPersonality( string * personalityFile, TsdNAFunctionType requiredFunctionType);
};
在另一个 cpp 文件中,我使用
进行初始化Test TsdNAExtPersonality::test;
我尝试了几种方法,但我发现所有方法都没有用。
- 没有将变量设置为成员变量而是全局变量==>也无法输出
- 改变成员变量为指针,改变初始化方式为使用new ==> no
环境为HP-UX,编译为aCC
所以我的问题是:
是否有任何编译选项会影响变量?也就是说,所有的静态变量都不会被初始化。
从 C++ 标准来看,它应该在加载库时调用,对吧?
我用同样的方法放了另一个静态int值,它可以被初始化。但是没有调用类构造函数,很奇怪。
我的代码有错误吗?
【问题讨论】:
-
SSCCE 如果你不初始化,这里会给出相同的结果。变量。 This SSCCE 确实运行了静态变量的构造函数。
-
你确定没有调用构造函数吗?你确定这不仅仅是你没有权限去做你想做的事情的问题吗?如果将构造函数中的代码直接放在主函数中会发生什么?
-
@BenjaminLindley 偷了我的评论 - 几乎可以肯定不是构造函数丢失了,而是您无法完成特定的文件操作。您是否检查了 ofstream 对象中的错误[它未在示例中列出]?
-
请注意,静态变量的构造函数在 main 之前运行,所以如果你希望静态变量的构造函数会对 main 中创建的对象的状态产生一些影响,它不会像这样发生那个。
-
@BenjaminLindley 我确定没有调用构造函数,因为我设置了另一个变量,例如 i = 4,我发现 i 仍然是 0。
标签: c++ unix static constructor acc