Добавление вновь созданных предметов в инвентарь с использованием .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 () — моя проблема. Если у меня его нет из списка, в котором я знаю имена, как я могу добавить вновь созданный предмет в вектор инвентаря?

2

Решение

Прежде всего, вы должны использовать 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

Теперь вы можете свободно реализовывать любые методы для любого из этих классов, если вам когда-нибудь понадобится что-то еще.

2

Другие решения

Если ваш инвентарь не должен быть отдельным классом, как предлагали другие, вы можете передать его в класс предметов, когда он необходим по ссылке. Вероятно, это не лучший способ сделать это, но вам не придется писать другой класс.

Например.

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);
}

Но опять же, класс инвентаря, который правильно обрабатывает область видимости или управление памятью, будет лучше, чем этот, почти во всех случаях.

1

Итак, у вас есть класс с именем aItem, который должен быть «предметом», а также хранить инвентарь? Похоже, вам нужен другой класс для поддержания инвентаря, который содержит вектор предметов.

Во-вторых, у вас есть переменная стека в качестве инвентаря прямо сейчас. Как только ваш конструктор выходит из области видимости, он исчезает.

Наконец, вам нужно будет создать временный «предмет» для добавления в инвентарь. Вот что отталкивает;)

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector