2010-09-28 57 views
0

是否有任何實際的方法讓對象與地圖一起工作? (如果這是一個糟糕的問題,我對地圖不是很瞭解,所以很抱歉)。我有興趣使用包含項目對象的庫存系統的地圖。項目對象具有名稱,說明和貨幣值。關鍵將是項目的名稱,鏈接變量將是我對該特定項目的項目數量。使用地圖庫存系統

如果地圖不工作,沒有任何人有一個很好的選擇,這種類型的系統?我需要跟蹤每種物品的數量。

+7

你可能想通過教程學習C++。我們很難在問答網站教你C++。看看[這個偉大的C++書籍列表](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – sbi 2010-09-28 18:22:25

+0

如果我知道關於C++的一切,我不需要去問答網站。一直在閱讀教程,閱讀書籍,並試圖從同行程序員那裏獲得幫助:) – graydragon10 2010-09-28 19:22:07

+2

也許在這裏抽象數據類型和算法的一些基礎也可能有幫助。如果您對如何挑選正確的技術解決方案似乎沒有背景知識,那麼您用您選擇的最終技術選項來描述一個不確定的問題。 '庫存系統'爲一個汽車場,網上書店,電腦遊戲,家庭DVD目錄?什麼是輸入/輸出,多少次同步變化以及多久? – 2010-09-28 19:59:35

回答

4

C++標準模板庫是map只是一個儲存容器,因此可以肯定與對象一起使用。該地圖會將您的對象作爲其模板參數參數。

的地圖將您的庫存系統的正常工作。使用類似:

#include <pair> 
#include <map> 
#include <string> 
#include <iostream> 

class Item { 
    public: 
    Item(void) {} 
    ~Item(void) {} 
    Item(std::string new_name) { 
     my_name=new_name; 
    } 
    void setName(std::string new_name) { 
     my_name= new_name; 
    } 
    std::string getName(void) { 
     return my_name; 
    } 
    private: 
    std::string my_name; 
}; 

class Item_Manager { 
    public: 
    Item_Manager(void) {} 
    ~Item_Manager(void) {} 
    void addItem(Item * my_item, int num_items) { 
     my_item_counts.insert(std::pair<std::string,int>(Item.getName(),num_items)); 
    } 
    int getNumItems(std::string my_item_name) { 
     return my_item_counters[my_item_name]; 
    } 
    private: 
    std::map<std::string, int> my_item_counts; 
}; 

main() { 
    Item * test_item = new Item("chips"); 
    Item * test_item2 = new Item("gum"); 
    Item_Manager * my_manager = new Item_Manager(); 

    my_manager->addItem(test_item, 5); 
    my_manager->addItem(test_item2,10); 
    std::cout << "I have " << my_manager->getNumItems(test_item->getName()) 
      << " " << test_item->getName() << " and " 
      << my_manager->getNumItems(test_item2->getName()) 
      << " " << test_item2->getName() << std::endl; 

    delete test_item; 
    delete test_item2; 
    delete my_manager; 
} 

這裏的STDLIB地圖和其功能上的參考: http://www.cplusplus.com/reference/stl/map/

看功能頁的如何通過遍歷/索引地圖實例等

+0

我想,它向我抱怨。有沒有很好的解決方法? – graydragon10 2010-09-28 18:10:01

+0

Your Item類不應位於命名空間標準中。你混淆了賦值和聲明。在一秒鐘內看到我上面的編輯。 – 2010-09-28 18:14:17

+2

graydragon10:'std :: map'的類型參數決定編譯時間。我懷疑'getName'返回一個'std :: string'?如果是這樣,你應該聲明它'std :: map '。 – Skurmedel 2010-09-28 18:15:32

3

如果你在談論std::map,它可以與任何類型的對象,只要一種方式,提供訂貨比較對象一起工作的模板。由於您的鍵(名字)是一個字符串,它的工作權利開箱即用std::map

struct Item 
{ 
    std::string description; 
    int value; 
}; 


int main() 
{ 
    // associate item names with an item/quantity pair 
    std::map<std::string, std::pair<Item, int> > itemmap; 
} 
+0

問題是,我的項目是一個類(設法使它可重用爲未來的遊戲,我打算從子類的話) – graydragon10 2010-09-28 18:04:55

+1

爲什麼是一個問題? – 2010-09-28 18:05:54

+1

@graydragon - 您可以創建一個對數量有一個項目和一個int的引用的類。基本結構仍然是相同的 - 即一個帶有鍵的地圖,指向其中一個類的項目名稱。 – 2010-09-28 18:06:39

1

我需要每種類型的項目我有數量的東西保持跟蹤。

std::vector<std::pair<Item, int> >怎麼樣?

+0

如果我只希望每個項目類型出現在列表中一次,這樣做會工作嗎?像蘋果 - 5,橘子-2等 – graydragon10 2010-09-28 18:08:14