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);
}