我有一个节点类,它在简单的头声明中给出了以下编译器错误。我真的不明白为什么它会被造成?!
1> Node.h(4): error : invalid redeclaration of type name "Node" (declared at line 4)
1> class Node{
1> ^
部首:
using namespace std;
class Node{ //THIS IS LINE 4
public:
Node(int val);
int val;
Node* l_node;
Node* r_node;
private:
};
来源:
#include "Node.h"
Node::Node(int x) : l_node(nullptr), r_node(nullptr), val(x){
}
我需要转发声明吗?
答案 0 :(得分:6)
编写头文件时,请务必记住编写一个包含文件。
#ifndef NODE_H
#define NODE_H
class Node{
public:
explicit Node(int val); // add explicit to disable implicit conversion
int val;
Node* l_node;
Node* r_node;
};
#endif
此外,在头文件中使用 NOT 使用using
指令;这是不好的做法。
在构造函数中,要注意成员初始化顺序。按声明顺序初始化成员,否则您可能会遇到初始化订单问题:
Node::Node(int x) : val(x), l_node(nullptr), r_node(nullptr){
}
答案 1 :(得分:0)
除了包含警卫之外,您几乎应该始终为每个标头创建相应的.cpp文件,并将实现放在那里。如果您有多个使用相同标头的库,并且它们由第三个程序链接在一起,则会产生链接器错误。包括警卫不会保护您免受这种情况的影响。