C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 设计一个函数,它将两个抽象的基类对象作为参数,并根据对象的Derived类做不同的事情大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
==编辑3 ==

最后,我刚刚将一个checkIntersect(ShapE)checkIntersectSpecific(Circle / Polygon / TrianglE)抽象方法添加到Shape中,并使它们调用我的免费(非成员)函数,这些函数已经在一个地方实现,同时使用了一些预处理器和标题技巧,以保存自己一些重复的代码,以防我需要添加其他子类.为了完成起见,我会标记杰弗弗里的答案,因为他是最接近我所做的,但是我很感谢你们所有人向我展示了一些我实际上不了解的很酷的东西(功能模板)并将我链接另外两个问题也提出了访客/双重调度作为解决方案.

然我不得不说,但我希望我们能很快看到C中的多种方法.

==编辑超过==

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

我最初的想法是只有一个(形状,形状)函数,并以某种方式检查形状的类型,然后调用适当的交叉检查函数,但我读到这称为RTTI,通常被认为是坏的.我读到了访客和双重调度,但我看到的方式,这些并没有真正解决我的问题.如果我错了,请随时纠正我.无论如何,现在我被卡住了.我几乎没有想到这个标题.

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 – 设计一个函数,它将两个抽象的基类对象作为参数,并根据对象的Derived类做不同的事情全部内容,希望文章能够帮你解决c – 设计一个函数,它将两个抽象的基类对象作为参数,并根据对象的Derived类做不同的事情所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。