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

似乎調用複製構造函數或其他東西,但我沒有定義一個。我只有一個顯式的默認構造函數。爲什麼C++在迭代容器時調用複製構造函數?

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(); 
    } 
} 

寫入的測試通過。

爲什麼在第一個實現中調用了複製構造函數?它是如何由編譯器生成的?

回答

5

這條線使副本:

ParticleGenerator generator = *generators[i]; 

如果沒有明確指定拷貝構造(或賦值操作符),編譯器自動生成一個。如果你想阻止一個對象,你可以聲明的複製,而不是定義,拷貝構造函數和賦值操作符爲private

ParticleGenerator 
{ 
public: 

private: 
    ParticleGenerator(const ParticleGenerator&); 
    ParticleGenerator& operator=(const ParticleGenerator&); 
}; 
+4

或者用C++ 11'delete':http://en.wikipedia.org/wiki/C%2B%2B11#Explicitly_defaulted_and_deleted_special_member_functions – BoBTFish

+0

@BoBTFish,啊是的,忘了所有關於那個(如果我是誠實的,還沒有機會實際使用它)。 – hmjd

5

你創建你這樣做了新的ParticleGenerator每次:

ParticleGenerator generator = *generators[i]; 

這是一個複製初始化,並且,假定您沒有明確提供複製構造函數,則使用編譯器合成的一個。

+0

爲什麼「本質上」? – sepp2k

+0

@ sepp2k爲簡潔起見,我不想進入[複製初始化](http://www.gotw.ca/gotw/036.htm)。 – juanchopanza

0

下面這行做的副本:

ParticleGenerator generator = *generators[i]; 

如果你沒有定義拷貝構造函數,編譯器會自動爲您完成。爲了禁用它,你可以聲明拷貝構造函數爲私有的而不是實現它。通常應該使用複製賦值操作符來完成。

如果你想避免在你的代碼中複製,你可以簡單地創建一個指針。寫

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

代替你的循環。或者

generators[i]->update(); 

如果你想成爲真正的短手。

相關問題