Sak*_*mon 4 c++ oop inheritance
有没有办法根据子构造函数的参数值调用具有不同参数的父构造函数?
我有以下父类:
class Rectangle
{
public:
Rectangle(std::string name, glm::vec3 top_left_corner, float height, float width, glm::vec3 color, bool fill);
~Rectangle();
//...
}
Run Code Online (Sandbox Code Playgroud)
和孩子班:
class Wall :
public Rectangle
{
public:
Wall(std::string name, Position position, float scene_height, float scene_width, float thickness, glm::vec3 color);
~Wall();
//...
}
Run Code Online (Sandbox Code Playgroud)
哪里Position是enum应该决定什么样的参数的父类的构造应该被称为:
enum Position { UP, DOWN, LEFT, RIGHT };
Run Code Online (Sandbox Code Playgroud)
所以基本上,我想在子构造函数中有这样的东西:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是如你所知,我必须首先调用父构造函数,如:
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) {}
Run Code Online (Sandbox Code Playgroud)
这并没有给我太多的回旋余地.一个好的,面向对象的方法是什么?
创建工厂方法:
Rectangle MakeRectangle(const std::string& name,
const Position& position,
float window_height, float window_width,
float thickness,
const glm::vec3& color)
{
switch(position) {
case UP:
return Rectangle(name,
glm::vec3(0, window_height, 0),
thickness,
window_height,
color,
true);
case DOWN:
return Rectangle(name,
glm::vec3(0, thickness, 0),
thickness,
window_width,
color,
true);
case LEFT:
return Rectangle(name,
glm::vec3(0, window_height, 0),
window_height,
thickness,
color,
true);
case RIGHT:
return Rectangle(name,
glm::vec3(0, window_width - thickness, window_height),
window_height,
thickness,
color,
true);
}
throw std::runtime_error("Invalid position");
}
Run Code Online (Sandbox Code Playgroud)
然后
Wall::Wall(std::string name,
Position position,
float window_height, float window_width,
float thickness,
glm::vec3 color)
: Rectangle(MakeRectangle(name, position, window_height, window_width, thickness, color)){
// ...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |