C++更改构造函数中的类型

C++ changing type in constructor?

本文关键字:类型 构造函数 C++      更新时间:2023-10-16

我有一个抽象类Engine3D它在头文件中的结构(Vector3D等)。

现在,我有一个针对该类的实现,ConcreteEngine3D : Engine3D .此外,我还有其他类,例如 ConcreteVector3D : Vector3D,它们具有将在 ConcreteEngine3D 中使用的其他成员和方法(为了此示例,假设它是 float lengthcalculateLength() )。

总的来说.cpp我有代码:

#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
    engine = new ConcreteEngine3D();
    Vector3D* vector = new Vector3D(engine, 10, 5, 2);
}

我希望变量vector类型为 ConcreteVector3D* .

我将在ConcreteEngine3D中需要该类型,但主要是.cpp我什至不应该知道它是该类型,也不必使用像length这样的扩展字段。另外,我不能在main中使用任何专门来自ConcreteEngine3D.h.cpp的东西(仅限Engine3D.h) - 这是为了灵活,更改实现必须意味着仅更改包含和行new ConcreteEngine3D()

我不想修改上面的代码或Engine3D的原始标头。

Vector3D 的构造函数中,我总是放置一个指向Engine3D对象的指针(我在这里给出ConcreteEngine3D类型)。

也许我可以在Vector3D的构造函数中做一些事情来更改它的类型?

例如,在构造函数内部调用Vector3D* Engine3D::convert(Vector3D v),该构造函数将从 ConcreteEngine3D 中的Engine3D继承(这会创建一个新的 ConcreteVector3D 对象,其中包含 Vector3D 中的字段并返回它)。

当然,该代码不起作用:

Vector3D::Vector3D(Engine3D *engine){
    //how to 'return' or 'convert' the type to the one that returns engine->convert(this);
}

所以基本上,我想获得下面代码的效果,但没有行vector = engine->convert(vector)Vector3D* vector2 = new ConcreteVector3D(engine, 10, 5, 2)

#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
    engine = new ConcreteEngine3D();
    Vector3D* vector = new Vector3D(engine, 10, 5, 2); //produces Vector3D, not ConcreteVector3D
    vector = engine->convert(vector); //cannot be here! but creates the right object
    Vector3D* vector2 = new ConcreteVector3D(engine, 10, 5, 2); //also creates rights object, but cannot be here!
}

另外,我不想在Engine3DConcreteEngine3D使用工厂。我想允许"用户"按照我在第一个代码中编写的方式创建Vector3D

听起来您希望

使用抽象工厂模式来实例化对象,这样您就不必直接调用具体类的构造函数。然后,如果你想改变实现接口的具体类型,你只需要链接到你的abstracy工厂的不同实现,或者在运行时选择适当的工厂实现。

编辑:错过了"不想使用工厂"...无论如何,您将需要某种重定向,因为构造函数将返回您实例化的类型。您可以获得的最接近的可能是创建一个静态工厂方法"创建"到类 Vector3D,该方法返回指向 Vector3D 的指针,但在内部创建具体实现类的实例。如果您这样做,最好将 Vector3D 的构造函数设为私有,以防止以"错误的方式"创建矢量。

安德鲁·托马佐斯,关于不清楚的写作 - 对此感到抱歉:/

我必须同意长颈鹿船长的观点,即如果不改变.cpp,我就无法实现这一目标。我使用了稍微修改过的工厂模式:

我必须制作 Vector3D::create() 静态函数,它将调用 Engine3D::convert() 并返回它的结果。所以代码将是:

#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
    engine = new ConcreteEngine3D();
    Vector3D vector = Vector3D::create(engine, 10, 5, 2);
}

Vector3D内部::创建:

返回引擎>转换(new Vector3D(x,y,z));

这将产生ConcreteVector3D(因为引擎的类型是ConcreteEngine3D)。

main.cpp的最小变化,可以接受(main.cpp中没有提到ConcreteVector3D)。

再次感谢你们所有人的帮助! :-)