все! Я нахожусь в процессе создания класса инвентаря. Вот что у меня есть для файла реализации:
//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 () — моя проблема. Если у меня его нет из списка, в котором я знаю имена, как я могу добавить вновь созданный предмет в вектор инвентаря?
Прежде всего, вы должны использовать m_name вместо mitemName, его гораздо проще читать и он более широко используется.
Теперь к вашей реальной проблеме, у вас есть инвентарь под названием aItem, который содержит вектор aItems … Вот ваша проблема, создайте класс для предмета и класс для инвентаря (если он вам нужен). Они не могут быть в одном классе.
Итак, здесь я создаю свой класс предметов (я назову его 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
Теперь вы можете свободно реализовывать любые методы для любого из этих классов, если вам когда-нибудь понадобится что-то еще.
Если ваш инвентарь не должен быть отдельным классом, как предлагали другие, вы можете передать его в класс предметов, когда он необходим по ссылке. Вероятно, это не лучший способ сделать это, но вам не придется писать другой класс.
Например.
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);
}
Но опять же, класс инвентаря, который правильно обрабатывает область видимости или управление памятью, будет лучше, чем этот, почти во всех случаях.
Итак, у вас есть класс с именем aItem, который должен быть «предметом», а также хранить инвентарь? Похоже, вам нужен другой класс для поддержания инвентаря, который содержит вектор предметов.
Во-вторых, у вас есть переменная стека в качестве инвентаря прямо сейчас. Как только ваш конструктор выходит из области видимости, он исчезает.
Наконец, вам нужно будет создать временный «предмет» для добавления в инвентарь. Вот что отталкивает;)