这与我先前提出的问题有关。我没有设法解决那里的问题,但是现在我只是想更好地了解代码以弄清楚如何处理该问题。
为了实现该目标,我已经尝试了该问题中给出的建议,但对于以下内容为何行不通,我有些困惑。
在标题中
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/