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.js 的指针。但在.cpp文件中,它不会让我执行以下操作:

Node* LinkedList_Movies::FindPlace()
{

}

它告诉我:Node is undefined

我知道Node是私人的。那么,我该如何退货呢?

4

5 回答 5

8

您需要限定Node,因为您当前正在类之外定义函数:

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

}

请注意,此函数的调用者将无法很容易地存储指针:

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

这将给出编译器错误,因为LinkedList_Movies::Nodeis private。但是,这可能正是您想要的。

他们可以使用以下方法来做到这一点auto

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

或者,等效地,当传递给推导的模板参数时:

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

foo(movies.FindPlace());
于 2013-03-26T21:27:29.420 回答
3

首先,类型名称是 LinkedList_Movies::Node,而不仅仅是“Node”。

其次,由于课程是私有的,因此这可能不起作用。即使它有效,它对其他函数也无用,因为这些函数对这个对象是什么以及如何使用它一无所知。您尝试执行的此功能可以是私有的,因为 Node 类型仅对您的 LinkedList_Movies 类有用。

于 2013-03-26T21:26:36.123 回答
2

正如您所说的那样:Node 是该类的私有子LinkedList_Movies类。在类定义本身之外调用它时,您必须解析其范围:

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

否则编译器将尝试在全局范围内寻找一个Node在这种情况下不存在的类。

于 2013-03-26T21:28:27.283 回答
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* {
    ...
}
于 2013-03-26T21:51:58.663 回答
0

您需要指定 Node 类的全名,即 LinkedList_Movies::Node。但是,在公共方法中返回指向私有类型的指针有什么意义呢?无论如何,只有私有方法才能使用它。

于 2013-03-26T21:30:13.477 回答