2017-04-16 3 views
1

dummyNode宣言変数は、イテレータクラスをネストして作成するまでうまくいきました。これは、非静的データメンバ '私はイテレータクラスを削除した場合のLinkedList :: dummyNode」C++は、それがうまく機能 テンプレート非静的データメンバ 'linkedlist <int> :: dummyNode'の無効な使用C++

class linkedList 
{ 

private: 
    listNode<T> * head, *tail; 
    listNode<T> * dummyNode = new listNode<T>; 
    int sz = 0; 
public: 
    class iterator 
    { 
    public: 
     iterator() 
     { 
      itrNode = head; 
     } 
     void operator ++() 
     { 
      try{ 
       if(itrNode == dummyNode) 
        throw "Sorry this is the end of the list\n"; 
       else 
       { 
        itrNode = itrNode->next; 
       } 

      }catch(const char * error) 
      { 
       cerr << error; 
      } 
     } 
     T& operator *() 
     { 
      return *(itrNode->value); 
     } 
     void operator --(); 
    private: 
     listNode<T> * itrNode; 

    }; 
    linkedList(); 
    ~linkedList(); 
    linkedList(T value, int initial_size); 
    iterator begin(); 


}; 
その外側のクラスとデータを共有していない
+0

内部クラスのコンストラクタは、外部クラスのデータメンバーである 'head'を参照します。代わりに適切なイテレータを返す関数 'linkedlist :: begin'を作成する必要があります。イテレータの直接コンストラクタが必要な場合は、引数として 'linkedlist'が必要です。 – jwimberley

+0

申し訳ありませんが、その問題はどこですか?私は解決策も理解していませんでしたが、コードを書いてくださいね! –

答えて

0

A C++ネストされたクラス - ケースがあった場合は、内部クラスの各インスタンス外部クラスの対応するインスタンスと1対1の関係にあり、したがって余分な機能を追加することはありません。代わりに、ネストされたクラスの主な目的は以下のとおりです

  1. 名前空間の意味:linkedlist::iteratorは、C++バージョンの標準によってlinkedlist_iterator
  2. よりも意味のある、ネストされたクラスは、外側のインスタンスのメンバーオブジェクトの余分な可視性を持っています私は

あなたのコード内の最大の問題を認識していないよクラスたぶん

  • 他はイテレータのコンストラクタです

    オブジェクトのそのデータメンバため
    iterator() 
        { 
         itrNode = head; 
        } 
    
    head

    データは、内部クラスの文脈において何を意味する - 再度、iteratorlinkedlistクラスのインスタンスにに属していません。 (;私は前に、ネストされたテンプレートクラスを行っていない私はよく分からない)代わりにコンストラクタは、あなたがtemplatizationについて確認する必要があり、他の変更があるかもしれません

    iterator(linkedlist<T>& list) 
        { 
         itrNode = list.head; // Might not work in C++03 
        } 
    

    のようなものでなければなりません。また、リンクリスト用のこのタイプのコンストラクタは動作しますが、標準的なパラダイムには従いません。より標準的な機能は、機能を追加することです。

    iterator linkedlist::begin(); 
    iterator linkedlist::end(); 
    

    からlinkedlistクラスです。 begin(linkedlist&)end(linkedlist&)関数を作成する方が良いでしょう。これはthis following SO postで説明されています。

  • +0

    どうすればいいですか(itrNode == dummyNode) 私は同じことをすべきだと思いますが、どうすればいいのでしょうか? –

    +0

    あなたもそれを修正する必要があるでしょう。そして、あなたはその方法を知っています。あなたはすでに 'iterator'クラスにprivate itrNodeエントリを持っており、dummyNodeに対して同じことをするだけです。あなたのダミーノードが何をしているのか分かりませんが、それらの詳細は 'linkedlist'のコンストラクタとメンバ関数の実装にあると思います。 – jwimberley

    関連する問題