C++不允許含有項目的數組未缺省構造一個類:內聯在C++類的非缺省構造對象的數組
class Gordian {
public:
int member;
Gordian(int must_have_variable) : member(must_have_variable) {}
};
class Knot {
Gordian* pointer_array[8]; // Sure, this works.
Gordian inlined_array[8]; // Won't compile. Can't be initialized.
};
由於甚至開始C++用戶知道,語言保證所有非POD成員在構建課程時都被初始化。它不相信用戶初始化構造函數中的所有內容 - 在構造函數的主體甚至啓動之前,必須爲所有成員的構造函數提供有效的參數。
一般情況下,這是一個偉大的想法,據我擔心,但我已經遇到一種情況,那將是一個容易得多,如果我能實際上有非缺省構造的對象的數組。
顯而易見的解決方案:有指針指向對象的數組。在我使用共享內存的情況下,這不是最佳選擇。這會迫使我從已經存在爭用的資源(即共享內存)中進行額外分配。我希望在對象中內聯數組的原因是爲了減少分配數量。
這是一個情況,我願意用一個黑客,甚至是難看,只要它的作品。一個可能的黑客攻擊我的想法是:
class Knot {
public:
struct dummy { char padding[sizeof(Gordian)]; };
dummy inlined_array[8];
Gordian* get(int index) {
return reinterpret_cast<Gordian*>(&inlined_array[index]);
}
Knot() {
for (int x = 0; x != 8; x++) {
new (get(x)) Gordian(x*x);
}
}
};
當然,它編譯,但我不太有經驗的C++程序員。也就是說,我不太可能相信我的黑客。所以,問題:
1)請問我想出了破解似乎可行?有什麼問題? (我主要關注新版GCC上的C++ 0x)。
2)是否有更好的方式來內聯非缺省構造的對象的類中的一個數組?
該代碼是合法的。但是,我認爲將非POD C++對象放在共享內存中是一個糟糕的設計。 – 2010-04-25 11:12:26
我認爲你現在的解決方案是可以的。你可能想使用自定義分配器,將來自您準備緩衝區分配內存'VECTOR',但這種做法據我所知,如果你不想預分配任何額外的內存在這個緩衝區不起作用。 – 2010-04-25 11:31:15
聲明「的語言擔保,構建一個類時,所有成員都被初始化,」是不正確。 C++不保證初始化POD類型(int,C風格結構等)。 – 2010-04-25 12:15:44