如何解决将父代作为子代传递给函数C ++
BoxCollider,CillinderCollider和PlaneCollider都是公开的:Collider,所以 我是在做错什么,还是在C ++中根本不可能?
这是代码:
class Collider
{
public:
Collider();
~Collider();
std::string* checkCollision(Collider* _reference);
char* type;
std::string* tag;
protected:
virtual bool checkBox(BoxCollider* _reference);
virtual bool checkPlane(PlaneCollider* _reference);
virtual bool checkCilinder(CillinderCollider* _reference);
};
class BoxCollider : public Collider
{
public:
BoxCollider();
~BoxCollider();
private:
virtual bool checkBox(BoxCollider* _reference);
virtual bool checkPlane(PlaneCollider* _reference);
virtual bool checkCilinder(CillinderCollider* _reference);
};
这是给我错误的函数:
std::string* Collider::checkCollision(Collider* _reference)
{
bool collided;
switch (*_reference->type)
{
case BOX: collided = checkBox(_reference); break;
case CILINDER: collided = checkCilinder(_reference); break;
case PLANE: collided = checkPlane(_reference); break;
default: std::cout << "invalid collision type\n"; exit(0);
}
if (collided) { return _reference->tag; }
return NULL;
}
解决方法
作为传统继承的替代方法(似乎仅用于允许多调度),您可以使用std::variant
:
// Your shape structures
struct Box
{
// center,dimension,direction...
};
struct Plan
{
// origin,vector_x,vector_y...
};
struct Cylinder
{
// origin,radius,vector_height...
};
// The real collision functions
bool checkCollision(const Box&,const Box&);
bool checkCollision(const Box&,const Plan&);
bool checkCollision(const Box&,const Cylinder&);
bool checkCollision(const Plan& plan,const Box& box) { return checkCollision(box,plan); }
bool checkCollision(const Plan&,const Plan&);
bool checkCollision(const Plan&,const Cylinder&);
bool checkCollision(const Cylinder& cylinder,const Box& box) { return checkCollision(box,cylinder); }
bool checkCollision(const Cylinder& cylinder,const Plan& plan) { return checkCollision(plan,cylinder); }
bool checkCollision(const Cylinder&,const Cylinder&);
// The dispatch:
using Shape = std::variant<Box,Plan,Cylinder>;
bool checkCollision(const Shape& shape1,const Shape& shape2)
{
return std::visit([](const auto& lhs,const auto& rhs){ return checkCollision(lhs,rhs); },shape1,shape2);
}
,
显然,最好使用双重调度。编写方法不同,但难度和结果相同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。