2013-08-07 79 views
0

可以說我有以下類:C++獲取對象

static int counter = 0; 

class Account { 
public: 
    int ID; 
    int favNumber; 

    Account(int favNum) { 
     this->ID = ++counter; 
     this->favNumber = favNum; 
    } 
}; 

Account user1(4); 
Account user2(9); 

現在兩個帳戶user1和user2有不同的ID,它是獨一無二的。有沒有什麼辦法通過知道帳戶的ID獲取對象的字段,如「favNumber」,如果是的話應該如何實現?

喜歡的東西getFieldById(INT ID)

+0

將Account對象存儲在地圖中,並通過ID將其作爲地圖中的鍵進行查找? –

+0

你能做什麼,就是有一堂課,說;祕書,它有一個創建賬戶方法,它在內部創建一個賬戶(將其添加到列表或地圖),然後在這個類上實現您的getById函數(以及明顯的賬戶關閉功能) – Skeen

+1

警告:如果計數器處於頭文件,該ID可能不會保持唯一!爲什麼不把計數器當作私有靜態類成員呢? –

回答

2

您可以使用std::map做到這一點:

#include <map> 

class Account { 
    // Make attributes private. It is a better practice 
    int ID; 
    int favNumber; 

    static int s_Counter; 
//^^^^^^^^^^^^^^^^^^^^^ It is better to move it as a static private member of Account 

public: 

    Account(int favNum) { 
     this->ID = ++s_Counter; 
     this->favNumber = favNum; 
    } 

    // GETTERS 
    int GetFavNumber() const { return favNumber; } 
    int GetID() const { return ID; } 
}; 

int Account::s_Counter = 0; 
// ^^^^^^^^^^^^^^^^^^^^^^^^ Don't forget to initialize it 

Account user1(4); 
Account user2(9); 

std::map<int, Account*> accounts; 
accounts[user1.GetID()] = &user1; 
accounts[user2.GetID()] = &user2; 

// To get a favNum with some id : 
accounts[id]->GetFavNumber(); 

但是,隨着這種技術,確保指針仍然有效!如果沒有,你可以有壞的驚喜...


我們在此之前的代碼都做了些什麼?

  • 我們私下通過了attributs(更好的做法)。
  • 我們創建了Getters來訪問它們。
  • 我們通過了static變量作爲Accountstatic private成員變量。
  • 我們使用std::map來創建帳戶列表,密鑰是帳戶的ID。
+0

當我使用「accounts [1] .GetFavNumber ();」如果我嘗試類似: std :: map accounts; accounts [user1.GetID()] = user1; accounts [user2.GetID()] = user2; accounts [1] .GetFavNumber(); 它給了我錯誤:錯誤C2512:'帳戶::帳戶':沒有適當的默認構造函數可用\t 我真的不知道是什麼問題。 (是的,我創建了主要方法,並在那裏添加了適當的代碼) – Winten

+0

@Winten我的代碼出錯了。更改'accounts [id] .GetFavNumnber();'通過'accounts [id] - > GetFavNumnber();'。我也編輯了我的文章。 –

+0

謝謝Pierre Fourgeaud!這解決了問題。 – Winten

0

您可以使用

std::map<int, Account*> 

通過它們的ID來存儲的指針賬戶。這取決於你確保指針保持有效。或者,您可以使用

std::map<int, Account> 

並讓地圖照看您的帳戶。

0

您需要在中心位置存儲所有將要創建的對象,然後在那裏搜索id。

你可以將它們存儲爲

  • 平原舊陣列
    搜索整個列表,您的ID的對象,然後返回現場

  • ID索引陣列
    陣列[ID]是您需要的對象,返回字段

  • 哈希(std::map)從ID到對象
    類似的語法ID索引數組,但是一個哈希表查找

各有各的優點和缺點在簡單起見,搜索的速度,存儲器使用等

你也可以在上述存儲對象的指針。

要使事情自動化,您可以將上面的列表設置爲Account類的private static成員,並將其添加到構造函數中。

0

您可以創建一個列表,並且每次傳遞構造函數時都會將該項添加到列表中。然後當請求到達您的getFieldById搜索您的列表。

名單將必須在一個地方,你可以在搜索和只啓動一次