2

全部!我正在创建一个库存类。到目前为止,这是我所拥有的实现文件:

//aItem .cpp implementation file

#include "stdafx.h"
#include "aitem.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

//setting this up default
aItem::aItem()
{
    vector<aItem> inventory;
    mitemName = "Default Name";
    mitemType = "Default Type";
    mdamage  = 9001;
}

void aItem::ItemList()
{
    for( vector<aItem>::size_type index = 0; index < inventory.size(); index++ ) 
        {
            //Makes a numerical list.
            cout << "Item " << index + 1 << ": " <<  inventory[index].mitemName << endl;
            index+= 1;
        }
}

void aItem::ItemAdd(string itemName, string itemType, int damage)
{
    mitemName = itemName;
    mitemType = itemType;
    mdamage = damage;

    inventory.push_back

ItemAdd() 中间的突然切割是我的问题。如果我没有从我知道名称的列表中提取它,我如何将新创建的项目添加到我的库存向量中?

4

3 回答 3

2

首先,您应该使用 m_name 而不是 mitemName,它更容易阅读,并且使用更广泛。

现在对于您的实际问题,您有一个名为 aItem 的库存,它包含 aItems 的向量...这是您的问题,为项目创建一个类,为库存创建一个类(如果您需要的话)。他们不能在同一个班级。

所以在这里我创建了我的物品类(我会称之为物品,如果你愿意,你可以叫你的aItem),它只控制物品的名称、类型和损坏。

#ifndef ITEM_H
#define ITEM_H

#include <string>

class Item {
    public:
        Item();
        virtual ~Item();
        virtual void setName(std::string name);
        virtual std::string getName();
        virtual void setType(std::string type); // consider enum for types here
        virtual std::string getType();
        virtual void setDamage(int damage);
        virtual int getDamage();

    private:
        std::string m_name;
        std::string m_type;
        int m_damage;
};

#endif // ITEM_H

我想你可以.cpp自己编写代码,那就是头文件。

这是 my Inventory.h,您可以再次重命名以符合您的喜好。

#ifndef INVENTORY_H
#define INVENTORY_H

#include "item.h"
#include <vector>

class Inventory {
    public:
        Inventory();
        virtual ~Inventory();
        virtual void addItem(Item* item);
        virtual void removeItem(int index); // You could implement removeItem(Item* item); too

    private:
        std::vector<Item*> m_items;
};

#endif // INVENTORY_H

现在,如果您还需要任何其他方法,您可以自由地为这些类中的任何一个实现任何方法。

于 2012-11-19T16:28:43.083 回答
1

如果您的库存不需要像其他人建议的那样成为自己的类别,则可以在需要时通过引用将其传递给项目类别。这可能不是最好的方法,但您不必编写另一个类。

例如。

int main(){
    aItem sword("wooden","sword", 5);
    aItem axe("stone", "axe", 15);
    std::vector<aItem> inventory;
    sword.addTo(inventory);
    axe.addTo(inventory);
    ...

在 aItem.cpp 中:

void aItem::add(std::vector<aItem> &inventory){
    inventory.push_back(*this);
}

或者,如果您想处理内存问题而不是范围问题,则可以使用指针:

int main(){
    aItem* sword = new aItem("wooden","sword", 5);
    aItem* axe = new aItem("stone", "axe", 15);
    std::vector<aItem*> inventory;
    sword->addTo(inventory);
    axe->addTo(inventory);
    ...

在 aItem.cpp 中:

void aItem::add(std::vector<aItem*> &inventory){
    inventory.push_back(this);
}

但同样,在几乎所有情况下,正确处理范围或内存管理的清单类都会比这更好。

于 2012-11-19T16:37:06.050 回答
0

所以你有一个名为 aItem 的类,它应该是一个“项目”并且还存储库存?听起来您需要另一个类来维护包含项目向量的库存。

其次,您现在有一个堆栈变量作为您的库存。一旦您的构造函数超出范围,它就消失了。

最后,您将需要创建一个临时“项目”以添加到库存中。这就是被推回的原因;)

于 2012-11-19T16:25:07.093 回答