C++ C++;类的静态成员在构造函数之后初始化
我有一个问题,类的静态成员没有在构造函数之前初始化。我做错什么了吗?这是G++中的一个bug吗? 有解决办法吗 g++--版本:(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4C++ C++;类的静态成员在构造函数之后初始化,c++,static,g++,global-variables,static-libraries,C++,Static,G++,Global Variables,Static Libraries,我有一个问题,类的静态成员没有在构造函数之前初始化。我做错什么了吗?这是G++中的一个bug吗? 有解决办法吗 g++--版本:(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4 我也使用Eclipse作为IDE,但我只是将静态库头复制到/usr/include/StaticTestLib/InitTest.h,将库复制到/usr/lib/x86_64-linux-gnu/libStaticTestLib.a 注意,只有当保存数据的对象在main之前定义,并且类位于静态库中时,
我也使用Eclipse作为IDE,但我只是将静态库头复制到/usr/include/StaticTestLib/InitTest.h,将库复制到/usr/lib/x86_64-linux-gnu/libStaticTestLib.a 注意,只有当保存数据的对象在main之前定义,并且类位于静态库中时,才会发生这种情况 静态库头(静态库本身命名为StaticTestLib): InitTest.h
#包括
命名空间静态测试库{
类通知程序头{
公众:
通知程序_头(){
我猜这与未定义的不同编译单元中静态对象初始化的顺序有关
第二个代码段是在main
中创建test
对象的代码段,这很容易解释。静态初始化总是在执行任何代码之前发生,因此当您输入main时,您的通知程序
头肯定已创建
现在,当您在main
之前创建test
时,您有两个静态对象。notifier\u header
对象不依赖于您的InitTest
:它的作用域在该类中,但它存储在静态内存中。您似乎引用了InitTest.cpp
中的notifier\u header
,它是与main
不同的编译单元。编译器可以按照任意顺序为这两个单元进行静态分配,前提是没有相互依赖关系
如果您的构造函数依赖于通知程序_header
,则可以将其用作单例。创建一个返回静态对象实例的函数(headerInstance
,在下面的示例中),在调用该函数时,将创建该对象:
#include <iostream>
namespace StaticTestLib {
class notifier_header{
public:
notifier_header(){
std::cout<<"static var init"<<std::endl;
}
};
class InitTest {
public:
InitTest();
virtual ~InitTest();
notifier_header& headerInstance();
};
}
但如果我需要在InitTest构造函数中初始化通知程序_头怎么办?它不会,它只会崩溃(这只是一个小例子,我在我的项目中经历过这一点,我被困在这一点上),通过使headerInstance()非静态使其在静态方法中不可访问。我正在测试使其静态。(在我真正的项目中)编辑:它似乎没有崩溃,但有些东西不起作用,仔细研究一下。好的,在我的项目中使它起作用,只是必须使方法headerInstance()静态。(并修复一些其他错误)谢谢。
#include "InitTest.h"
namespace StaticTestLib {
notifier_header InitTest::_header_notifier;
class notifier_cpp{
public:
notifier_cpp(){
std::cout<<"code before constructor"<<std::endl;
}
}_notifier_in_cpp;
InitTest::InitTest() {
std::cout<<"constructor"<<std::endl;
}
InitTest::~InitTest() {
std::cout<<"destructor"<<std::endl;
}
}
#include <iostream>
#include <StaticTestLib/InitTest.h>
StaticTestLib::InitTest test;
int main() {
std::cout << "program main" << std::endl;
std::cout << "program end" << std::endl;
return 0;
}
constructor
static var init
code before constructor
program main
program end
destructor
#include <iostream>
#include <StaticTestLib/InitTest.h>
int main() {
std::cout << "program main" << std::endl;
StaticTestLib::InitTest test;
std::cout << "program end" << std::endl;
return 0;
}
static var init
code before constructor
program main
contructor
program end
destructor
#include <iostream>
namespace StaticTestLib {
class notifier_header{
public:
notifier_header(){
std::cout<<"static var init"<<std::endl;
}
};
class InitTest {
public:
InitTest();
virtual ~InitTest();
notifier_header& headerInstance();
};
}
#include "InitTest.h"
namespace StaticTestLib {
class notifier_cpp{
public:
notifier_cpp(){
std::cout<<"code before constructor"<<std::endl;
}
}_notifier_in_cpp;
InitTest::InitTest() {
headerInstance();
std::cout<<"constructor"<<std::endl;
}
InitTest::~InitTest() {
std::cout<<"destructor"<<std::endl;
}
notifier_header& InitTest::headerInstance() {
static notifier_header _header_notifier; // will only be constructed once
return _header_notifier;
}
}
static var init
constructor
code before constructor
program main
program end
destructor