2012-02-08 10 views
0

私は2 const_iteratorsを作成スパース行列の私の実装をテストするためにmain.cppにやってる:奇妙なconst_iteratorの行動

SparseMatrix<double>::const_iterator a,b; 
a=mata.begin(); //mata previously created as SparseMatrix<double> 
b=mata.end(); 
... //code goes on 

問題は、それは始まりと終わり(それを呼び出していないということです最初のcoutはしません)、2つのイテレーターを作成すると動作します。 const_iteratorsのbeginとendを実装した方法は次のとおりです。

const_iterator begin() const 
{ 
    cout<<"Begin"<<endl; 
    int minr=minRow(); 
    int minc=minCol(findRow(minr)); 
    mcol * mc=findCol(findRow(minr),minc); 
    const_iterator x; 
    if(mc!=NULL) 
    { 
     T* dato=&(mc->data); 
     x= const_iterator(genElement(minr,minc,dato)); 
    } 
    else 
    { 
     x=const_iterator(NULL); 
    } 
    x.setSM(const_cast<SparseMatrix<T>*>(this)); 
    return x; 
} 

const_iterator end() const 
{ 
    cout<<"End"<<endl; 
    const_iterator x= const_iterator(NULL); 
    x.setSM(const_cast<SparseMatrix<T>*>(this)); 
    return x; 
} 

私は気づいた奇妙なことは、私は疎行列のクラスメソッド内の2 const_iteratorsを作成した場合、彼らが働くということです。あなたが言うように

+0

作成されていないことをどのように知っていますか?ほとんどの場合、コンパイラは使用されていないため、それらを最適化しました。 –

+0

begin()とend()で何も割り当てられていないので、const_iterator演算子++()は割り当てられていないメモリ領域を読み込もうとしています。 – Vektor88

+0

私は、投稿したコードに明らかに間違ったものがあるのを見てください:問題を示す最小限の、完全にコンパイル可能なプログラムを表示できますか? –

答えて

2

、 "mata [原文のまま]以前SparseMatrix<double>として作成された" が、あなたはconstをマークされている示し、あなたのbeginend。それらのconstメンバ関数が呼び出されるためには、オブジェクトmetaconstでなければならず、そうでなければbeginendの非constバージョンが呼び出されます。

+0

非constオブジェクトで呼び出されたい場合はどうすればよいですか? 私は、読み取り専用のアクセス権を持つconstイテレータと、書き込み権限を持つ通常のイテレータが必要です。 – Vektor88

+1

@ Vektor88通常、人々は非'const'メンバ関数を持っています。 'iterator'を返し、' const'バージョンは 'const_iterator'を返します。また、必要であれば、 'const_iterator'を返す' const'関数 'cbegin'を持つこともできます。 –