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

まず第一に、mitemName の代わりに m_name を使用する必要があります。これは、はるかに読みやすく、より広く使用されています。

実際の問題として、aItems のベクトルを保持する aItem というインベントリがあります。これが問題です。アイテム用のクラスとインベントリ用のクラス (必要な場合) を作成します。彼らは同じクラスになることはできません。

ここでは、アイテムの名前、タイプ、ダメージのみを制御するアイテム クラスを作成します (これを Item と呼びます。必要に応じて 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、それはヘッダーファイルです。

そして、これが私の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 に答える