2011-11-21 34 views
2

我是一箇中間的Java程序員和我習慣在java中對空值中繼用於如果OBJETS與在存儲器中的某些參考實例化對象初始化cheking。我想在C++中做類似的事情,但我對如何實現它沒有清晰的認識。我想初始化一個用戶數組 - user是我定義的一個類 - 所以我可以檢查數組中的實際位置確實包含一個對象還是空閒的。初始化C中的對象陣列++具有特殊值

我曾嘗試使用空定義在C++中卻發現,這是一個簡單的「-1」 int值,我無法正確地使用它。所以基本上我需要一些東西來區分陣列中的一個自由位置和一個自由位置。

此外,我可能有興趣有一個額外的價值來區分一個位置,其中包含一個被刪除的用戶,因爲我打算只標記所需的位置與特殊標記作爲釋放的位置,當涉及到刪除的方法來自陣列的用戶。

對於那些好奇,我實現一個簡單的哈希集合,並在我的課remove方法只是標記元素的位置移除,而不是做一些restruction。

+0

謝謝parapura費道宜,本傑明·林德利和阿德里安深爲幫助和信息。這正是我一直在尋找的。 fileoffset,我不允許使用除C++標準模板庫以外的任何內容。 –

+0

如果你正在尋找什麼,如果你可以選擇最好的答案並接受它,那將會很棒。它不僅鼓勵回答者,而且使未來的參考更容易 –

+0

「我想在C++中做類似的事情......」。別。不要將C++編碼爲Java。它們的優化方式不同,而且您的代碼運行速度非常慢,而且會是令人難以置信的錯誤。 –

回答

0

我覺得有一些概念需要了解。

與Java不同,當您創建用戶的N元素數組時,它不是一個引用數組。它實際上是一段包含實際N用戶的內存,它已經被創建和初始化(即構造函數已經運行)。 (好吧,還有更高級的主題,比如展示位置 - 新的,但我認爲它並不是你真正需要的東西)

所以它有點矛盾,如果你說你有一個「用戶數組」並且想保持追蹤某個位置是否被初始化。

除非:

  1. 沒有創建用戶的陣列,但「指向用戶」(或其他參考的auto_ptr等)的陣列。通過這種方式,說某個元素是「null」是有意義的;或

  2. 您的「初始化」並不意味着創建一個對象實例,而是一個顯式的初始化操作(如執行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是不是真的,你在找什麼)

1

所有空的定義首先不爲-1,但0假設你有類似

class User 
{ 
}; 

User RemovedClass; 

,你可以有這樣的事情

User *arr[3]; 
arr[0] = new User(); 
arr[1] = 0; 
arr[2] = &RemovedClass; 

這裏是新用戶, 是用java空當量,爲刪除的類標記。

EDIT

通常當看到用戶陣列中的java 你將不得不將其映射到一個用戶*陣列在C++中。

這些操作之後。

User a; 
User b; 
a = b; 

在Java a和b將是指相同的用戶。在C++中,這樣的代碼將屈服於a和b引用兩個不同的用戶對象。

+1

arr是用戶數組,而不是用戶指針數組。 –

+0

在java中,一切都是參考。在C++中,如果您有**用戶**對象而不是**用戶***,則不能將其設置爲零,除非您願意在**用戶**中擁有存儲該用戶是否爲空或已刪除的成員 –

+0

對,我明白了。我的觀點是,你將arr聲明爲一個用戶數組的指針,然而你正在爲它的元素分配地址。除非元素是指針,否則將地址分配給元素是沒有意義的。 –

0

我使用boost ::可選:

boost::optional<int> a; 

if (!a) { std::cout << "no a!"; } 

a = 5; 

if (a) { std::cout << "a = " << *a; } 

a = boost::none; 

if (!a) { std::cout << "no a!"; }