typecasting和check是一个存在于向量中的实例

typecasting and check is an instance exists in a vector

本文关键字:于向量 向量 实例 存在 一个 typecasting check      更新时间:2023-10-16

我有一个虚拟类Shape。类Rectangle、Triangle、Circle继承自Shape并具有不同的特性(大小、边数…(。我想在一个结构中存储不同的形状(比如向量(。

所以我的矢量是:vector<Shape*> myvec;

我想知道如何知道一个给定的形状实例是否存在于向量中(例如:new Circle(diameter 10);(。

我听说过动态演员阵容,但我完全不明白如何使用它?

class Shape
{
public:
  Shape(){}
  virtual int Size()=0;
  virtual int Sides()=0;
  virtual bool isequal(const Shape & rhs)=0;
  int size,sides;
};
class Circle : public Shape
{
public:
  Circle(int diameter):size(diameter)
  {
    sides=0;
  }
  bool isequal(const Circle &rhs)
  {
    return size==rhs.size;
  }
  int size,sides;
};
class Rectangle: public Shape
{
  Rectangle(int nbsides,int size1,int size2 ): sides(nbsides),size1(size1),size2(size2){}
   bool isequal(const Rectangle &rhs)
  {
    return (size1==rhs.size1 && rhs.size2==size2);
  }
  int sides,size1,size2;
};

dynamic_cast正确:

Shape* shape = myvec[0];
Circle* circle = dynamic_cast<Circle*>(shape);
if(circle != nullptr)
   ; // it's a Circle! Do something circly.
else
   ; // it's not a Circle. Do something else.

但这个问题的更好答案是,在一个完美的世界里,你应该使用多态性,这样就很少有必要这样做了。

根据下面的附加注释,我认为您可能希望在Shape中使用纯虚拟isequal((,在各种实现中使用dynamic_casts(多态比较函数的内部是我可以使用dynamic_cast而不必事后洗手的少数地方之一:(。

// edited out code that isn't directly relevant
class Shape
{
public:
  virtual bool isequal(const Shape& rhs)=0;
};
class Circle : public Shape
{
public:
  // snip
  virtual bool isequal(const Shape &rhs) override
  {
    Circle* rhsAsCircle = dynamic_cast<Circle*>(&rhs);
    if(rhsAsCircle == nullptr)
       return false; // not a Circle; can't be equal
    return size==rhsAsCircle->size;
  }
};

然后在其他地方:

Circle searchCircle(10);
for(Shape* shape : myvec)
   if(shape->isequal(searchCircle))
      ; // we have a match!