【发布时间】:2019-11-19 21:44:04
【问题描述】:
希望你能帮我解决这个问题。考虑以下类层次结构:
class Collider
{
public:
... //Some functions that aren't worth mentioning. They all are abstract so the class is abstract.
}
class CircleCollider : public Collider
{
private:
vec2 pos_;
float radius_;
public:
... //The definition of the parent functions and constructor / destructor.
}
class RectCollider : public Collider
{
private:
vec2 pos_;
vec2 size_;
public:
... // Again, the definition of the parent functions and constructor / destructor.
}
在另一个类中,我有一个指向父类的指针,它根据枚举值创建两个子类之一的新实例,如下所示:
void SetCollisionType(ECollisionType Type)
{
switch(Type)
{
case CIRCLE:
{
Collider* collider = new CircleCollider(pos, radius);
break;
}
case RECTANGLE:
{
Collider* collider = new RectCollider(pos, size);
break;
}
}
}
请注意,我已经简化了函数,以便您了解我的代码是如何工作的。现在我要做的是更新每个子类的成员变量的函数,radius 用于CircleCollider,size 用于RectCollider。我想在 Collider 类中添加一个函数:
virtual void UpdateCollider(float NewRadius, vec2 NewSize) = 0;
然后在每个子类中定义。
void CircleCollider::UpdateCollider(float NewRadius, vec2 NewSize)
{
radius_ = NewRadius;
}
void RectCollider::UpdateCollider(float NewRadius, vec2 NewSize)
{
size_ = NewSize;
}
我看到的问题是CircleCollider 中使用的定义不会使用NewSize 参数,NewRadius 也会发生同样的情况,RectCollider 中的定义。但是,我想不出另一种方法来做到这一点。您是否知道另一种利用此代码中存在的层次结构和多态性的方法?非常感谢您!
【问题讨论】:
-
这实际上取决于您如何调用该方法。这两个不同的论点是否有些相关?也许半径是尺寸的欧几里得长度?调用者应该知道它在哪个对撞机上运行,或者它应该对两者使用相同的输入,从中计算两个不同的参数。在后一种情况下,您应该能够在对撞机中移动此计算。
-
注意:像
{ Collider* collider = new CircleCollider(pos, radius); }这样的东西几乎肯定会造成内存泄漏,因为collider几乎会立即超出范围。希望这部分已经简化,实际上不在您的代码中。 -
@Chipster 哦,当然!实际上对撞机是我的类“Sprite”的成员变量。我只是想显示变量类型以防有任何疑问^^谢谢您的回答!
标签: c++ polymorphism hierarchy