2010-09-28 5 views
0

Есть ли какой-либо практический способ получить объекты для работы с картами? (Я не очень много знаю о картах, так что извините, если это плохой вопрос). Я заинтересован в использовании карты для системы инвентаризации, которая будет содержать объекты объектов. Объект объекта имеет имя, описание и денежную стоимость. Ключ будет именем элемента, а переменной связывания будет количество элементов, которые у меня есть для этого конкретного элемента.Использование карты для системы инвентаризации

И если карта не работает, у кого-нибудь есть хорошая альтернатива этому типу системы? Мне нужно что-то отслеживать количество каждого типа предметов, которые у меня есть.

+7

Возможно, вам захочется изучить C++ через учебник. Мы вряд ли научим вас C++ на сайте Q & A. См. [Этот список замечательных книг на C++] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – sbi

+0

Если бы я знал все о C++, мне не нужно было бы идти на сайт Q & A. проводили учебные пособия, читали книги и пытались получить помощь от других программистов :) – graydragon10

+2

Возможно, здесь может быть полезно некоторое обоснование абстрактными типами данных и алгоритмами. Вы описываете неопределенную проблему с окончательной технической опцией, которую вы выбрали, когда у вас нет базовых знаний о том, как выбрать правильное техническое решение. «Система инвентаря» для автомобильного двора, интернет-магазина книг, компьютерной игры, домашнего каталога dvd? какие входы/выходы, сколько синхронных изменений и как часто? –

ответ

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

+0

Класс Item не должен находиться в стандарте пространства имен. Вы путаете назначение и объявление. См. Мои предыдущие изменения за секунду. –

+2

graydragon10: параметры типа 'std :: map' определяются временем компиляции. Я подозреваю, что 'getName' возвращает строку' std :: string'? Если это так, вы должны объявить его 'std :: map '. – Skurmedel

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

проблема в том, что мой Item является классом (пытается сделать его многоразовым для будущих игр, и я планирую его подклассификацию) – graydragon10

+1

Почему это проблема? –

+1

@graydragon - вы можете создать класс, который имеет ссылку на элемент и int для количества. базовая структура будет по-прежнему одинаковой - а именно карта с ключом как имя элемента, указывающая на один из этих классов. –

1

мне нужно что-то отслеживающее количества каждого типа элемента у меня есть.

Как насчет std::vector<std::pair<Item, int> >?

+0

Будет ли это работать, если я хочу, чтобы каждый тип элемента отображался в списке один раз? как яблоки - 5, апельсины - 2 и т. д. – graydragon10

Смежные вопросы