C++中如何访问存储在unordered_map中的类的成员方法
问题原因
你用到了std::unordered_map的operator[],该运算符的特性是:当访问的key不存在时,会自动创建一个值类型的默认构造实例插入到map中,再返回该实例的引用。而你的Account类仅定义了带两个参数的有参构造函数,没有提供默认构造函数,不满足operator[]的语法要求,因此编译失败。
解决方案
你可以从以下三种方案中选择符合你需求的处理方式:
- 方案1:为
Account类添加默认构造函数
你可以直接在类定义中补充无参构造的声明,可选择编译器生成默认实现,也可以自定义初始化逻辑:class Account { double balance; std::string username; public: // 新增默认构造,二选一即可 Account() = default; // 编译器生成默认实现 // 或自定义默认构造逻辑 // Account() : balance(0), username("") {} Account(double balance, std::string username); double getBal() { return this->balance; } std::string getName() { return this->username; } void updateBal(double amount) { this->balance += amount; } }; - 方案2:改用
at()方法访问已有元素at()方法不会自动创建新元素,仅会查找已存在的key,找不到时会抛出std::out_of_range异常,不需要值类型支持默认构造:// 把accountList["Test"].getName();替换为如下代码 accountList.at("Test").getName(); - 方案3:用
find()方法查找后访问
如果你需要自行处理key不存在的场景,可以用迭代器查找的方式,也不需要值类型支持默认构造:auto iter = accountList.find("Test"); if (iter != accountList.end()) { iter->second.getName(); }
额外优化建议
你当前定义的getBal()、getName()都是只读成员函数,建议添加const修饰,避免后续在const上下文访问时出现编译错误:
double getBal() const { return this->balance; } std::string getName() const { return this->username; }
内容的提问来源于stack exchange,提问作者ColbyZW
相关产品推荐
相关产品推荐

