在课程之间传递地图

时间:2019-04-01 18:39:02

标签: c++ visual-studio c++98

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

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

我的标题中

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。它保持空着

谁能告诉我为什么?

edit:我又看了一眼,看到了怎么做。我知道这是愚蠢的基本知识。我只需要在函数中将mref设置为B中的地图,然后可以调用函数以在B中的该地图上工作。

1 个答案:

答案 0 :(得分:2)

正如@FrancoisAndrieux所指出的那样,您的getMap()仅设置函数本地的引用-而不是类的intdoublemap_t mref。如果要让后者成为其他地方对地图的引用,则有三个选择:

  • 将其制成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%的确定您以错误的方式来完成任务。