2016-06-29 11 views
-3
class Iterator; 

class SortedList { 

    friend class Iterator; 

private: 
    Node* root; 

    Node* minim(Node* node) const { 
     while (node->getLeft() != nullptr) 
      node = node->getLeft(); 
     return node; 
}; 

public: 
    SortedList() { 
     root = nullptr; 
    }; 

    Iterator iterator() { 
     Node* min = minim(root); 
     return Iterator(*this, min); // Here says that Iterator has no constructors 
    }; 
}; 


class Iterator { 
private: 
    const SortedList& list; 
    Node* current; 

public: 
    Iterator(const SortedList& list, Node* current) : list{ list }, current{ current } {}; 

}; 

Iteratorクラスにはコンストラクタがありません。また、Iteratorクラスにはコンストラクタがありません。間違っているとは、それらのパラメータには何もないことを指定します。クラスにはコンストラクタはありませんが、正しいパラメータを持ちます

もう1つのことは、イテレータメソッドをコメントして、イテレータを書くことによってメインのイテレータをインスタンス化すると、それは{my parameters}うまくいきます。

Iterator iterator() { 
    Node* min = minim(root); 
    return Iterator(*this, min); // Here says that Iterator has no constructors 
}; 

移動Iteratorの定義の後に関数の定義:

+1

あなたの関数の最後の '}'の後に ';'を置かないでください! – abelenky

+4

'Iterator'を定義する前に、それは不完全な型であり、不完全な型ではあまりできません。 – AndyG

+1

Iteratorを前方宣言された 'SortedList'に依存させ、' SortedList'を完全な 'Iterator'に依存させたいと思うように聞こえます。 – AndyG

答えて

1

Iteratorは、使用する不完全な型です。

class Iterator; 

class SortedList { 

    friend class Iterator; 

private: 
    Node* root; 

    Node* minim(Node* node) const { 
     while (node->getLeft() != nullptr) 
      node = node->getLeft(); 
     return node; 
}; 

public: 
    SortedList() { 
     root = nullptr; 
    }; 

    // Just the declaration 
    Iterator iterator(); 
}; 


class Iterator { 
private: 
    const SortedList& list; 
    Node* current; 

public: 
    Iterator(const SortedList& list, Node* current) : list{ list }, current{ current } {}; 

}; 

// Now the definition  
Iterator SortedList::iterator() { 
    Node* min = minim(root); 
    return Iterator(*this, min); 
}; 
+0

ありがとうございます。 興味深い注記:私は似たようなものを持っていますが、テンプレート化されていて、この "トリック"なしでは何か違いはありますか? – Lorand

+0

@Lorand:テンプレートは「使用時にコンパイル」されます。テンプレートが使用される時点で、おそらく両方の定義がすでに使用可能になっている可能性があります。 – Pixelchemist

関連する問題