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
您点击全局初始化顺序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)