C++如何创建字典(map)及解决mmap does not name a type运行报错
问题排查与C++ map使用说明
报错根因分析
你遇到的mmap does not name a type以及后续运行错误由以下几个语法/逻辑问题共同导致:
- 类继承语法错误:
class vacuum public: environment是错误写法,正确继承语法是class vacuum : public environment,语法错误会导致编译器解析类定义时逻辑混乱,误把变量识别为类型抛出提示。 - 变量作用域错误:你在
environment类的构造函数内部定义的mymap是局部变量,仅在构造函数执行时有效,构造结束就会被销毁,子类vacuum的print方法根本访问不到这个变量。 - 访问权限错误:
vacuum类的print方法默认是private权限,类外的main函数无法直接调用。 - 随机数逻辑错误:
rand()%1的结果永远是0,无法得到0和1的随机结果,且你没有初始化随机种子,每次运行结果都会固定。 - 主函数格式不规范:标准C++中
main函数的返回值必须是int,而非void。
C++ map(字典)的正确创建方式
map作为字典使用时,根据使用场景有几种常见创建方式:
- 局部变量创建:在函数内部声明直接使用
// 声明一个key为char、value为int的字典 map<char, int> mymap; // 插入方式1:用pair插入 mymap.insert(pair<char, int>('A', 1)); // 插入方式2:用make_pair插入 mymap.insert(make_pair('B', 2)); // 插入方式3:下标赋值 mymap['C'] = 3;
- 类成员变量创建:需要把map声明为类的成员属性,而非构造函数内的局部变量,才能在整个类的生命周期生效,子类继承后也能访问(需要声明为public或者protected权限)。
修复后的完整可运行代码
#include<iostream> #include<ctime> #include<map> #include<stdlib.h> #include <iterator> using namespace std; class environment { public: // 把mymap声明为类的public成员变量 map<char,int> mymap; environment(){ // 初始化随机种子,保证每次运行随机结果不同 srand((unsigned int)time(nullptr)); mymap.insert(pair<char, int>('A', rand()%2)); mymap.insert(pair<char, int>('B', rand()%2)); } }; // 修正继承语法 class vacuum : public environment { public: // 把print改为public权限方便外部调用 void print() { cout<<"printing the conditions of the rooms #0 indicate the room is clean and #1 indicate that the room is dirty "<<endl; cout<<"room1:"<<mymap.at('A'); cout<<endl<<"room2: "<<mymap.at('B')<<endl; } }; int main() { vacuum o; o.print(); return 0; }
内容的提问来源于stack exchange,提问作者user8574515
相关产品推荐
相关产品推荐

