0
void ParticleGeneratorController::generate() {
    for( unsigned i = 0; i < generators.size(); i++) {
        ParticleGenerator generator = *generators[i];
        generator.update();
    }
}

コピー コンストラクタか何かを呼び出しているようですが、定義していません。明示的なデフォルト コンストラクターしかありません。

https://github.com/ChrisLundquist/Waveform/blob/master/src/models/particle_generator.h

上記のコードを考えると、テストは失敗します。https://github.com/ChrisLundquist/Waveform/blob/master/spec/controllers/particle_generator_controller_spec.cpp#L21

と書くと

void ParticleGeneratorController::generate() {
    for( unsigned i = 0; i < generators.size(); i++) {
        generators[i]->update();
    }
}

テストに合格します。

最初の実装でコピー コンストラクターが呼び出されるのはなぜですか? コンパイラによってどのように生成されますか?

4

3 に答える 3

5

この行により、コピーが発生します。

ParticleGenerator generator = *generators[i];

コピー コンストラクター (または代入演算子) が明示的に指定されていない場合は、コンパイラによって自動的に生成されます。オブジェクトのコピーを防止したい場合は、コピー コンストラクターと代入演算子をprivate次のように宣言できますが、定義はできません。

ParticleGenerator
{
public:

private:
    ParticleGenerator(const ParticleGenerator&);
    ParticleGenerator& operator=(const ParticleGenerator&);
};
于 2012-08-23T09:03:32.770 に答える
5

ParticleGeneratorこれを行うたびに新しいものを作成しています:

ParticleGenerator generator = *generators[i];

これはコピーの初期化であり、コピー コンストラクターを明示的に指定しなかった場合は、コンパイラによって合成されたコンストラクターが使用されます。

于 2012-08-23T09:03:33.190 に答える
0

次の行でコピーが行われます。

ParticleGenerator generator = *generators[i];

コピーコンストラクターを定義しない場合、コンパイラーが自動的に定義します。これを無効にするには、コピーコンストラクターをプライベートとして宣言し、実装しないようにします。通常、これはコピー代入演算子でも実行する必要があります。

コードにコピーを作成したくない場合は、代わりにポインタを作成するだけです。書く

ParticleGenerator * generator = generators[i];
generator->update();

代わりにループに入れてください。または

generators[i]->update();

あなたが本当に速記になりたいなら。

于 2012-08-23T10:04:40.757 に答える