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
是私密的。那么,我该如何归还?
答案 0 :(得分:8)
您需要限定Node
,因为您目前正在定义班级 的功能:
LinkedList_Movies::Node* LinkedList_Movies::FindPlace()
{
}
请注意,此函数的调用者将无法轻松存储指针:
LinkedList_Movies movies;
LinkedList_Movies::Node* node = movies.FindPlace();
这会产生编译错误,因为LinkedList_Movies::Node
是private
。但是,这可能完全符合您的要求。
可以让他们使用auto
执行此操作:
LinkedList_Movies movies;
auto node = movies.FindPlace();
或者等效地,当传递给推导出的模板参数时:
template <typename T>
void foo(T t);
foo(movies.FindPlace());
答案 1 :(得分:3)
首先,类型名称是LinkedList_Movies :: Node,不仅仅是“Node”。
其次,这可能不会起作用,因为这个类是私有的。即使它有效,它对其他函数也没用,因为它们会知道这个对象是什么以及如何使用它。您尝试执行的此功能可以是私有的,因为Node类型仅对LinkedList_Movies类有用。
答案 2 :(得分:2)
正如你所说的那样:Node是LinkedList_Movies
类的私有子类。在类定义本身之外调用它时,必须解决其范围:
LinkedList_Moves::Node* LinkedList_Movies::FindPlace();
否则编译器将尝试在全局范围内查找类Node
,在这种情况下,该类不存在。
答案 3 :(得分: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* {
...
}
答案 4 :(得分:0)
您需要指定Node类的全名,即LinkedList_Movies :: Node。但是,在公共方法中返回指向私有类型的指针有什么意义呢?无论如何,只有私有方法才能使用它。