编译器错误:错误:'ListNode'没有命名类型

时间:2015-09-02 23:13:29

标签: c++ class struct

我正在尝试编写我的类和结构实现文件。该类具有struct的变量。我一直在收到错误:

LinkedList.h:70:8:错误:'ListNode'没有命名类型         ListNode * head;

LinkedList.h:71:8:错误:'ListNode'没有命名类型         ListNode * cursor;

LinkedList.h如下所示:

#ifndef CLASS_LINKEDLIST_H
#define CLASS_LINKEDLIST_H

// Header files 

#include <iostream>
#include "ListNode.h"

using namespace std;

class LinkedList 
   {
    public:
    LinkedList( int maxSize = 10 );
    LinkedList( const LinkedList& other );
    ~LinkedList();

    private:

       ListNode* head;
       ListNode* cursor;

       int capacity;
       int size;
   };

#endif // ifndef CLASS_LINKEDLIST

ListNode.h是这样的结构:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

using namespace std;

struct ListNode
   {
     ListNode( int nodeData, ListNode* nextPtr);
     int dataItem;
     ListNode* next;
   };
#endif  // STRUCT_LISTNODE_H

ListNode.cpp看起来像这样:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#include "ListNode.h"
#include <iostream>

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

这是LinkedList.cpp的顶部

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

// header files
#include "LinkedList.h"

我不允许更改.h文件,只更改.cpp文件。我知道有一些简单的东西我忘了包括,但我似乎无法弄明白。

感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分:0)

放置包含防护装置,以便如果多次包含文件,则仅使用一次。

当您包含文件时,出于所有意图和目的,将其复制粘贴到包含文件中,因此对于编译器的预处理器,ListNode.cpp如下所示:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

using namespace std;

struct ListNode
   {
     ListNode( int nodeData, ListNode* nextPtr);
     int dataItem;
     ListNode* next;
   };
#endif  // STRUCT_LISTNODE_H
#include <iostream> //contents of iostream go on for pages. Let's skip those, shall we?

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

打破编译器的目的:

#ifndef STRUCT_LISTNODE_H

如果尚未定义STRUCT_LISTNODE_H,请执行所有操作直到相应的#endif

#define STRUCT_LISTNODE_H 

冷却。刚刚定义了STRUCT_LISTNODE_H。

#ifndef STRUCT_LISTNODE_H

这次定义了STRUCT_LISTNODE_H,所以我们跳到相应的endif:

#endif  // STRUCT_LISTNODE_H

没错,头文件几乎完全被丢弃了。所以要编译的是:

#ifndef STRUCT_LISTNODE_H
#define STRUCT_LISTNODE_H

#ifndef STRUCT_LISTNODE_H
#endif  // STRUCT_LISTNODE_H
#include <iostream> //contents of iostream go on for pages. Let's skip those, shall we?

ListNode:: ListNode(int nodeData, ListNode* nextPtr)
   { 
     dataItem = nodeData;
     next = nextPtr;
   }

#endif // STRUCT_LISTNODE_H

没有ListNode定义的迹象。

所以这并不是说OP使用的包括cpp文件中的防护(并且永远不应该包含cpp文件,因此不需要包含防护),但OP使用相同的包含防护两次。

作为公益广告,关于using namespace std;的通常警告 这个邪恶的小捷径将整个标准库拉入全局命名空间。这意味着如果你有一个名为reverse的函数,它现在必须用std::reverse来解决它,你可能不喜欢谁赢了以及它对你的程序的执行有什么影响。

好的。你的代码就好了,但如果你包括别人怎么办?现在他们与他们没有打算的名字发生冲突,你会发现他们从未见过的奇怪的错误信息,可能无法帮助你。

谨慎使用它。使用std ::

作为前缀
std::cout << "HI!" << std::endl;

或仅将您需要的部分拉入全局命名空间

using std::cout;
using std::endl;

以后

cout << "HI!" << endl;

最重要的是,在包含其他所有人的头文件之后,最后这样做是因为您不知道他们将如何回应。但这是你懒惰的问题。很难成为你。

这就告诉我们为什么你不把using namespace std;放在标题中。一些可怜的吸盘包含您的标头以使用您的库。开个唱!他们继承了你糟糕的编码风格。他们为你的错误而受苦。那不太酷。