2017-10-19 75 views
0

我想使用指向節點的鏈接列表。 List是Node的容器類。我試圖格式化查找函數的列表,當鏈接列表中找到該節點時,返回指向節點的指針。但是,我不斷收到錯誤,說沒有類型說明符。 (錯誤顯示在下面鏈接的屏幕截圖中,主要查看Node.h中的第10行和第17行)。我如何正確格式化以擺脫錯誤? https://imgur.com/vicL8FS形成一個返回指向包含類的指針的函數?

NODE.H //Both class declarations contained here 
class list //container class 
{ 
public: 
    list(); 
    ~list(); 
    void insert(string f, string l, int a); 
    node *find(string first, string last); //Pointer to contained class 
private: 
    node *head; //errors here 
    int length; 
}; 
class node 
{ 
    friend list; 
public: 
    node();       // Null constructor 
    ~node();       // Destructor 
    void put(ostream &out);   // Put 
    bool operator == (const node &); // Equal 
private: 
    string first, last; 
    node *next; 
}; 

NODE.CPP 

#include "Node.h" 
    node list::*find(string first, string last) 
    { 
     return NULL; //logic not written yet 
    } 
//MAIN 
p = a.find(first, last); //p is a pointer to node, a is a list. 
+0

嘗試'node * list :: find(string first,string last)'。 –

+0

這不起作用。它只是增加了另一個錯誤 –

+0

也許,但是'node * list :: find(string first,string last)'是無效的。因爲返回類型是'node *',函數名是'list :: find'。你不能混用它們。 –

回答

1

眼下nodelist後定義和名稱node不知道它開始分析list類主體時,編譯器。您需要添加一個向前聲明:

class node; 

class list 
{ 
... 

所以node將是正確識別的類型名稱。

+0

這似乎清除了錯誤。要明確,這不會重新定義任何變量?我不必移動節點定義下的整個列表定義? –

+0

不,這不會重新定義任何東西。前向聲明只會將'node'識別爲類型名稱。在'node'定義下移動整個'list'定義將是解決錯誤的另一種方法。請注意'friend list;'聲明不需要'list'已經被聲明。 – VTT

0

錯誤的原因是,當編譯器編譯類list的定義時,它不知道名稱node是如何聲明的。

有幾種方法可以解決問題。你可以使用詳細的類名。

例如,您可以首先定義類節點並使用詳細的類名列表。

class node 
{ 
    friend class list; 
public: 
    node();       // Null constructor 
    ~node();       // Destructor 
    void put(ostream &out);   // Put 
    bool operator == (const node &); // Equal 
private: 
    string first, last; 
    node *next; 
}; 

class list 
{ 
    //... 
}; 

或者你也可以在類list定義使用類node的詳盡的名字。例如

class list //container class 
{ 
public: 
    list(); 
    ~list(); 
    void insert(string f, string l, int a); 
    class node *find(string first, string last); //Pointer to contained class 
private: 
    class node *head; 
    int length; 
}; 

class node 
{ 
    //... 
}; 

或者您可以使用node類的前向聲明。

class node; 

class list //container class 
{ 
public: 
    list(); 
    ~list(); 
    void insert(string f, string l, int a); 
    node *find(string first, string last); //Pointer to contained class 
private: 
    node *head; 
    int length; 
}; 

class node 
{ 
    //... 
}; 

或者您可以使用類list的前向聲明。

class list; 

class node 
{ 
    friend list; 
public: 
    node();       // Null constructor 
    ~node();       // Destructor 
    void put(ostream &out);   // Put 
    bool operator == (const node &); // Equal 
private: 
    string first, last; 
    node *next; 
}; 

class list 
{ 
    //... 
}; 
相關問題