在类之间传递映射

Passing a map between classes

本文关键字:映射 之间      更新时间:2023-10-16

这与我之前的一个问题有关。我还没有设法解决那里的问题,但现在我只是想更好地了解代码以弄清楚如何处理这个问题。

为了实现这一目标,我已经开始尝试该问题中给出的建议,我对为什么以下内容不起作用感到有点困惑。

在我有的标题中

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; }

和在主((

A a;
a.setkey(10);
a.setvalue(1232.2);
a.insertIntoMap();
B b;
b.mapValues(a);

代码编译良好,与 a 相关的一切都按预期工作,但地图根本没有传递给 b。它保持为空

谁能告诉我为什么?

编辑:我又看了一下这个,看看怎么做。我知道这是愚蠢的基本东西。我只需要将函数中的 mref 设置为 B 中的地图,然后可以调用一个函数来处理 B 中的该地图。

正如@FrancoisAndrieux所指出的,您的getMap()只设置函数的本地引用 - 而不是类的intdoublemap_t mref。如果您希望后者引用其他地方的地图,则有三种选择:

  • 让它intdoublemap_t& mref在构造 B 实例时初始化它。
  • 让它std::reference_wrapper<intdoublemap_t> mref,随时设置(例如mapValues().
  • 让它intdoublemap_t*(或std::shared_ptr<intdoublemap_t> A 和 B 中(,随时设置。

注意:正如@FrancoisAndrieux在注释中所说,使用第二个和第三个选项(并且没有std::shared_ptr(,您必须小心,不要在原始对象的生命周期到期后允许使用引用。

说了以上所有内容 - 我还必须说你的设计对我来说似乎很不对劲。你真的不应该做任何这些事情,我99%确定你以错误的方式处理你的任务。