这与我先前提出的问题有关。我没有设法解决那里的问题,但是现在我只是想更好地了解代码以弄清楚如何处理该问题。
朝着这个目标迈进,我已经尝试了该问题中给出的建议,但对于以下内容为何行不通,我有些困惑。
我的标题中
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中的该地图上工作。
答案 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%的确定您以错误的方式来完成任务。