2012-04-29 73 views
0

我有一個Student對象的數組。我將數組長度設置爲100,但其中沒有100個有效的Student對象。我希望能夠遍歷數組並獲取所有有效的對象,然後在到達不具有Student對象的數組單元格時停止。在對象數組中找到最後使用的元素

我已經嘗試將NULL放入最後一個學生後的數組單元格中,然後檢查if (queriedStudents[i])以及if(queriedStudents[i] != NULL),但都沒有爲我工作。

什麼是最好的方式來找到我的數組的使用部分的結束?

Student *Welcome::queryStudents(int *queries) { 
    int query = 0; 
    Student *matchedStudents[100]; 
    int matchedPos = 0; 
    while (queries[query] > 0) { 
     for (int i = 0; i < numStudents; i++) { 
      if (allStudents[i]->id == queries[query]) { 
       matchedStudents[matchedPos] = allStudents[i]; 
       matchedPos++; 
      } 
     } 

     query++; 
    } 
    matchedStudents[matchedPos] = NULL; 

    return *matchedStudents; 
} 

而且我的代碼塊試圖打印出每個Student的價值觀:

 int i = 0; 
     while (i < 100) { 
      if (queriedStudents[i]) { 
       cout << "ID:\t" << queriedStudents[i]->id << endl; 
       cout << "Name:\t" << queriedStudents[i]->name << endl; 
       cout << "Addr.:\t" << queriedStudents[i]->address << endl; 
       cout << "Phone:\t" << queriedStudents[i]->phone << endl; 
      } else { 
       i = 100; 
      } 
      i++; 
     } 
+5

如果可能,請使用'std :: vector'而不是數組 - 它會跟蹤它包含的對象的數量。 – 2012-04-29 02:49:33

+2

如果數組包含指針,那麼只要您在開始向其添加指針之前使用NULL初始化數組,就可以使用NULL描述的方式工作。這將使您不得不手動處理每個項目上的新/刪除。正如Jerry所說,vector是避免這種情況的一個好選擇,只存儲您實際使用的內容。另一種方法是,如果無論出於何種原因都不能使用矢量,可能會將「有效」成員添加到您的Student對象,該對象默認初始化爲false,並且只有在對象中存在實際數據時才設置爲true。 – 2012-04-29 03:04:13

+1

@RetiredNinja:好評,更好的答案。發表它! – greg 2012-04-29 03:13:58

回答

3

你已經有了一個更大的問題。您可以在函數queryStudents的堆棧中聲明數組matchedStudents。當控制超出該函數時,數組超出範圍。如果你稍後嘗試使用它(通過它返回的指針,它是數組的第一個元素),那麼你正在搞亂釋放內存,這幾乎肯定會導致未定義的行爲。就好像你正在訪問一個自從你去年以來已經改變了所有者的房子;不知道發生了什麼變化,如果你閉着眼睛徘徊,你可能會陷入困境。

可以聲明堆上的數組:

Student **Welcome::queryStudents(int *queries) { 
    Student **matchedStudents = new *Student[100]; 
    ... 
    return matchedStudents; 
} 

或引用傳遞在:

void Welcome::queryStudents(int *queries, Student **&matchedStudents) { 
    ... 
} 

無論哪種方式,你就可以解決如何指示到底問題有效的指針。你的方法看起來可行,但請記住,正如@JerryCoffin指出的那樣,std::vector可用。陣列是一種痛苦,而STL容器(例如vector)則是爲你處理這些骯髒的細節而設計的。除了教學法之外,現在使用陣列幾乎沒有任何用處;與他們一起玩,直到你理解了這些概念,然後使用基於它們的更高級的容器。

+0

這幾乎就是我所在的位置;這是我這學期上課的第一個任務,我最大的問題是從Java和AS3切換到C++。一旦我理解了這些概念,我就繼續前進。 – 2012-04-29 04:21:25

相關問題