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ファイル内の私のリンクリストです。ノードへのポインタを返したい。しかし、.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::Nodeます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」だけではありません。

第二に、クラスはプライベートであるため、これはおそらく機能しません。それが機能したとしても、他の機能には役に立たないでしょう。これらの機能は、このオブジェクトが何であるか、そしてそれをどのように使用するかについて何も知らないからです。ノードタイプはLinkedList_Moviesクラスにのみ役立つため、実行しようとしているこの関数はプライベートにすることができます。

于 2013-03-26T21:26:36.123 に答える
2

あなたがあなた自身を言ったように:ノードは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 に答える