C ++多态循环depenencies双调度(C++ Polymorphic Circular de

2019-10-19 02:37发布

所以,我在与循环依赖的一个大问题。 我Square.h和Circle.h类都继承Shape.h,并使用双调度,以试图发现两者之间的碰撞。 我的类是目前在以下排序时尚的设置

Shape.h

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

Square.h

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

Circle.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

Answer 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 ,因为碰撞检测-qualifying一切不需要修改任何东西。



Answer 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;
};


文章来源: C++ Polymorphic Circular depenencies with double dispatch