将地图从文件传递到 class c++

pass map from file to class c++

我有这种情况,我试图在填充地图后将其从文件传递到 class:

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.cpp chunks 地图到达时是空的?我认为如果我使用 static 这将解决我的问题。感谢您的宝贵时间!

您在 A.h 中将 chunks 变量声明为 static。就是这个问题。

#includeA.h 的每个 .cpp 都将获得 自己的 chunks 变量副本。这就是为什么 chunksA.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
    }
}