2012-11-19 16 views
2

all!我正在創建庫存類。以下是目前爲止的實現文件:使用.push_back將新創建的物品添加到庫存中

//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()中間的突然切入是我的問題。如果我沒有從名單中拉出來,我如何將新創建的物品添加到我的庫存矢量中?

+1

它看起來像你想有一個類'X'包含一個'矢量'。這是不可能的,因爲它意味着無限遞歸(矢量中的每個'X'都包含'X'對象,每個對象都包含一個'vector ',每個對象都包含... – juanchopanza

+0

您的當前實現說*您的項目有-a inventory *。這個邏輯對我來說看起來不太合適 – andre

回答

2

首先,你應該使用m_name而不是mitemName,它只是更容易閱讀和更廣泛使用。

現在到您的實際問題,您有一個名爲aItem的庫存,其中包含aItems的向量...這是您的問題,創建物品的類和庫存的類(如果需要的話)。他們不能在同一班上。

所以在這裏我創建了我的物品類(我會稱之爲物品,如果您願意,可以調用您的物品),它只控制物品的名稱,類型和傷害。

#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 

現在,你可以自由地實現任何方法對這些類中的任何一個,如果你需要什麼了。

+0

謝謝,我我很不理解「virtual〜Item()的目的,因爲我不熟悉」〜「。 –

+0

我想你知道什麼構造函數Item :: Item() 。現在'Item ::〜Item()'是相反的,它是類的「析構函數」,只要對象被銷燬,它就會被調用。你當然可以忽略它,但是你可以添加一個父屬性到物品所在的庫存)到Item類,並且以這種方式在Ite內m的析構函數,你可以調用'm_parent.removeItem(this)'或其他。然而,這只是一個可選的建議,主要是爲了幫助你瞭解析構函數的作用。 – 2012-11-20 12:40:43

0

所以你有一個叫做aItem的類,它應該是一個「物品」,也存儲庫存?聽起來就像你需要另一個類來維護包含項目向量的庫存。

其次,您現在有一個堆棧變量作爲您的清單。只要你的構造函數超出範圍,它就消失了。

最後,您將需要創建一個臨時「項目」以添加到清單。這是什麼被推回;)

+0

謝謝你可以告訴我,我是一個剛剛試圖通過這種方式進行討論的新手,讓我給你一個建議! –

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:

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:

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

或者,你可以,如果你想處理內存問題,而不是範圍的問題用指針來代替.cpp:

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

但是,在幾乎所有情況下,正確處理範圍界定或內存管理的庫存類都比這更好。

+0

當然,它不一定是一個班級,但它應該是一個。如果這會更進一步,有一個向量可能不夠。 – 2012-11-20 12:44:45

相關問題