原文地址:blog.csdn.net/jphaoren/archive/2010/06/12/5667181.aspx
類對象數(shù)組初始化
如有一個如下類:
class EquipmentPiece {
private:
int IDNumber;
public:
EquipmentPiece(int IDNumber) : IDNumber(IDNumber) {};
};
以下列出幾種初始化的方法:
<一>、對象數(shù)組
int ID1, ID2, ID3;
EquipmentPiece bestPieces[] = { EquipmentPiece(ID1), EquipmentPiece(ID2), EquipmentPiece(ID3) };
注意:
EquipmentPiece bestPieces[10]; //no appropriate default constructor available
EquipmentPiece *bestPieces = new EquipmentPiece[10]; //no appropriate default constructor available
當(dāng)然,如果你將構(gòu)造函數(shù)參數(shù)全都設(shè)了默認(rèn)值,以上兩種寫法也成功,如將類中構(gòu)造函數(shù)修改如下:
...
EquipmentPiece(int IDNumber = 0) : IDNumber(IDNumber) {};
...
<二>、指針數(shù)組
typedef EquipmentPiece* PEP; //PEP是個指向EquipmentPiece的指針
PEP bestPieces[10]; //等同于 PEP *bestPieces = new PEP[10];
//然后初始化
for(int i = 0; i < 10; i++){
bestPieces[i] = new EquipmentPiece( IDNumber );
}
注意:
要記得將此數(shù)組所指的所有對象刪除。如果忘了會產(chǎn)生資源泄露。還有就是該方法與對象數(shù)組相比需要額外內(nèi)存用于存放指針。(過度使用內(nèi)存 這一問題可以避免,見第三種方法)
<三>、使用placement new
方法是:先為此數(shù)組分配raw memory,然后使用"placement new"在這塊內(nèi)存上構(gòu)造EquipmentPiece objects;
//分配足夠的raw memory,給一個預(yù)備容納10個EquipmentPiece objects的數(shù)組使用
void *rawMemory = operator new(10*sizeof(EquipmentPiece));
//讓bestPieces指向此內(nèi)存,使這塊內(nèi)存被視為一個EquipmentPiece數(shù)組
EquipmentPiece *bestPieces = reinterpret_cast<EquipmentPiece*>(rawMemory);
//利用"placement new"構(gòu)造這塊內(nèi)存中的EquipmentPiece objects。
int IDNumber = 0;
for(int i = 0; i < 10; i++){
new (&bestPieces[i]) EquipmentPiece( IDNumber );
}
注意:該方法維護(hù)比較困難。在數(shù)組內(nèi)對象結(jié)束生命時,要以手動方式調(diào)用destructors,最后還得調(diào)用operator delete釋放raw memory。
//將bestPieces中對象以構(gòu)造次序的反序析構(gòu)掉
for(i = 0; i < 10; i++){
bestPieces[i].~EquipmentPiece();
}
//釋放raw memory
operator delete (rawMemory);
posted on 2011-02-14 22:02
luis 閱讀(1484)
評論(0) 編輯 收藏 引用