C++ C++;类的静态成员在构造函数之后初始化

C++ 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之前定义,并且类位于静态库中时,

我有一个问题,类的静态成员没有在构造函数之前初始化。我做错什么了吗?这是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之前定义,并且类位于静态库中时,才会发生这种情况

静态库头(静态库本身命名为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