C++类成员变量初始化对象时出现‘unknown type name’编译错误求因
C++类内成员声明区域不能直接写执行语句的原因
问题根源
C++的类/结构体内部,除了成员函数的函数体之外,其余区域属于成员声明区,只能用来做这些事:
- 声明成员变量、成员函数
- 定义嵌套类型(比如内部类、枚举)
- 对成员变量进行类内初始化(C++11及以后支持,比如
Node* left = new Node(0);这种语法)
你写的left -> next = right;是一条执行语句(赋值操作),不属于成员声明的范畴,编译器会错误地把它当成某种类型声明来解析,自然找不到名为left的类型,所以报出"unknown type name 'left'"的错误。
为什么移到方法里就正常
成员函数的函数体是专门用来写执行代码的区域,里面可以写赋值、逻辑判断、函数调用等运行时要执行的操作,编译器会正确识别这些语句的用途,所以不会报错。
正确的写法
把链表的初始化逻辑放到LCache的构造函数里,这是类成员初始化的标准做法:
class Node{ public: int k; Node* prev; Node* next; Node(int key){ k = key; prev = nullptr; // 建议用nullptr代替NULL,C++11及以后更规范 next = nullptr; } }; class LCache { private: Node* left = new Node(0); Node* right = new Node(0); public: // 构造函数里完成链表连接 LCache() { left->next = right; right->prev = left; } // ...你的其他成员函数 };
如果是用C++11之前的标准(不支持类内成员初始化),可以用初始化列表来初始化指针:
class LCache { private: Node* left; Node* right; public: LCache() : left(new Node(0)), right(new Node(0)) { left->next = right; right->prev = left; } // ...你的其他成员函数 };
内容的提问来源于stack exchange,提问作者Pathakbaba
相关产品推荐
相关产品推荐

