如何询问对象是否属于类x?

时间:2015-09-24 18:20:03

标签: c++ object

所以我有Shape.h,Rectangle.h,Circle.h和main.cpp。

Shape.h得到了:

class Shape{
public:
    Shape() {};
    ~Shape() { cout << "Destroy Shape."; };

    virtual double getArea() = 0;
    virtual double getCircumference() = 0;
};

矩形和圆圈各自的代码。

现在在main.cpp我做

Shape* newRectangle= new Rectangle(4, 8);
Shape* newCircle= new Circle(10);

到目前为止一切都很精致和花花公子。这是我难倒的地方。我知道我要做什么,我只是不知道怎么做。

我正在尝试编写一个函数来检查Shape *对象是否属于Circle。

它就是这样的

if Shape* object belongs to Object-Type Circle, then
cout << "It's a Circle, bruh!";
else
cout << "Ain't a circle, yo!";

我开始用谷歌搜索后开始:

void check(Shape & object){
    Circle& checkObject = dynamic_cast<Circle&>(object);

}

main中的函数将通过以下方式调用:

check(*newRectangle);
check(*newCircle);

但我还不知道如何继续:(。任何帮助和解释都表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:6)

  1. 尽量避免基于派生类型的逻辑。尽可能使用virtual成员函数。

    class Shape {
       public:
          virtual void print(std::ostream& out) const = 0;
       ...
    };
    

    并在派生的clases中实现该函数。

    class Circle : public Shape {
       public:
          virtual void print(std::ostream& out) const
          {
             out << "Got a Circle.\n";
          }
    
       ....
    };
    
  2. 如果使用virtual会员功能无法解决问题,则需要诉诸dynamic_cast

    Shape* shapePtr = <some pointer>;
    Circle* circlePtr = dynamic_cast<Circle*>(shapePtr);
    if ( circlePtr ) {
       // Access Circle functionality.
    }
    

答案 1 :(得分:4)

您可以通过动态地将html_from_view = ExampleDetail.as_view({'get': 'retrieve'})(request, pk=my_id).render().content 指针指向所需类型的指针并检查Shape来执行此操作:

nullptr

这需要打开运行时类型信息,并且您的对象至少有一个虚拟函数(确实如此)。

注1:如果您必须执行此类操作,请查看您是否可以更改设计,以便不必执行此操作。例如,您可以应用多个调度模式,例如 Visitor ,以避免此检查:

if (dynamic_cast<Circle*>(object)) {
    cout << "It's a Circle, bruh!";
}

现在你可以打印出你看到的那种形状:

struct ShapeVisitor {
    virtual ~ShapeVisitor() {}
    virtual void visitCircle(const Circle* circle);
    virtual void visitRectangle(const Rectangle* rectangle);
};

class Shape{
public:
    Shape() {};
    virtual ~Shape() { cout << "Destroy Shape."; };

    virtual double getArea() = 0;
    virtual double getCircumference() = 0;
    virtual void Accept(const ShapeVisitor& visitor) = 0;
};

struct Circle : public Shape {
    virtual void Accept(const ShapeVisitor& visitor) {
        visitor.visitCircle(this);
    }
};

struct Rectangle : public Shape {
    virtual void Accept(const ShapeVisitor& visitor) {
        visitor.visitRectangle(this);
    }
};

注2:您需要将struct PrintTypeVisitor : public ShapeVisitor { virtual void visitCircle(const Circle* circle) { cout << "It's a Circle, bruh!"; } virtual void visitRectangle(const Rectangle* rectangle) { cout << "It's a Rectangle, bruh!"; } } ... PrintTypeVisitor v; Shape* object = ... object.Accept(v); // This prints dynamic type of the object 的析构函数设为虚拟。