我覺得有一些概念需要了解。
與Java不同,當您創建用戶的N元素數組時,它不是一個引用數組。它實際上是一段包含實際N用戶的內存,它已經被創建和初始化(即構造函數已經運行)。 (好吧,還有更高級的主題,比如展示位置 - 新的,但我認爲它並不是你真正需要的東西)
所以它有點矛盾,如果你說你有一個「用戶數組」並且想保持追蹤某個位置是否被初始化。
除非:
沒有創建用戶的陣列,但「指向用戶」(或其他參考的auto_ptr等)的陣列。通過這種方式,說某個元素是「null」是有意義的;或
您的「初始化」並不意味着創建一個對象實例,而是一個顯式的初始化操作(如執行User實例的init()方法)。通過這種方式,說某個元素「未初始化」是有意義的。
(首先,因爲你正在編寫C++,我會建議你使用std :: vector的,而不是數組。但是我使用數組中的這個答案,從而關閉堅持你的問題)
對於情況1,它是嚴格向前,簡單地使用NULL(避免使用0,因爲儘管NULL在大多數系統被定義爲0,使用NULL實際上使代碼的可讀性和更便攜的):
User* user[10] = {NULL}; // array of 10 pointer-to-User
user[0] = new User(...);
assert (user[0] != NULL);
assert (user[1] == NULL);
對於案例2,您有許多其他選擇,例如保持另一個布爾數組以保持「登陸「標誌,或者在用戶身上包裝這種額外標誌的包裝,或者簡單地將此標誌添加到您的用戶類別中,等等。
例如,
User user[10]; // 10 element of User, which all of them is already created
//assume you have extra flag in User
user[0].init(...); // explicity do some init work on user[0]
//......
if (! user[5].isInitialized()) {
user[5].init(...);
}
(老實說,我認爲情況2是不是真的,你在找什麼)
謝謝parapura費道宜,本傑明·林德利和阿德里安深爲幫助和信息。這正是我一直在尋找的。 fileoffset,我不允許使用除C++標準模板庫以外的任何內容。 –
如果你正在尋找什麼,如果你可以選擇最好的答案並接受它,那將會很棒。它不僅鼓勵回答者,而且使未來的參考更容易 –
「我想在C++中做類似的事情......」。別。不要將C++編碼爲Java。它們的優化方式不同,而且您的代碼運行速度非常慢,而且會是令人難以置信的錯誤。 –