【问题标题】:C++ Polymorphic Circular depenencies with double dispatch具有双重分派的 C++ 多态循环依赖项
【发布时间】:2013-12-05 02:53:38
【问题描述】:

所以,我在循环依赖方面遇到了一个大问题。我的 Square.h 和 Circle.h 类都继承了 Shape.h,并使用双重调度来尝试检测两者之间的冲突。我的课程目前按以下方式设置

形状.h

class Shape {
public:
    virtual bool detectCollision(Shape* obj) = 0;
    virtual bool detectCollision(Square* obj) = 0;
    virtual bool detectCollision(Circle* obj) = 0;

方形.h

#include "shape.h"
class Square : public Shape {
public:
    bool detectCollision(Shape* obj);
    bool detectCollision(Square* obj);
    bool detectCollision(Circle* obj);

圆.h

#include "shape.h"
class Circle: public Shape {
public:
    bool detectCollision(Shape* obj);
    bool detectCollision(Square* obj);
    bool detectCollision(Circle* obj);

基本上我希望能够做类似的事情

Circle circle;
Square square;
Square square2;

circle.detectCollision(&square);
square.detectCollision(&square2);

但是当我尝试编译它时遇到了一些错误。显然,包括“Circle.h”在内的 Square.h 将导致一个不会执行的循环循环。有人可以为这个问题提出一个好的解决方案吗?

显然两个正方形和一个圆形和一个正方形之间的碰撞检测是不同的,所以我需要以某种方式重载这些方法。我认为这将是一个很好的解决方案,任何指针?

错误(这些编译错误与 Square.cpp 和 Shape.cpp 相同):

Circle.cpp
    shape.h(12): error C2061: syntax error : identifier 'Square'
    shape.h(13): error C2061: syntax error : identifier 'Circle'
    shape.h(13): error C2535: 'bool Shape::detectCollision(void)' : member function already defined or declared

【问题讨论】:

  • 能否请您发布一些错误?
  • 为什么你需要三个版本的detectCollisionShape * 一个就够了吗?
  • @razeh,我更新了一个错误 sn-p。
  • @NedStark shape 是不够的,因为正方形和正方形、圆形和正方形、圆形和圆形之间的碰撞检测都是不同的!

标签: c++ polymorphism circular-dependency double-dispatch


【解决方案1】:

您只需要前向声明。

class Square; // Declarations, not definitions.
class Circle;

class Shape {
    // At this point, Square * and Circle * are already well-defined types.
    // Square and Circle are incomplete classes though and cannot yet be used.

我建议使用引用而不是指针,因为nullptr 不是一个可行的参数,而const-限定所有内容,因为碰撞检测不需要修改任何内容。

【讨论】:

  • 嘿,这肯定是在正确的方向,它现在编译时抽象方法实现了简单的 return false;陈述。但是说我不在以下方法定义中的 square.cpp bool Square::detectCollision(Circle *circle) { return circle->detectCollision(this); } 现在错误是我们指向一个不完整的类。这是如何解决的?
  • @ThomasAnderson 您需要在两个实现文件的顶部同时使用#include "square.hpp#include "circle.hpp"。每个班级都需要访问其他班级。只有抽象类才能看到不完整的类声明。
【解决方案2】:

你需要转发声明类:

class Square;
class Circle;

class Shape {
public:
    virtual bool detectCollision(Shape* obj) = 0;
    virtual bool detectCollision(Square* obj) = 0;
    virtual bool detectCollision(Circle* obj) = 0;
};

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2020-06-24
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2018-04-21
    • 2016-10-03
    相关资源
    最近更新 更多