2011-08-04 37 views
3

我正在做這個學習/練習與對象數組和對象的指針數組,我很困惑如何獲得動態數組大小。對象數組的對象元素(大小)

我有這樣的:

private: 
    Client ** arr_client; 

public: 
    static string members []; 

然後填充切分數據數組arr_client從下面的靜態字符串數組成員:

static string members[] = {"Jhon Perez 623 22 12 1998" 
          ,"Louis Smith 199 02 12 1988" 
          ,"Daniel Martinez 106 02 01 2010"}; 


void load(void){ 

arr_client = new Client * [(sizeof(members)/sizeof(string))*sizeof(Client)]; 

    for (i = 0; i < (sizeof(members)/sizeof(string)); i++){ 
     istringstream stream(members[i],ios_base::in); 

     stream >> name; 
     stream >> lastname; 
     stream >> aux; 
     id = atoi(aux.c_str()); 
     stream >> date; 
     date.append(" "); 
     stream >> aux; 
     date.append(aux); 
     date.append(" "); 
     stream >> aux; 
     date.append(aux); 

     arr_client[i] = new Client(name,lastname,id,date); 
    } 
} 
現在

,之後的對象數組已滿,我想通過arr_client循環,但我似乎找不到辦法。

我應該使用:

for (int i =0; i < (sizeof(**arr_client)/sizeof(client)); i++) 

或採取大小以前CAL和做:

for (int i =0; i < (sizeof(members)/sizeof(string)); i++) 

,並用它做什麼?對我來說看起來並沒有那麼有用......但是我又很新了。

幾個問題,我也得到了:

如果我不知道對象的動態assinged數組的大小?就像在這種情況下,即時通訊建立在已知大小的陣列上。

如何計算其中有多少元素,以便我可以循環使用它?

我可以爲arr_client使用std :: iterator嗎?

任何提示,將不勝感激=)

與....是的,我不知道<vector>和它的優點,但絕不會傷害知道這些情況。

+0

您的程序中擁有的星星越多,您就越會迷惑每個人。再加一個,你將成爲[三星程序員](http://c2.com/cgi/wiki?ThreeStarProgrammer)。請嘗試一些有用的東西! –

+0

@Bo:引用你的鏈接''最近與我合作過的最好的程序員之一是來自人力資源部門的一種轉換,並且符合你描述的模式,所以我們希望那些可能是三星程序員但有良好的口味和判斷力,不想成爲「這個總結了我在實踐這些層級的指導背後的大部分思想。 –

+0

我一直是一個程序員30年,我不能不使用紙和鉛筆做多星代碼。但這並不重要,因爲你很少使用它。如果你想學習C++,我的建議是跳過C的做事方式並專注於C++。寫得最好的C代碼就像C++一樣糟糕。他們是兩種不同的語言。 –

回答

1

首先,我贊成你試圖採用像vector一個先進的工具之前,學習基礎知識。

有沒有乾淨和可靠的方式來做你所要求的。人們通常記住的數組的大小,在一個單獨的變量,就像這樣:

unsigned int num_strings=3; 
static string members[num_strings]; 

如果你真的希望確定在運行時一個數組的大小,你可以用一個模板做到這一點:

template<typename T, size_t N> 
size_t arraySize(T(&)[N]) 
{ 
    return(N); 
} 
+0

向量不是一個「先進」的工具,而是一個簡單的工具,正是爲了解決這類問題而設計的。用新的和刪除的多星級編程並不是學習C++的好方法,但更像是一種浪費的努力 –

+1

@Bo Persson:一個教學哲學的問題我認爲每個學生都應該花幾個小時的時間去修剪和磨損工作使用原始工具之前,它提供了寶貴的洞察力,但你說得對,我應該說「更先進」 – Beta

+0

只是爲了記錄,我沒有試圖建立我的編程風格使用2和3 「星星」等人時間。我確實認爲,瞭解成爲「三星程序員」的缺點將有助於避免它;一旦你知道了事情的原因和方式,總是很容易做到。 –

0

如果我不知道動態分配的對象數組的大小怎麼辦?就像在這種情況下,即時通訊建立在已知大小的陣列上。

如何計算其中有多少元素,以便我可以循環使用它?

您總是需要知道尺寸。您必須將其保存在陣列旁邊,否則您無法安全地使用它。這就是爲什麼你不應該使用動態數組,而是安全的容器,如std::vector或Boost.MultiArray。

而且你不能使用sizeof,因爲sizeof是一個編譯時操作符。

我可以爲arr_client使用std :: iterator嗎?

您可以使用pointer_to_start爲一個範圍開始和pointer_to_start + size的範圍內結束,只要一個迭代的預期。

0

如果我不知道動態分組的 對象的大小,該怎麼辦?就像在這種情況下,即時通訊建立在已知大小的陣列上。 如何計算其中有多少元素,以便我可以循環使用它?

你不行。指針不包含這些信息。你應該以其他方式保留它。

我可以爲arr_client使用std :: iterator嗎?

std::iterator是,你應該派生自定義iterator類從避免重複輸入了很多類型定義的模板。但是任何指針都是隨時可用的隨機訪問迭代器。我建議你閱讀a good C++ book。我自己的投票將用於Lippmann的C++入門。它會幫助你一個真正的很多

+0

嘿,謝謝對於書籍清單我來自java和這種內存管理的c + +看起來非常吸引人,但它只是在我的腦海裏混亂 –