【问题标题】:pass map from file to class c++将映射从文件传递到 C++ 类
【发布时间】:2021-10-25 22:44:39
【问题描述】:

我遇到这种情况,我在填充地图后尝试将地图从文件传递到类:

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 这将解决我的问题。感谢您的宝贵时间!

【问题讨论】:

  • 仅供参考 /- chunks.insert(pair&lt;glm::ivec3, Chunk*&gt;(pos, chunk)); 可以简化为 chunks[pos] = chunk;

标签: c++ unordered-map


【解决方案1】:

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

每个.cpp#includeA.h 都将获得chunks 变量的自己的副本。这就是为什么chunksA.cpp 中填充但在B.cpp 中为空。

如果要跨翻译单元共享chunks变量,需要声明extern而不是static,然后在定义 .cpp 文件之一,例如:

啊.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
    }
}

【讨论】:

  • 非常感谢,成功了!我实际上尝试在 A.h 中使用 extern 声明它,但我没有在 A.cpp 中定义它,而且我遇到了奇怪的错误..
  • 或者更好的是,传递chunks,而不是让函数依赖于一个神奇的全局状态,所以你会有using ChunksMap = std::unordered_map&lt;glm::ivec3, Chunk*, KeyHasher&gt;;然后B::my_func(const ChunksMap&amp; chunks) { ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2019-08-16
相关资源
最近更新 更多