我有这种情况,我试图传递一个映射后,我填充它,从一个文件到一个类:
A.h-一个正常的头文件,我有一个函数原型和一个映射
#include <unordered_map>
func1();
static std::unordered_map<glm::ivec3, Chunk*, KeyHasher> chunks;
A.cpp
#include "A.h"
func1() {
// ...
chunks.insert(pair<glm::ivec3, Chunk*>(pos, chunk));
cout << chunks.size(); // here I have the right size
// ...
}
B.h
#include "A.h"
class B {
public:
my_func();
}
B.cpp
B::my_func() {
// ...
cout << chunks.size(); // size is 0
for (auto& c : chunks) {
// ... do something
}
}
我的问题是,为什么在b.pchunks
地图到达空?我想如果我用static
就能解决问题。感谢您的宝贵时间!
将chunks
变量声明为A.h
中的static
。这就是问题所在。
每个.cpp
,#include
的A.h
将获得chunks
变量的副本。这就是为什么chunks
在A.cpp
中填充,而在B.cpp
中为空。
如果您想在翻译单元之间共享chunks
变量,则需要将声明为为extern
而不是static
,然后在.cpp
文件之一中定义,例如:
A.h
#include <unordered_map>
func1();
extern std::unordered_map<glm::ivec3, Chunk*, KeyHasher> chunks;
A.cpp
#include "A.h"
std::unordered_map<glm::ivec3, Chunk*, KeyHasher> chunks;
func1() {
// ...
chunks.insert(pair<glm::ivec3, Chunk*>(pos, chunk));
cout << chunks.size(); // here I have the right size
// ...
}
B.h
class B {
public:
my_func();
};
B.cpp
#include "B.h"
#include "A.h"
B::my_func() {
// ...
cout << chunks.size(); // here I have the right size
for (auto& c : chunks) {
// ... do something
}
}