我对c ++很陌生,我只是试图掌握它使用的指针和语法。我已经使用了大约6个星期,我正在制作一个小型游戏引擎,试图在编程方面做得更好。我目前有一个列表,它将保存Transforms,这是我用来保存对象基本特征的超类。我有两个子类用于我的变换,GameObject和Primitive。
基元是基本形状,例如平面和立方体,其中游戏对象是包含子项和父项的对象。我已经以这样的方式创建了转换可以是父级并且有子级的,因此可以连接这些子类以进行移动转换等。
这一切都通过多态实现,但是当我尝试在我的变换列表上调用渲染器时,它将调用驻留在transform中的Update的超类版本。它在理论上不应该像其他语言一样。所以我不得不尝试将它们投射到各自的课程中,这有点麻烦,但我遇到了一个问题。
令人恼火的是,我不能像(Primtive)变换一样。它还搞砸了变量primitiveType,它使它成为一些奇怪的大数。
for (Transform go : gameObjects)
{
if (go.type == TYPE_MESH)
{
Transform* t = new Transform();
t = &go;
Primitive* primitive = static_cast<Primitive*>(t);
if (primitive->primitiveType == P_CUBE)
{
Cube* cube = static_cast<Cube*>(primitive);
cube->Update();
}
//delete t;
}
if (go.type == TYPE_GAMEOBJECT)
{
}
我注释掉的原因&#34;删除t;&#34;是不是因为某些原因打破了编译器,当它真的不应该被我看到。所以目前它会导致小内存泄漏。
发生了什么事?我的所有更新函数都是用虚拟void Update()编写的,所以不管变量是什么形式都没关系?无论是变换还是原语,函数应该首先调用应用于它的任何代码?
答案 0 :(得分:1)
这里有很多问题,但至少你需要:
dynamic_cast
。您可以让它抛出异常(在reference-cast上)或返回nullptr
(在指针强制转换上)答案 1 :(得分:0)
您正在参与大量不必要的演员/新/删除体操,这让我对您实际使用的数据结构感到疑惑。
多态性要求您拥有存储指向对象的指针的容器,而不是对象本身(因为对象可以是不同的大小)。我希望你这样做,否则你就会得到对象切片。
一旦你排序了,凌乱的代码就会变成这个。
for (Transform *t : gameObjects)
{
if (t->type == TYPE_MESH)
{
Cube* cube = dynamic_cast<Cube*>(t);
if (cube)
cube->Update();
}
...
此外,if (t->Type == ..)
有点代码味道。你不能使用动态强制转换来确定对象类型吗?