这与我之前的一个问题有关。我还没有设法解决那里的问题,但现在我只是想更好地熟悉代码以弄清楚如何处理该问题。
为了实现该目标,我已经开始尝试该问题中给出的建议,但我对以下内容为何不起作用感到有点困惑。
在标题中我有
class A {
public:
typedef std::multimap<int, double> intdoublemap_t;
const intdoublemap_t& getMap() const;
void setkey(int k);
void setvalue(double v);
void insertIntoMap();
intdoublemap_t mMapA;
private:
int key;
double value;
};
class B {
public:
typedef std::multimap<int, double> intdoublemap_t;
void mapValues(const A& a);
private:
intdoublemap_t mMapB;
};
在我的实现中
const A::intdoublemap_t& A::getMap() const { return mMapA; }
void A::setkey(int k) { key = k; }
void A::setvalue(double v) { value = v; }
void A::insertIntoMap(){mMapA.insert(std::make_pair(key, value));}
void B::mapValues(const A & a){ const A::intdoublemap_t& mref = a.getMap();
mMapB = mref; }
在 main() 中
A a;
a.setkey(10);
a.setvalue(1232.2);
a.insertIntoMap();
B b;
b.mapValues(a);
代码编译正常,与 a 相关的所有内容都按预期工作,但 map 根本没有传递给 b。它保持为空
谁能告诉我为什么?
编辑:我又看了一眼,看看如何去做。我知道这是非常基础的东西。我只需要将函数中的 mref 设置为 B 中的映射,然后可以调用函数在 B 中处理该映射。
最佳答案
正如@FrancoisAndrieux 指出的那样,您的 getMap()
只设置函数的局部引用 - 而不是类'intdoublemap_t mref
.如果您希望后者成为对其他地方 map 的引用,您有以下三种选择:
- 成功
intdoublemap_t& mref
,在构建 B 实例时对其进行初始化。 - 成功
std::reference_wrapper<intdoublemap_t> mref
, 随时设置它(例如在mapValues()
中。 - 成功
intdoublemap_t*
(或 A 和 B 中的std::shared_ptr<intdoublemap_t>
),随时设置。
注意:正如@FrancoisAndrieux 在评论中所说,使用第二个和第三个选项(不使用 std::shared_ptr
),您必须小心不要在原始对象的生命周期过期后使用引用.
说了以上所有内容 - 我还必须说,您的设计对我来说似乎不太对劲。你真的不应该做任何这些事情,我 99% 确定你正在以错误的方式完成你的任务。
关于c++ - 在类之间传递映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461590/