2012-03-29 17 views
1

私の問題はconst_cast <>の使用です。私はベクトルから継承するクラスを持っています。今ではメンバー関数の1つで、this->begin()thisをconstポインタとして使用すると、定数反復子が返されますが、非const反復子を取得します。コードはthis->begin()がconstのイテレータを返すために、私は要素を挿入する必要があるとき型キャストを一定のイテレータを使用して行うことを余儀なく午前、上記の関数でconst "this"ポインタを使用している間、非constイテレータを取得する方法はありますか?

class xyz : private std::vector<//something> 
{ 
public: 
xyz(); 
void doSomething(); 
} 

void doSomething() 
{ 
    xyz::iterator it; 
    it = this->begin(); 
    *it.insert(something); //here is the problem and this where I need to use const_cast 
          // and in a lot more places 
} 

...のようになります。

私はthis-> begin()でconst_castを使うことを考えましたが、私の友人はthisポインタの定数を削除することは悪い考えだと教えてくれました。そうなら、周りの道は何ですか?

+5

実際に、あなたはワームの缶を開けました。*私はvector *から継承するクラスを持っています、なぜあなたは 'std :: vector'から継承しますか?これは継承のためのものではありません。 –

+1

@Als:必要性ベクトルから継承するクラスが必要なので、クラス自体がベクトルとして機能し、なぜそれが継承するのが良いアイデアではないかについてより具体的にすることができます。 – ken

+0

[標準コンテナをサブクラス化/継承しないのはなぜですか?](http://stackoverflow.com/questions/6806173/why-should-not-i-subclass-inherit-standard-containers)継承ではなくcontainershippを使用する必要があります。 –

答えて

1

(それは公に vectorから継承することは本当に悪い習慣だが)ベクトルをベースとしてメンバーまたは のいずれかとして、クラスの状態の一部である場合、constメンバ関数は、それを変更してはなりません。 ベクトルが状態の一部であり、関数がそれを変更する場合、関数 はconstであってはなりません。

一般的に、たとえば、ベクトル が論理的に計算されたが、計算コストが高い のキャッシュ状態を表す特殊なケースがあります。そのような場合、ベクトルを 可変メンバにすることができます。しかし、ベクトルが本当に "observable state"を表さないことを確かめてください。

最後に、投稿したコードは、問題 とは関係がないようです。初心者のために、唯一の関数は非constです。 コードは、いくつかの理由( メンバー以外の関数でのthisの使用、イテレータでのinsertメンバー関数の呼び出し、 にこのようなメンバーがないなど)をコンパイルしません。

関連する問題