C++ c++;跨不同转换单元的变量/实例初始化顺序

C++ c++;跨不同转换单元的变量/实例初始化顺序,c++,design-patterns,initialization,singleton,translation-unit,C++,Design Patterns,Initialization,Singleton,Translation Unit,提前谢谢 我在一些实际项目中看到了这些代码。我只是简化了它们来表达我的问题。基类将这个指针放入其构造函数中的a向量(vec)。使用这个技巧,我们可以利用动态绑定在外部(在main func中)调用派生类的方法。关键点是将向量定义放在Bash.h中,将声明放在main.cpp中 我的问题是,输出不是我想要的。为什么在一个翻译单元(base.c,我们可以看到大小为1)中初始化并使用vec,然后在其他翻译单元(main.c,我们可以看到大小为0)中再次初始化并清除?我想知道不同翻译单位的起始顺序。看起

提前谢谢

我在一些实际项目中看到了这些代码。我只是简化了它们来表达我的问题。基类将这个指针放入其构造函数中的a向量(vec)。使用这个技巧,我们可以利用动态绑定在外部(在main func中)调用派生类的方法。关键点是将向量定义放在Bash.h中,将声明放在main.cpp中

我的问题是,输出不是我想要的。为什么在一个翻译单元(base.c,我们可以看到大小为1)中初始化并使用vec,然后在其他翻译单元(main.c,我们可以看到大小为0)中再次初始化并清除?我想知道不同翻译单位的起始顺序。看起来派生::dInstance是第一个,然后vec是第二个,但是为什么呢

Base.h

\ifndef BASE\u H
#定义基准
#包括
#包括
使用名称空间std;
阶级基础{
公众:
Base();
虚空说话();
};
#恩迪夫
Base.cpp

#包括“Base.h”
向量向量机;
Base::Base(){
向量推回(这个);

cout首先,不同翻译单位的起始顺序没有规律可循


并且,全局变量和全局静态变量将在main函数之前初始化。属于函数FuncA()的局部静态变量将在第一次调用FuncA()时初始化。

首先,对于不同转换单元的初始化顺序没有规则

全局变量和全局静态变量将在main函数之前初始化。属于函数FuncA()的局部静态变量将在第一次调用FuncA()时初始化。

它是

未定义
静态
(或全局)变量之间的初始化顺序。因此,请考虑如果
派生的.cpp
文件在
Base.cpp
之前初始化,然后添加到未初始化(构造)的向量会发生什么情况导致未定义的行为,然后向量被初始化。

它是


未定义
静态
(或全局)变量之间的初始化顺序。因此,请考虑如果
派生的.cpp
文件在
Base.cpp
之前初始化,然后添加到未初始化(构造)的向量会发生什么情况导致未定义的行为,然后向量被初始化。

谢谢你的回复。但是如果我用变量(例如int a)替换向量,在这里重复相同的内容,一切都好。谢谢你的回复。但是如果我用变量(例如int a)替换向量,在这里重复相同的内容,一切都好。
#ifndef BASE_H
#define BASE_h

#include<iostream>
#include<vector>
using namespace std;
class Base{
    public:
        Base();
        virtual void speak();
};

#endif
#include"Base.h"

vector<Base*> vec;
Base::Base() {
    vec.push_back(this);
    cout << "Base's constructor" << endl;
    cout << "Base() vector size: " << vec.size() << endl;**
}

void Base::speak() {
    cout << "I am Base" << endl;
}
#ifndef DERIVE_H
#define DERIVE_h
#include<iostream>
#include"Base.h"

class Derive: public Base {
    public:
        Derive();
        virtual void speak();

        static Derive dInstance;
};
#endif
#include "Derive.h"

// static member definition
Derive Derive::dInstance;

Derive::Derive() {
    cout << "Derived's construtor" << endl;**
}
void Derive::speak() {
    cout << "I am Derived" << endl;
}
#include<iostream>
#include"Base.h"

using namespace std;

extern vector<Base*> vec;
int main(int argc, char *argv[]) {
    cout << "vector size: " << vec.size() << endl;

    for(vector<Base*>::iterator iter = vec.begin(); iter != vec.begin(); iter++) {
        (*iter)->speak();
    }
}
Base's constructor Base() vector size: 1 Derived's constructor main() vector size: 0