【发布时间】:2020-03-27 01:17:06
【问题描述】:
我有以下代码,但运行代码后,结果为空,任何想法为什么结果为空?函数 main 中结果的引用已传递给 myclass,我认为函数 addToResult 实际上会将数据添加到结果中,并且我期望映射键 =“测试”,值 =“1”:“1”。我是 C++ 的新手。谢谢!
#include <iostream>
#include <string>
#include <unordered_map>
using LookUpTable = std::unordered_map<std::string, std::string>;
using DLTable = std::unordered_map<std::string, LookUpTable>;
class MyClass
{
public:
MyClass(DLTable& dltable) {
m_dltable = dltable;
};
void addToResult() {
LookUpTable ee;
ee.emplace("1", "1");
m_dltable.emplace("test", ee);
};
private:
DLTable m_dltable;
};
int main ()
{
DLTable result;
MyClass myclass(result);
myclass.addToResult();
std::cout << "myrecipe contains:" << std::endl;
for (auto& x: result) {
std::cout << x.first << ": "<< std::endl;
for (auto& xx : x.second) {
std::cout << xx.first << ": " << xx.second << std::endl;
}
}
std::cout << std::endl;
return 0;
}
【问题讨论】:
-
“函数 main 中结果的引用已传递给 myclass”——太好了,它被复制到类成员
m_dltable中。 “我认为函数 addToResult 实际上会将数据添加到结果中”——为什么?它将它添加到名为m_dltable的类的成员中,它与构造函数的参数完全无关,它被复制到m_dltable中。 C++ 不能以这种方式工作。仅仅因为 A 是从 B 初始化的,并不意味着对 A 的更改会自动复制到 B。现在,如果m_dltable本身是一个引用,那么情况就不同了。 -
你为什么要这样做呢?只需编写一个返回对
m_dltable的引用的getter 函数并使用它来迭代。那么你也不需要向构造函数传递任何东西。 -
@Slava A
const参考。否则你当然不会成功private。 -
@walnut 很抱歉反应过激,但是你需要小心你对新手程序员的建议,OP 已经尝试绕过封装,他的方法太天真了。
标签: c++ pointers reference unordered-map