gpt4 book ai didi

c++ - 设计一个将两个抽象基类对象作为参数的函数,并根据对象的派生类做不同的事情

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:59 25 4
gpt4 key购买 nike

==编辑 3==

最后,我只是在 ShapecheckIntersect(Shape) 中添加了一个抽象方法和让他们调用我的免费(非成员)函数,这些函数已经在一个地方实现,同时使用一些预处理器和头文件技巧来为自己保存一些重复代码,以防我需要添加其他子类。为了完成起见,我将标记 Jeffrey 的回答,因为他的回答最接近我所做的,但是我感谢你们所有人向我展示了一些我实际上不知道的很酷的东西(函数模板)并将我链接到其他 2 个问题也提出了 Visitor/Double dispatch 作为解决方案。

虽然我不得不说,但我希望我们能尽快在 C++ 中看到多方法。

==编辑结束==

所以我有一个基类 Shape 及其子类:TrianglePolygonCircleVector 和 10 个静态函数,它们采用不同对的所述子项来检查它们是否相交。我还有一个 GameObject 类,它有一个 Shape* 成员,我想实现碰撞检测。出于这个原因,我需要像 bool checkIntersection(Shape*, Shape*) 这样的东西来处理任何类型的形状。

我最初的想法是只有一个 (Shape, Shape) 函数并以某种方式检查 Shapes 的类型,然后调用适当的交集检查函数,但我读到这称为 RTTI 和通常被认为是坏的。我阅读了 Visitors 和 Double dispatch,但在我看来,这些并不能真正解决我的问题。再一次,如果我错了,请随时纠正我。无论如何,现在我被困住了。我什至想不出这个标题。

EDIT2:不一定非要这样设计。我只需要在某种程度上易于维护,并且最好在我决定稍后添加另一个子类时不需要更新每个 Shape 子类。

编辑:澄清一下,这是我要完成的工作:

class Shape {...} //this is an abstract class
class Circle : public Shape {...}
class Triangle : public Shape {...}
class Polygon : public Shape {...}

bool checkIntersection(const Shape &s1, const Shape &s2)
{
//Do some magic and call the right function
}

bool checkIntersection(const Circle &c, const Triangle &t) {..check...}
bool checkIntersection(const Circle &c, const Polygon &p) {...check...}
//and the rest of the functions for the different combinations

class GameObject
{
Shape * shape;//Shape is abstract
bool collidesWith(const GameObject& obj)
{
return checkIntersection(*this->shape, *obj.shape);
}
}

最佳答案

您正在尝试删除类型然后使用该类型。这没什么意义。只需使用重载。不需要在那里使用基类:

checkIntersection(const& Triangle, const& Polygon) { ... }
checkIntersection(const& Triangle, const& Circle) { ... }
// ...

checkIntersection(const& Polygon p, const& Triangle t) {
return checkIntersection(t, p);
}
// ...

关于c++ - 设计一个将两个抽象基类对象作为参数的函数,并根据对象的派生类做不同的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28792154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com