Привет, эксперты, я могу сделать динамическое связывание, как это.
objshapes — это родительский класс Shape, а Rectangle — дочерний класс. У меня есть несколько дочерних классов, поэтому в зависимости от того, какую форму выбирает пользователь, мне нужно привязать правильную форму к objShapes. Так что я думал, что смогу связать вот так. но я получаю ошибку.
Shape *objShapes[3];
objshapes[size]= &new Rectangle(3,lvaule,5)
//error: lvalue required as unary ‘&’ operand
Надеюсь, кто-то может помочь. Спасибо
ЭТО ПРАВИЛЬНО
objshapes[size]= new Rectangle(3,lvaule,5)
Shape *objShapes[3];
Это объявляет objshapes как массив из 3 указателей на Shape.
objshapes[size]= &new Rectangle(3,lvaule,5)
Это бессмысленно.
ЭТО ПРАВИЛЬНО
objshapes[size]= new Rectangle(3,lvaule,5)
да1, это правильно. new
возвращает указатель на прямоугольник, который может храниться в переменной типа указатель на форму. поскольку objshapes
это массив указателей на форму. objshapes[size]
это указатель на форму — который может принимать указатель на прямоугольник.
1. Предполагая, что size
конвертируется в целочисленный тип и имеет значение 0
, 1
, или же 2
,
Вам понадобится массив или контейнер указателей, или предпочтительно умные указатели, в базовый класс. Например:
std::vector<Shape*> objshapes;
objshapes.push_back(new Rectangle(3,lvaule,5));
objshapes.push_back(new Circle( args));
Если вы используете необработанные указатели вместо интеллектуальных указателей, вы должны убедиться, что выделили память, используемую фигурами, путем вызова delete
на всех указателях.
редактировать так как вы неохотно используете стандартные библиотечные контейнеры, и вы пояснили, что у вас есть массив Shape*
, в отличие от массива Shape
, затем вы можете заполнить массив следующим образом:
objshapes[idx]= new Rectangle(3,lvaule,5);