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
文件中的链表。我想返回一个指向节点的指针。但是在.cpp
文件中,它不允许我执行以下操作:
Node* LinkedList_Movies::FindPlace()
{
}
它告诉我:Node is undefined
.
我知道Node
是私人的。那么,我该如何退货呢?
您需要限定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());
首先,类型名称是LinkedList_Movies::Node,而不仅仅是"Node"。
其次,这可能不起作用,因为该类是私有的。即使它有效,它对其他函数也毫无用处,因为这些函数对这个对象是什么以及如何使用它一无所知。您尝试执行的此函数可以是私有的,因为 Node 类型仅对LinkedList_Movies类有用。
正如你自己所说:Node 是 LinkedList_Movies
类的私有子类。在类定义本身之外调用它时,必须解析其作用域:
LinkedList_Moves::Node* LinkedList_Movies::FindPlace();
否则,编译器将尝试在全局范围内查找在本例中不存在的类Node
。
在这样的声明中
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* {
...
}
您需要指定 Node 类的全名,即 LinkedList_Movies::Node。但是,在公共方法中返回指向私有类型的指针有什么意义?无论如何,只有私有方法才能使用它。