未调用全局对象构造函数
Global object constructor isn't getting called
我的全局对象是在没有调用它们各自的构造函数的情况下创建的:
static int num = 0;
class TestClass
{
public:
int a;
float b;
TestClass(float f)
{
a = 55;
b = f;
++num;
}
};
TestClass test(32);
int main(int argc,char *argv[])
{
std::cout<<"Int: "<<test.a<<std::endl;
std::cout<<"Float: "<<test.b<<std::endl;
std::cout<<"Constructor has been called "<<num<<" times"<<std::endl;
while(true);
return 0;
}
输出为:
Int: 0
Float: 0
Constructor has been called 0 times
我以前在不同的项目中使用过这样的构造函数,从未遇到过这样的问题。我尝试过无参数构造函数并将测试变量设置为静态,两者都没有任何不同的效果。有人能告诉我这是怎么回事吗?
我用的是visual studio 2010,以防有什么不同
我不完全确定,但这可能会回答你的问题:http://www.nsnam.org/docs/linker-problems.doc
编辑添加更多信息:
该文档指出了在不同的编译单元中使用全局构造函数时可能出现的问题。例如,如果您在某个动态链接库中全局定义了一个对象,则在访问该库中的方法时可能不会调用其对象构造函数。
用原题中的例子:类TestClass
和全局对象test
可能在TestLibrary.dll
中,而main()
函数在某个可执行文件中。根据TestLibrary.dll
加载和test
对象从可执行文件中访问的方式,它的构造函数可能永远不会被调用,因为库从未被"告知"它刚刚被加载(或者换句话说:全局初始化函数从未被调用)。
如果你编译你的项目,你链接到你的可执行文件,到一个可执行文件,Visual Studio将链接一切正常,但你的全局构造函数不会被调用。
相关文章:
- 对象实例化调用构造函数的次数太多
- Arduino C++在构造函数中用参数声明对象数组
- 模板,函数使用错误的构造函数来复制我的对象
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 通过构造函数创建的所有对象都具有相同的向量
- 是什么让放置新调用对象的构造函数?
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- C++ 对象指针数组的复制构造函数
- 在构造函数中输入对象时C++类成员作用域
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 如何从构造函数副本 T(const T&)调用对象 T?
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- 如何将我编写的对象传递到另一个类的构造函数中?
- 使用向量初始化参数化构造函数的对象数组
- 在C++中将对象从另一个类传递到另一个类的构造函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 构造函数对象赋值是否泄漏内存
- gcc中不可移动构造函数对象的std::函数