Вопреки вашему окончательному комментарию, это, по-видимому, вполне разумное приложение для std::vector
.
Как сейчас, вы пытаетесь создать массив из N объектов, но затем у некоторых из них фактически есть пустые/несуществующие объекты.
На самом деле это не сбор за фиксированный размер. Это коллекция с переменным размером до определенного указанного максимума. В данный момент игрок может нести 1 предмет или 10, но есть некоторое максимальное количество предметов, которые они могут нести. Они не, однако, постоянно несут максимальное количество элементов, а некоторые из них являются нулевыми объектами .
С учетом того, с чем вы имеете дело, это коллекция с переменным размером (до указанного максимума), std::vector
идеально подходит для счета. Поскольку вы имеете дело с классом Item
, вероятно, разумно предположить, что фактическими элементами будут экземпляры конкретных классов, которые происходят от Item
. В этом случае вам действительно нужно хранить (несколько разновидностей) указатель в массиве, а не фактические объекты Item (иначе каждый производный элемент, который вы пытаетесь поместить в массив, будет «нарезанным», чтобы стать фактическим объектом Item, а не производный объект, когда он хранится в массиве).
Вы можешь сделать это путем создания коллекции unique_ptr
с (или другими различными другими умными типов указателей, такими как shared_ptr
), но я бы вообще рекомендую в такой ситуации вы считаете Boost ptr_vector
типа вместо ,
Что касается ограничения размера, вы, вероятно, захотите создать небольшой класс-оболочку для обработки этого. Это не совсем сложная задача, но лучше всего централизовать этот код в одном месте, а не дублировать код проверки размера везде, где вы можете добавить элемент в инвентарь.
template <class T>
class inventory {
ptr_vector<T *> items;
size_t max;
public:
inventory(size_t max) : max(max) {}
push_back(T *t) {
if (items.size() < max)
items.push_back(t);
}
// other miscellany here.
};
Это возможно, однако, что вы не имеют полиморфный иерархию Item
с. Вместо этого у вас только один фиксированный тип для всех элементов в инвентаре, каждый из которых имеет имя и т. Д. Если это так (т. Е. Все Item
s действительно являются одним и тем же типом объекта), нет причин вмешиваться в указатели или ptr_vector
. Вы действительно просто хотите std::vector<Item>
. Однако, как и прежде, вы, несомненно, хотите централизовать код, чтобы обеспечить максимальный размер инвентаря (и, возможно, также предоставить другие услуги, связанные с инвентаризацией).
- Если вы позволите мне экскурс, тот факт, что кто-то даже рассматривать такую возможность указывает на степень, в которой с помощью Java деформирует сознание людей и разрушает их способность ясно мыслить. Перефразируя Дейкстра, преподавание Явы должно быть уголовным преступлением.
Какая ошибка? То, как вы объявили свой массив, должна быть выбрана строка 'inventory [i] = it', которая бросает ошибку. – Proxy