出力を順番に与えるオブジェクトを作成しようとしていますが、内部実装を公開したくありません。私は他のクラスに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
私が問題になる場所を確認だと思う - ベクトルデータ・ストリームがコピーされ、「=」演算子と、コンストラクタで初期化イテレータを呼び出すときに、おそらく元のベクトルへの参照を保持します。そうだとすれば、このような行動様式は私には間違っていますが、私はこの問題を正しく解決する方法を知りたいと思います。
そのようなオブジェクトを定義して初期化するときは、代入演算子を呼び出すのではなく、*コピーコンストラクタ*を呼び出すだけです。そして、あなたはコピーコンストラクタ*と*代入演算子を実装することによって問題を "修正"します([3,5、および0の規則についてはこちらを参照してください](http://en.cppreference.com/w/cpp/language/rule_of_three ))。 –
コピー代入演算子とコピーコンストラクタ(およびmove-assignmentとmove-copy)をオーバーロードするか、イテレータを削除してインデックスを使用する必要があります。 –
もう1つの可能性はベクトルにshared_ptrを使用することです。その結果、互いにコピーされたすべてのジェネレータは同じデータストリームを使用します。反復の途中でストリームを変更する必要がある場合は、コピーオンライトを行います。 –