C++能否将map作为类属性?实例化对象提示标识符未定义如何解决
问题解答
C++完全支持将std::map作为类的成员属性,你遇到的报错和map本身的特性无关,是代码写法存在逻辑和语法错误导致的。
报错原因
- 你写的Boss类没有定义对应参数列表的构造函数,本身就不支持按你写的传参顺序直接初始化对象,且类定义末尾大括号后缺少C++要求的结尾分号,属于基础语法错误。
- 你在构造函数传参位置写
absorptions.insert(...)、resistances.insert(...)时,Boss对象还没创建完成,作为对象成员的absorptions和resistances根本不存在,编译器在当前作用域找不到这两个标识符,自然报「标识符未定义」错误。
修复方案
方案1:自定义带参构造函数,传临时map对象初始化
先补全类的构造函数,传参时直接传入构造完成的临时map对象,不要在传参阶段调用还不存在的成员方法:
// 记得先引入依赖头文件 #include <string> #include <map> #include <utility> using namespace std; class Boss { public: string name; string type; int hp; bool parriable; bool breakPoise; string damageTypeDealt; map<string, int> absorptions; map<string, int> resistances; // 带参构造函数,用初始化列表给成员赋值 Boss(string name, string type, int hp, bool parriable, bool breakPoise, string damageTypeDealt, map<string, int> absorptions, map<string, int> resistances) : name(move(name)), type(move(type)), hp(hp), parriable(parriable), breakPoise(breakPoise), damageTypeDealt(move(damageTypeDealt)), absorptions(move(absorptions)), resistances(move(resistances)) {} }; int main() { // 实例化对象,直接传初始化完成的临时map Boss godrickTheGrafted( "Godrick the Grafted", "Legend Boss", 6080, false, true, "Standard Damage, Fire Damage", map<string, int>{{"Phy (Standard)", 0}}, map<string, int>{{"Not yet", 0}} ); // 对象创建完成后,再调用insert给map追加内容即可 godrickTheGrafted.absorptions.insert({"Fire", 35}); return 0; }
方案2:先创建空对象,再逐个给成员赋值
如果觉得构造时传太多参数太麻烦,可以先实例化空对象,再逐个给成员赋值、填充map内容,逻辑更直观不容易写错:
#include <string> #include <map> using namespace std; class Boss { public: string name; string type; int hp; bool parriable; bool breakPoise; string damageTypeDealt; map<string, int> absorptions; map<string, int> resistances; }; // 记得这里必须加分号 int main() { Boss godrickTheGrafted; godrickTheGrafted.name = "Godrick the Grafted"; godrickTheGrafted.type = "Legend Boss"; godrickTheGrafted.hp = 6080; godrickTheGrafted.parriable = false; godrickTheGrafted.breakPoise = true; godrickTheGrafted.damageTypeDealt = "Standard Damage, Fire Damage"; // 对象存在了再调用insert就不会报错 godrickTheGrafted.absorptions.insert(pair<string, int>("Phy (Standard)", 0)); godrickTheGrafted.resistances.insert(pair<string, int>("Not yet", 0)); return 0; }
内容的提问来源于stack exchange,提问作者NKelley
相关产品推荐
相关产品推荐

