将父母作为孩子传递给函数c ++
Posted
技术标签:
【中文标题】将父母作为孩子传递给函数c ++【英文标题】:Passing parent as child to a function c++ 【发布时间】:2020-08-24 09:51:29 【问题描述】: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;
【问题讨论】:
您仍然必须显式地向下转换指针,因为编译器不知道type
字段和动态类型之间的关系。这是您在代码中强制执行的约定。不过,无论如何,仅使用双分派可能更容易。
将指针称为“_reference”有点令人困惑,因为它不是 C++ 意义上的引用。
阅读“访问者模式”。 (你已经成功了。)
还可以考虑使用枚举而不是char* type
(尽管这里双重调度更好)
看看visitor pattern和double dispatch。
【参考方案1】:
作为传统继承的替代方案(似乎只用于允许多次调度),您可以使用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);
【讨论】:
【参考方案2】:显然最好使用双重调度。哪个写起来不一样,但不是更难,结果也一样。
【讨论】:
以上是关于将父母作为孩子传递给函数c ++的主要内容,如果未能解决你的问题,请参考以下文章