在类之间传递映射
Passing a map between classes
这与我之前的一个问题有关。我还没有设法解决那里的问题,但现在我只是想更好地了解代码以弄清楚如何处理这个问题。
为了实现这一目标,我已经开始尝试该问题中给出的建议,我对为什么以下内容不起作用感到有点困惑。
在我有的标题中
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%确定你以错误的方式处理你的任务。
相关文章:
- 常量映射和常量元素映射之间的区别
- 如何在没有映射的情况下在枚举和字符串之间进行转换?
- C++11 在列表到映射(或其他容器)之间移动元素
- 在类之间传递映射
- 两个进程之间的共享映射内存在编辑时未更新
- 在 C++ 和 C# 之间共享内存映射文件结构
- 遍历std ::映射,效果少于迭代器之间的比较
- 本机C++类与 WinRT 组件(引用类)之间的自动映射
- 映射::擦除:按键擦除或迭代器擦除之间的区别
- 消除类似映射和类似矢量的容器之间的模板专用化
- 高效实现 64 位和 32 位无符号整数之间的双向映射
- 两个映射之间的分配-移动语义和性能
- 如何计算字符串到int的映射之间的所有排列
- Boost管理的映射文件:在OSX和Linux之间不兼容
- 将 1 到 12 之间的数字映射到月份名称
- 希望有效地克服 Boost.Process 间共享内存中映射中键类型之间的不匹配
- 映射和unorderd_map之间的 C 实现差异
- 计算表示稀疏向量 c++ 的映射之间的距离
- c++ 11 STL在两个映射之间使用move赋值合并
- 在 SWIG 传入和 freearg 类型映射之间传递信息