2013-03-26 142 views
1
class LinkedList_Movies 
{ 
private: 
    class Node 
    { 
    public: 
     Movie* data; 
     Node* next;     
    }; 
    Node* head; 

public: 
    LinkedList_Movies() { head = NULL; } 
    ~LinkedList_Movies(); 
    Movie* searchById(const string& id); 
    void Add(const string& id, const string& name); 
    void Print(); 
    Node* FindPlace(); // <<<<<<<< this func 

}; 

上面是我的鏈接列表.h文件。 我想返回一個指向Node的指針。但在.cpp文件,它不會讓我做到以下幾點:返回班級內的私人班級

Node* LinkedList_Movies::FindPlace() 
{ 

} 

,它在告訴我:Node is undefined

我知道Node是私人的。那麼,我該如何回報呢?

+1

'Node'是不是像你這樣的頂級類將其視爲是。 – chris 2013-03-26 21:26:28

+0

只要類聲明是私有的,就不能爲公共訪問做到這一點。 – 2013-03-26 21:29:13

+0

鏈接列表通常不是這樣做的。此外,如果您打算擁有可訪問的世界,那麼將課程設計爲私人設計的原因是什麼? – andre 2013-03-26 21:29:46

回答

8

需要判定Node,因爲你正在定義之外的類功能

LinkedList_Movies::Node* LinkedList_Movies::FindPlace() 
{ 

} 

注意,該函數的調用者將無法再存儲指針很容易:因爲LinkedList_Movies::Nodeprivate

LinkedList_Movies movies; 
LinkedList_Movies::Node* node = movies.FindPlace(); 

這會給出一個編譯器錯誤。但是,這可能與您想要的完全相同。

可能爲他們使用auto雖然做到這一點:

LinkedList_Movies movies; 
auto node = movies.FindPlace(); 

或者等價地,路過的推斷模板參數時:

template <typename T> 
void foo(T t); 

foo(movies.FindPlace()); 
3

首先,類型名稱是LinkedList_Movies :: Node,不是「Node」。

其次,這可能不會工作,因爲該類是私人的。即使它起作用,對其他功能也是無用的,因爲這些對於這個對象是什麼以及如何使用它都知之甚少。您試圖執行的這個功能可能是私有的,因爲Node類型僅對您的LinkedList_Movies類有用。

+2

其次呢? – Shoe 2013-03-26 21:26:59

+0

「其次,」這可能不會工作,因爲這個類是私有的(即使它起作用,對其他函數也是無用的,因爲這些對於這個對象是什麼以及如何使用它都不知道。你試圖做的功能可以是私人的,因爲節點類型只對你的LinkedList_Movies類有用 – 2013-03-26 21:29:08

+0

是我的客人(唯一的問題是一切都已經說過,4次(; – 2013-03-26 21:32:50

2

至於你說你的自我:節點是LinkedList_Movies類的私有子類。你必須解決其範圍類定義本身之外調用它時:

LinkedList_Moves::Node* LinkedList_Movies::FindPlace(); 

否則編譯器會嘗試尋找一類Node在於,在這種情況下,不存在全局範圍。

0

您需要指定Node類的全名,即LinkedList_Movies :: Node。但是,在公共方法中返回指向私有類型的指針有什麼意義?無論如何,只有私人方法才能夠使用它。

2

在聲明中像

Node* LinkedList_Movies::FindPlace() 

編譯器不知道它是在LinkedList_Movies類,直到它認爲合格的函數名稱。因此,當它正在查看Node時,它不知道在LinkedList_Movies中查找。你需要有資格的返回類型:

LinkedList_Movies::Node* LinkedList_Movies::FindPlace() 

注意參數不需要是合格的,因爲它們在函數名後,所以如這個作品:

void LinkedList_Movies::DoStuff(Node *foo) 

假設一個合適的原型是在類定義中聲明的。

在C++ 11,你必須使用一個後綴返回類型,這是一種更清潔的方式來解決問題的選項:

auto LinkedList_Movies::FindPlace() -> Node* { 
    ... 
}