返回类中的私有类

时间:2013-03-26 21:24:39

标签: c++ linked-list return

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是私密的。那么,我该如何归还?

5 个答案:

答案 0 :(得分:8)

您需要限定Node,因为您目前正在定义班级 的功能:

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

}

请注意,此函数的调用者将无法轻松存储指针:

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

这会产生编译错误,因为LinkedList_Movies::Nodeprivate。但是,这可能完全符合您的要求。

可以让他们使用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。但是,在公共方法中返回指向私有类型的指针有什么意义呢?无论如何,只有私有方法才能使用它。