我正在尝试编写我的类和结构实现文件。该类具有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文件。我知道有一些简单的东西我忘了包括,但我似乎无法弄明白。
感谢您提前提供任何帮助。
答案 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;
放在标题中。一些可怜的吸盘包含您的标头以使用您的库。开个唱!他们继承了你糟糕的编码风格。他们为你的错误而受苦。那不太酷。