gpt4 book ai didi

c++ - 绕过基类构造函数初始化,一个坏习惯?

转载 作者:行者123 更新时间:2023-11-28 00:28:06 25 4
gpt4 key购买 nike

我在 OpenGL 项目中有一个基类,它通常表示 3DModel。现在我想创建一个更专业的类,它将继承自 3DModel。我的问题是初始化列表中的强制性基类构造函数调用。是否有正确方法来延迟此调用,直到我在派生构造函数中完成一些计算?

这是代码的重要部分:

class 3DModel {
public:
3DModel(std::vector<...> vertices){ ... };
[...]
private:
std::vector<...> vertices;
[...]
};

class Cylinder : public 3DModel {
public:
Cylinder(float top_bottom_ratio, float base_diameter);
[...]
};

//.cpp

Cylinder(float top_bottom_ratio, float base_width)
:3DModel(...) //<---- Mandatory
{
//I would like to calculate the cylinder vertices here
//and then feed them to the 3DModel constructor
}

现在,我正在考虑创建一个虚拟 3DModel() 构造函数,然后调用派生构造函数中的方法来修改基类的属性。但这听起来很奇怪,它会在构造函数中创建一个危险区域,在该区域中对象将暂时无效。

另一种解决方案是破坏此类并在主程序中简单地进行计算并使用 3DModel 构造函数。但这是一个可悲的解决方案,破坏了黑盒方法。

你有什么见解吗?

最佳答案

您可以将计算放入辅助函数中。理想情况下,将其设为静态,这样您就不会意外访问未初始化的基类值。

class Cylinder : public 3DModel {
public:
Cylinder(float top_bottom_ratio, float base_diameter);
[...]
private:
static calculateVertices(std::vector<...> vertices);
};

//.cpp

Cylinder(float top_bottom_ration, float base_width)
:3DModel(calculateVertices(top_bottom_ratio, base_width))
{
}

std::vector<...> Cylinder::calculateVertices(float top_bottom_ratio, float base_width) {
// calculate and return vertices here
}

您也可以选择组合而不是继承,其中Cylindar 有一个 3DModel 而不是 3D 模型。 (它可能需要其他的东西,例如一个 Renderable 有一个 render() 方法。)

关于c++ - 绕过基类构造函数初始化,一个坏习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com