std :: vector不保留在实现中实例化的推回对象

Ehs*_*ini 1 c++ implementation scope vector

我有一个向量和在plane.h中声明的对象:

extern Plane Default;
extern std::vector<Plane *>universe;
Run Code Online (Sandbox Code Playgroud)

它们在plane.cpp中定义:

Plane Default("Default");
std::vector<Plane *>universe;
Run Code Online (Sandbox Code Playgroud)

平面构造函数:

Plane::Plane(const std::string &label) {
    /* check universe to ensure uniqueness */
    std::cout << this << std:endl; //DEBUG CHECK to see what I push_back

    universe.push_back(this); //ACTION to keep track of the planes

    std::cout << universe.back() << std::endl; //DEBUG CHECK to ensure that it was stored correctly
}
Run Code Online (Sandbox Code Playgroud)

输出确认平面确实存储在矢量中.

主要:

if(universe.empty()) cout << "EMPTY UNIVERSE" << endl;
Run Code Online (Sandbox Code Playgroud)

表明向量没有保留该值.我期望Default(在plane.cpp中定义)存储在Universe中.

演示

但是,当我从main实例化平面时,Universe会保留这些值

我想这与本地副本,范围和值传递有关,但我无法找到一种方法来实例化实现中的默认平面,以便其地址保留在向量中.

我也尝试从堆中声明向量,如下所示:

extern std::vector<Plane *> *universe;
Run Code Online (Sandbox Code Playgroud)

并定义如下:

std::vector<Plane *> *universe = new std::vector<Plane *>;
Run Code Online (Sandbox Code Playgroud)

它刚刚破坏了程序.我在代码:块16.01和-std = C++ 11中的64位Vista机器上使用MinGW32 4.9

Jar*_*d42 5

您点击全局初始化顺序fiasco:

Plane Default("Default");
std::vector<Plane *>universe;
Run Code Online (Sandbox Code Playgroud)

Default依赖于universe,但是当构造时Default,universe还没有构建.

这就是你应该避免全球化的原因.

假设存在相同的翻译单元,在您的情况下解决方法是更改​​顺序:

std::vector<Plane *>universe;
Plane Default("Default");
Run Code Online (Sandbox Code Playgroud)