2015-09-02 83 views
0

我想寫我的類和結構實現文件。該類有來自結構的變量。我不斷收到錯誤:編譯器錯誤:錯誤:'ListNode'沒有命名一個類型

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

* LinkedList.cpp *爲什麼包含警衛?它是否被另一個文件包含? –

+4

是的,從你的CPP文件中刪除包含警衛。包括警衛通常是說'#ifndef filename_h'的行。 –

+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::cout << "HI!" << std::endl; 

或只拉你需要進入全局命名空間碎片

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

後來

cout << "HI!" << endl; 

更重要的是做這最後包括其他人的頭部之後因爲你不知道他們將如何迴應。但這是你懶惰的問題。糟透了就是你。

而這使我們知道爲什麼你不把using namespace std;放在標題中。一些糟糕的吸盤包括你的標題來使用你的圖書館。開個唱!他們繼承了你糟糕的編碼風格。他們爲你的錯誤而苦惱。這並不酷。

相關問題