C++ C++;正在更改构造函数中的类型?

C++ C++;正在更改构造函数中的类型?,c++,class,types,polymorphism,C++,Class,Types,Polymorphism,我有一个抽象类Engine3D,它的结构(Vector3D等)在头文件中 现在,我有了该类的一个实现,ConcreteEngine3D:Engine3D。另外,我还有其他类,如ConcreteVector3D:Vector3D,它们有额外的成员和方法,将在ConcreteEngine3D中使用(在本例中,假设它是float length和calculateLength()) 在main.cpp中,我有以下代码: #include "ConcreteEngine3D.h" Engine3D * e

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

现在,我有了该类的一个实现,
ConcreteEngine3D:Engine3D
。另外,我还有其他类,如
ConcreteVector3D:Vector3D
,它们有额外的成员和方法,将在
ConcreteEngine3D
中使用(在本例中,假设它是
float length
calculateLength()

在main.cpp中,我有以下代码:

#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
    engine = new ConcreteEngine3D();
    Vector3D* vector = new Vector3D(engine, 10, 5, 2);
}
我希望变量
vector
的类型为
ConcreteVector3D*

我需要在
ConcreteEngine3D
中使用该类型,但在main.cpp中,我甚至不应该知道它是那种类型,也不必使用像
length
这样的扩展字段。此外,我不能在main.cpp中使用ConcreteEngine3D.h(仅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=newconcretevector3d(engine,10,5,2)


另外,我不想在
Engine3D
ConcreteEngine3D
中使用factory。我想允许“用户”按照我在第一段代码中编写的方式创建
Vector3D

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


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

Andrew Tomazos,关于不清楚的书写-很抱歉:/

我必须同意长颈鹿船长的看法,如果main.cpp没有任何变化,我就无法实现这一目标。我使用了稍加修改的factory模式:

我必须创建Vector3D::create()静态函数,该函数将调用Engine3D::convert()并返回结果。因此,代码将是:

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

返回引擎->转换(新矢量3D(x,y,z))

这将生成ConcreteVector3D(因为引擎是ConcreteEngine3D类型)

main.cpp中的最小更改,可接受(main.cpp中未提及ConcreteVector3D)


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

也许最好写一个小程序来演示这个问题。您试图实现的目标并不十分明确。现在您正在为不应编译的值(
Vector3D vector=new Vector3D…
)分配指针。您可以覆盖
Vector3D
操作符new
,让它分配
sizeof(ConcreteVector3D)
。然后,在Vector3D中,创建一个
ConcreteVector3D
memcpy(这个…)
。但那太可怕了。你不会帮你的用户带来这样的惊喜——读一读这本书。我建议您重新考虑使用工厂-使用
Vector3D*GetVector3D()
方法。在单独的cpp文件中定义它,并让它返回指向
ConcreteVector3D
对象的指针。这样,您就不会依赖于
ConcreteVector3D
“另外,我不想使用factory…”:)谢谢,我也在考虑这个问题。不幸的是,这将使我使用Vector3D v=MyFactory::create(),而不是构造函数。有没有办法改用它?@PolGraphic如果你不修改第一个示例代码,你就不可能达到你想要达到的目的。工厂是正确的解决方案。构造函数不是多态的。他们总是按照他们告诉你的方式建造工厂。“不想使用工厂”是一个糟糕的论点(没有道理)。对语法的迷恋只会让你陷入困境。当然,谢谢。起初我忘了,但现在我接受了你的建议。
#include "ConcreteEngine3D.h"
Engine3D * engine;
...
int main(){
    engine = new ConcreteEngine3D();
    Vector3D vector = Vector3D::create(engine, 10, 5, 2);
}