У меня проблема с созданием класса, который позволит мне рисовать объекты различной формы.Рисование объектов - лучший дизайн класса?
- Форма является базовым классом
- треугольник, квадрат, прямоугольник являются производные классы от
Shape
класса - У меня есть
vector<Shape*> ShapeCollection
, который хранит производные объекты, т.е.Triangle,Square, Rectangle
- После того, как я выбрать объект из vector Мне нужно нарисовать объект на экране.
На данный момент я застрял в том, что должно быть в дизайне класса, где в качестве одного класса «Рисование» будет выполнен чертеж, потребляющий объект класса «Форма». Поскольку вектор будет содержать разные объекты одного и того же базового класса Shape
. Поскольку у меня есть поток, который захватывает объект из вектора, и как только у меня есть объект, я должен уметь правильно его рисовать.
Так более или менее ниже, что я говорю
class Drawing
{
public:
void Draw(Shape* shape, string objectName)
{
// Now draw the object.
// But I need to know which Object I am drawing or use
// switch statements to identify somehow which object I have
// And then draw. I know this is very BAD!!!
// e.g.
switch(objectName)
{
case "rectangle":
DrawRectangle((Rectangle*) shape)
break;
//Rest of cases follow
}
}
}
Где, как я буду иметь функцию DrawSquare, DrawTriangle, которая будет делать чертеж.
Это должно быть то, что было решено. Должен быть лучший способ сделать это как все это заявление оператора должно уйти как-нибудь!
Любое руководство очень ценится.
Благодаря
@Adrian и @Jerry предложил использовать виртуальную функцию, я думал об этом, но мне нужно, чтобы мой удаляясь от базового класса Shape
Я думал об этом, но то, о чем я думал, заключается в том, чтобы оттянуть чертеж отдельно от базового класса. Совершенно другой класс, который делает рисунок. –
Вы можете использовать что-то вроде делегата, чтобы делать то, что ищете. То есть указатель функции или функтор. Однако, каковы причины этого? Этот тип разделения должен иметь веские основания для этого. – Adrian
@Wajih, я добавил несколько примеров того, как вы можете отделить код чертежа от класса реализации. – Adrian