C ++ не соответствует 'operator =' in '* foo

0
Shape *foo = new Shape[2];
foo[0] = new Triangle();

Форма класса. Треугольник класса наследует Shape, конструктор по умолчанию. Я использую приведенное выше, чтобы сделать первый элемент foo Triangle и дал мне: no match for 'operator=' in '*foo = (((Triangle*)operator new(20u)), (<anonymous>->Triangle::Triangle(), <anonymous>))' candidates are: Shape& Shape::operator=(const Shape&)

  • 1
    Вам нужен массив Shape или массив Shape* ?
  • 0
    Форма массива, где я могу привести первый элемент Triangle и второй Rectangle ...
Теги:

1 ответ

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

Тип foo[0] - это Shape. Вы не можете назначить Triangle* для foo[0]. Что вам нужно:

Shape** foo = new Shape*[2];
foo[0] = new Triangle();

Убедитесь, что вы удалили содержимое foo прежде чем звонить

delete [] foo;

Лучшая альтернатива

Используйте std::vector из std::unique_ptr s.

std::vector<std::unique_ptr<Shape>> foo;
foo.push_back(std::unique_ptr<Shape>(new Triangle()));

Затем вам не нужно беспокоиться об освобождении памяти от явной памяти. std::vector позаботится об удалении std::unique_ptr s. Когда std::unique_ptr будут удалены, они удалят объекты, на которые они указывают.

  • 2
    Пожалуйста, не учите людей использовать встроенные массивы и необработанные указатели и delete .
  • 1
    Я бы настоятельно предпочел std::vector<std::unique_ptr<Shape>> как он будет автоматически управлять временем жизни массива и распределением объектов.
Показать ещё 2 комментария

Ещё вопросы

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