将父母作为孩子传递给函数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 ++的主要内容,如果未能解决你的问题,请参考以下文章

将 Go 函数作为回调传递给 C

React:将状态从孩子传递到孩子再传递给父母

C ++:将未知的union传递给函数作为参数

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

React Native - 将父母的状态传递给孩子的麻烦

Ruby - 将方法作为回调传递给 DLL 库