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&)
Тип 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
будут удалены, они удалят объекты, на которые они указывают.
delete
.
std::vector<std::unique_ptr<Shape>>
как он будет автоматически управлять временем жизни массива и распределением объектов.
Shape
или массивShape*
?