2017-11-07 72 views
0

こんにちは、これはコードです:クラス "エントリ" でC++でクラスを再帰的に呼び出す方法は?

template <class T> class FibonacciHeap{ 
public: 
    class Entry{ 
     public: 
      // Returns the element represented by this heap entry. 
      T getValue(){ 
       return mElem; 
      } 

      // Sets the element associated with this heap entry. 
      void setValue(T value){ 
        mElem = value; 
      } 

      // Returns the priority of this element. 
      double getPriority(){ 
       return mPriority; 
      } 

     private: 
      int mDegree = 0;    // Number of children 
      bool mIsMarked = false;   // Whether the node is marked 

      Entry mNext;     // Next element in the list 
      Entry mPrev;     // Previous element in the list 

      Entry mChild;     // Child node, if any 
      Entry mParent;     // Parent node, if any 
      T mElem;      // Element being stored here 
      double mPriority;    // Its priority 

      //Constructs a new Entry that holds the given element with the indicated priority. 
      Entry(T elem, double priority){ 
       mNext = mPrev = this; 
       mElem = elem; 
       mPriority = priority; 
      } 
    }; 
    ... 

私は再帰的にエントリを呼びたいので、私は使用することができます。

First_entry.mPrev.mNext 

私は、これはJavaで動作します知っているが、IこれをC++でコンパイルすると、次のようになります。

error: 'FibonacciHeap<T>::Entry::mNext' has incomplete type 

誰でもこれを修正する方法を知っているのですか?

+4

ちょうどメモ:これは再帰ではありません。 – m0skit0

+2

'Entry mNext;'、 'Entry mPrev;'、などあなたはここに何かがありません。コンパイラを聞く。 – DimChtz

+1

C++では、ほとんどのリストはノードまたは 'Entry'へのポインタを使います。 Javaにはポインタがありません。 –

答えて

3

ここでは変数名と初期化子に基づいて、私はJava Fibonacci heapをC++に適応させていると仮定しています。 :-)もしそうなら、運が良かった! Javaでは

あなたがタイプEntryの変数を持っている場合、それは別のEntryオブジェクトへのポインタではなく、正直ツー良Entryオブジェクトのことで、それはタイプEntry*のC++の変数のような働きをします。結果として、Entryクラスの定義では、フィールドがEntryではなくEntry*になるようにフィールドを調整する必要があります。同様に、.演算子を使用してフィールドを選択する代わりに、->演算子を使用することもできます。だから、

First_entry.mPrev.mNext 

は、明示的にnullptrEntryのポインタを初期化することを忘れないでください

First_entry->mPrev->mNext 

のように書き換えることでしょう - Javaは、Javaバージョンには初期化子が存在していない理由で、これを自動的に行います。しかし、C++では、初期化されていないポインタにはガベージ値が与えられますので、mChildmParentに明示的にnullptrの値を与えてください。

+0

さて、私はそれをC++に適応しようとしています。助けてくれてありがとう! – Chiray

関連する問題