节点类 - 我疯了吗?

时间:2013-11-09 00:34:11

标签: c++

我有一个节点类,它在简单的头声明中给出了以下编译器错误。我真的不明白为什么它会被造成?!

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){

}

我需要转发声明吗?

2 个答案:

答案 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文件,并将实现放在那里。如果您有多个使用相同标头的库,并且它们由第三个程序链接在一起,则会产生链接器错误。包括警卫不会保护您免受这种情况的影响。

相关问题