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 回答