Search code examples
c++classinventory

C++ OOP inventory and item class


creating Inventory class as well as item class... working on inventory "removing" item from inventory.

#include "Inventory.h"
#include <iostream>

void Inventory::PrintInventory() {
    for (auto i = items.begin(); i != items.end(); i++) {
        std::cout << i->name << " " << i->numItem << std::endl;
    }
}

void Inventory::ReceiveItem(Item item) {
    items.push_back(item);
}

Item Inventory::TakeItem(int num) {
    items.erase(items.begin() + num);
    auto item = std::find(items.begin(), items.end(), num);
    //issue is here
    //my teacher said to set it up as Item Inventory that takes in an int.
    return item;
}

//this is in the actor class...

void Actor::GiveItem(Actor* actor, Item item) {
    int num = item.numItem;
    actor->inventory.ReceiveItem(item);
    inventory.TakeItem(num);
}

question is... im not sure what to do in the Item Inventory function of the Inventory class, it's supposed to return something, but im not sure why.. teacher is unreachable. and if it is supposed to return an Item object, i need to get Item object from the integer value. the Item objects class has a char* name; and int numItem;


Solution

  • It is supposed to return an Item object, I need to get Item object from the integer value.

    Okay so you're pretty close here. From your description it sounds like Item is defined as

    struct Item
    {
        std::string name;
        int numItem;  ///< search for this value
    };
    

    And your items is an STL container of Item, we'll use std::vector<Item> items;.

    If you must return an Item object then you should declare a default Item to return on error. If you successfully find a match for Item::numItem then you will populate your default Item with these values. Finally, if you did find an item to take, you will erase it for inventory housekeeping. Do not erase the Item before you find it for obvious reasons!

    Item TakeItem(int num)
    {
        Item localItem;
        for (auto it = items.begin(); it != items.end();) {
            // if we find a match set local item and then
            // remove the item from inventory
            // and break out of loop since we are done
            if ((*it).numItem == num) {
                localItem = *it;
                it = items.erase(it);
                break; // found and removed from inventory!
            } else {
                ++it;
            }
        }
        return localItem;
    }
    

    It's a little bit awkward to return a default-constructed Item in the event that there were not any matches for num found, but if you want to detect that case you could always do something like initialize it to "bogus" values that you know can't be in your inventory.