返回类内的私有类

  • 本文关键字:返回 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文件中的链表。我想返回一个指向节点的指针。但是在.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。但是,在公共方法中返回指向私有类型的指针有什么意义?无论如何,只有私有方法才能使用它。

相关内容

  • 没有找到相关文章

最新更新