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

为了实现该目标,我已经尝试了该问题中给出的建议,但对于以下内容为何行不通,我有些困惑。

在标题中

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

该代码可以很好地编译,并且所有工作都与预期的一样,但是映射完全没有传递给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++ - 在类(class)之间传递 map ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55461590/

    10-13 08:33