c++ - 在类之间传递映射

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

代码编译正常,与 a 相关的所有内容都按预期工作,但 map 根本没有传递给 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++ - 在类之间传递映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461590/

相关文章:

c++ - 在另一个类声明中创建一个类的对象时出现 "Expected a type specifier"错误

c++ - 当我通过删除临时节点来释放内存时,我遇到了读取访问冲突。但只有当我返回虚假陈述时

c++ - 在C++中,什么时候应该使用std::any,std::variant或std::optional?

c++ - 为什么 Windows Defender 扫描我的代码?

c++ - 在类定义之外的模板类成员函数主体中,何时需要模板参数?

c++ - 0xC0000005 : Access violation writing in loaction

visual-studio - 如何在 Visual Studio 中制作纯汇编项目?

c++ - 如何重写 Visual Studio 文本编辑器的部分内容?

c++ - 同时支持C++98和C++11

c++ - 关于ifstream : error ‘std::ios_base::ios_base(const std::ios_base&)’ is private