Есть ли способ вызвать родительский конструктор с разными аргументами в зависимости от значения аргумента, который имеет дочерний конструктор?
У меня есть следующий родительский класс:
class Rectangle
{
public:
Rectangle(std::string name, glm::vec3 top_left_corner, float height, float width, glm::vec3 color, bool fill);
~Rectangle();
//...
}
И дочерний класс:
class Wall :
public Rectangle
{
public:
Wall(std::string name, Position position, float scene_height, float scene_width, float thickness, glm::vec3 color);
~Wall();
//...
}
Где Position
- это enum
, который должен определять, с какими аргументами должен вызываться родительский конструктор:
enum Position { UP, DOWN, LEFT, RIGHT };
Так что в основном я быхотелось бы иметь что-то вроде этого в дочернем конструкторе:
Wall::Wall(std::string name, Position position, float window_height, float window_width, float thickness, glm::vec3 color) {
switch(position) {
case UP:
Rectangle(name, glm::vec3(0, window_height, 0), thickness, window_height, color, true);
break;
case DOWN:
Rectangle(name, glm::vec3(0, thickness, 0), thickness, window_width, color, true);
break;
case LEFT:
Rectangle(name, glm::vec3(0, window_height, 0), window_height, thickness, color, true);
break;
case RIGHT:
Rectangle(name, glm::vec3(0, window_width - thickness, window_height), window_height, thickness, color, true);
break;
}
}
Но, как вы знаете, я должен сначала вызвать родительский конструктор, например:
Wall::Wall(std::string name, Position position, float window_height, float window_width, float thickness, glm::vec3 color)
: Rectangle(name, glm::vec3(0, window_width - thickness, window_height), window_height, thickness, color, true) {}
И это неДай мне много свободы.Каким будет хороший объектно-ориентированный подход?