C++更改构造函数中的类型
C++ changing type in constructor?
我有一个抽象类Engine3D
它在头文件中的结构(Vector3D
等)。
现在,我有一个针对该类的实现,ConcreteEngine3D : Engine3D
.此外,我还有其他类,例如 ConcreteVector3D : Vector3D
,它们具有将在 ConcreteEngine3D
中使用的其他成员和方法(为了此示例,假设它是 float length
和 calculateLength()
)。
总的来说.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!
}
另外,我不想在Engine3D
或ConcreteEngine3D
使用工厂。我想允许"用户"按照我在第一个代码中编写的方式创建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)。
再次感谢你们所有人的帮助! :-)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 构造函数正在调用一个使用当前类类型的函数
- 如何修复函数样式强制转换或类型构造的预期"("?
- 具有默认模板类型的默认构造函数的类型推导
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 不命名构造函数和析构函数上的类型错误
- 具有自定义构造函数 (C++) 的类型的动态数组分配
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 创建类类型的动态分配数组,其中类不得具有默认构造函数
- 初始化自定义类型构造函数的数组
- OpenGL着色器错误C1068:类型构造函数中的数据过多
- Lambda 闭包类型构造函数
- 仅当基础类型具有模板类型构造函数时,才实现这些构造函数
- 模板类的构造函数在使用 new 关键字时调用类型构造函数
- 如何强制函数参数为相同类型,并且不允许使用类型构造函数与给定类型匹配
- 模板类型构造函数参数
- 它们是c++中的类型构造函数
- 解析C++类型构造函数