2010-09-28 69 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