You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:15:03