Попытка присвоить новый производный объект указателю базового класса, но, похоже, ничего не произошло

0

Заранее спасибо за ответы.

store() - это функция класса Backpack, которая содержит массив указателей (Item * items). Аргументы, отправленные в store(), являются правильными (проверены, распечатывая их с помощью cout). displayInventory() по-прежнему печатает предыдущие элементы объекта Item в конце функции.

void store(string & name, float weight, int power, int slot)
        {
            items[slot] = new Weapon(name, weight, power); // Weapon is a derived class of Item
            this->displayInventory();
        }

Благодарю.

EDIT: исследование векторов сейчас.

  • 0
    Вы не инициализировать items , член правильно. Я бы рекомендовал использовать std::vector<std::unique_ptr<Item>> вместо необработанного указателя (массива). Далее вы должны попытаться сузить свой вопрос, чтобы прибить свои проблемы. Как это: TL; DR;
  • 0
    Да, я старался быть кратким, но предоставил всю необходимую информацию. Трудно задать вопрос, если вы не знаете, что не так с самого начала.
Показать ещё 11 комментариев
Теги:

1 ответ

1
Лучший ответ

Во-первых, вот несколько вещей, которые могут облегчить вашу жизнь (и жизнь тех, кто прочитает ваш код). Это упростит ваш код. Следовательно, это будет легче понять и отладить:

  • Используйте соответствующие имена для своих переменных.

Пример:

void store(string & name, float weight, int power, int slot)
{
  items[slot] = new Weapon(name, weight, power);
  numItems+=1;
  this->getInventory();
}
  • Используйте соответствующие/согласованные имена для ваших методов.

Здесь трудно понять, какова цель getInventory() поскольку она начинается с get, но ее возвращаемый тип void. (Может быть, вы имели в виду buildInventory()?)

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

В частности, вам не нужно переопределять name, weight и power (и их получателей) в Weapon, поскольку оно уже определено в Item

  • Если вы не определяете какой-либо конструктор в классе, компилятор предоставит значение по умолчанию без аргументов.

Это означает, что вы можете удалить строку Container(){;}

  • Не изобретайте велосипед. Вам лучше использовать std::vector а не пытаться обрабатывать указатели и массивы.

Я уверен, что последний совет может сам по себе исправить вашу проблему. В частности, если вы используете vector<Item>, вам больше не нужно будет манипулировать указателями. Это означает, что нет new и больше не delete.

  • 0
    Большое спасибо за указатели. Кажется, что научиться использовать вектор - это следующая вещь, которую мне нужно выяснить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню