2009-05-17 8 views
1

私はこのようなコードを持っている:C++で "owner class"を参照する方法は?

template<class T> 
class list 
{ 
public: 
    class iterator; 
}; 

template<class T> 
class list::iterator 
{ 
public: 
    iterator(); 
protected: 
    list* lstptr; 
}; 

list<T>::iterator::iterator() 
{ 
    //??? 
} 

私はそれから呼ばれるのリストにiterator::lstptrポイントを作るためにlist::iteratorのコンストラクタを作りたいです。私:

list xlst; 
xlst::iterator xitr; 
//xitr.lstptr = xlst 

どうすればよいですか?

そしてまた、私は私のイテレータコンストラクタ右を参照していますか、私はこのような何かを行う必要があります。

template<class T> 
class list<T>::iterator 
{ 
public: 
    list<T>::iterator(); 
protected: 
    list* lstptr; 
}; 
+0

2番目のブロックでコメントアウトしたコードを試しましたか?私はC++を知らないので(Cのみ)、それは私がやることのように見えます。 – hhafez

+0

リストを :: iterator()から変更すると、イテレーターの最終バージョンが正しくなります。 - > iterator();歓声 –

答えて

3

あなたはイテレータのコンストラクタにリストを渡すことができます。

list xlst; 
list::iterator xitr(xlst); 

list xlst; 
list::iterator xitr = xlst.create_iter(); 

ファクトリ関数のケースでは、create_iter()関数は、囲みリストを参照するためにthisを使用できます。

+0

ええ、私はそれをやろうとしていました。私がリライズするまでは、イテレータをコールクラスに等しくできるはずです。 私は答えを得て、 "list :: iterator"というイテレータを "xlst :: iterator"ではなく、呼び出すことにしました。私の目標は「ベクトル」のいくつかの側面を再現することでした。 –

0

ポインタを変更(再配置)する必要はなく、NULL値は必要ありませんので、代わりに参照を使用します。また、メンバ変数を割り当てる際にイニシャライザリストを使用することもできます(また、参照を使用している場合にも必要です)。

template<class T> 
class list::iterator 
{ 
public: 
    iterator(list& parent) : lstptr(parent){} 

protected: 
    list& lstptr; 
}; 

前述のように、リストクラス内のファクトリメソッドを使用して、list :: iterator型のオブジェクトを構築します。

関連する問題