2016-11-30 9 views
0

出力を順番に与えるオブジェクトを作成しようとしていますが、内部実装を公開したくありません。私は他のクラスにhasNextOutput()メソッドとnextOutput()メソッドだけを見せたいと思います。ここに私のヘッダファイルとクラスファイルは、それぞれ次のとおりです。プライベートベクトルとiteratorを持つクラスのC++の "="演算子の動作

ヘッダファイル:

#ifndef RADAR_OUTPUT_GENERATOR_H 
#define RADAR_OUTPUT_GENERATOR_H 

#include<vector> 
#include<iterator> 
#include "asl/include/net/asl_net_user_data.h" 

class RadarOutputGenerator { 
private: 
    int dataCounter;  
    std::vector<unsigned char *> dataStream; 
    std::vector<unsigned char *>::iterator dataStreamIterator; 
public: 
    RadarOutputGenerator(); 
    RadarOutputGenerator(char *filename); 
    RadarOutputGenerator(unsigned int maxDataSize); 
    ~RadarOutputGenerator(); 

    bool hasNextOutput(); 
    void nextOutput(unsigned char *&dataWithHeader); 
}; 

#endif 

クラスの実装

#include "radar_output_generator.h"; 

RadarOutputGenerator::RadarOutputGenerator() { 

} 

RadarOutputGenerator::RadarOutputGenerator(unsigned int maxDataSize) { 
    for (int i = 0; i < 100; i++) { 
     // create some data 

     this->dataStream.push_back(data); 

     cur_step = (cur_step += 10) & 65535; 
    } 

    this->dataStreamIterator = (this->dataStream).begin(); 
} 

bool RadarOutputGenerator::hasNextOutput() { 
    return (this->dataStreamIterator != this->dataStream.end()); 
} 

void RadarOutputGenerator::nextOutput(unsigned char *&dataWithHeader) { 
    dataWithHeader = *(this->dataStreamIterator++); 
} 

の問題は、私はタイプRadarOutputGeneratorのオブジェクトを作成するとき、のhasNext( )メソッドが "反復子互換性がない"エラーで失敗するこのコードは失敗します。

RadarOutputGenerator myOutputGenerator = RadarOutputGenerator(47); 
radarOutputGenerator.hasNextOutput(); // this line fails 

私が問題になる場所を確認だと思う - ベクトルデータ・ストリームがコピーされ、「=」演算子と、コンストラクタで初期化イテレータを呼び出すときに、おそらく元のベクトルへの参照を保持します。そうだとすれば、このような行動様式は私には間違っていますが、私はこの問題を正しく解決する方法を知りたいと思います。

+2

そのようなオブジェクトを定義して初期化するときは、代入演算子を呼び出すのではなく、*コピーコンストラクタ*を呼び出すだけです。そして、あなたはコピーコンストラクタ*と*代入演算子を実装することによって問題を "修正"します([3,5、および0の規則についてはこちらを参照してください](http://en.cppreference.com/w/cpp/language/rule_of_three ))。 –

+1

コピー代入演算子とコピーコンストラクタ(およびmove-assignmentとmove-copy)をオーバーロードするか、イテレータを削除してインデックスを使用する必要があります。 –

+0

もう1つの可能性はベクトルにshared_ptrを使用することです。その結果、互いにコピーされたすべてのジェネレータは同じデータストリームを使用します。反復の途中でストリームを変更する必要がある場合は、コピーオンライトを行います。 –

答えて

2

これを解決する1つの方法は、正しいものを行うためにコピーコンストラクタとコピー代入演算子をオーバーロードすることです。すなわち、イテレータのオフセットを古いベクトルに計算し、それを新しいベクトル。

一般に、オブジェクトに内部ポインタ(自分自身の一部を参照するもの)がある場合は、手動でコピーを実装する必要があります。

より簡単な解決策は、普遍的な適用可能ではないが、n.mとして行うことです。コメントには反復子の代わりにインデックスが格納されています。インデックスは特定のベクトルに関連付けられていません。

関連する問題