C++ 给定一个有不同图形的向量,找出有多少是圆,有多少是正方形

C++ 给定一个有不同图形的向量,找出有多少是圆,有多少是正方形,c++,C++,所以我举了一个例子: class figures {}; class square:public figures {}; class circle : public figures {}; ..... int main() { geometric figures* *p; p[0]=new Circle; p[1]=new Square; return 0; }; 等等。我的问

所以我举了一个例子:

  class figures
    {};

    class square:public  figures
    {};

    class circle : public  figures
    {};


    .....

    int main()
    {
    geometric figures* *p;

    p[0]=new Circle;
    p[1]=new Square;

return 0;
    };

等等。我的问题是,如果所有指针都是几何图形类型,我以后如何才能找出几何图形数组中有多少个圆或正方形?

您可以使用
动态\u cast

std::vector<geometric_figures *> shapes;
int num_circles = 0;
int num_squares = 0;
for (geometric_figures * shape : shapes)
{
    if(dynamic_cast<circle*>(shape))
        num_circles++;
    if(dynamic_cast<square*>)(shape))
        num_squares++;
}
std::向量形状;
int num_圆圈=0;
int num_squares=0;
用于(几何图形*形状:形状)
{
if(动态_铸造(形状))
num_圆圈++;
if(动态_铸造)(形状))
num_squares++;
}

您还可以添加一个
enum
以对应于形状的类型,并添加一个
GetType()
方法,该方法返回
enum

您的类中可以有一个
enum

class geometric_figures
{
public:
    enum shape {eSquare, eCircle};
    virtual shape GetShapeType() const = 0;
};

class square : public geometric_figures
{
public:
    shape GetShapeType() const override { return eSquare; }
};

class circle : public geometric_figures
{
public:
    shape GetShapeType() const override { return eCircle; }
};
然后你可以用


#include

您可以使用动态强制转换。例如:

// Returns true if 'a' is of type 'square'
bool isSquare(Figure* a)
{
    return dynamic_cast<Square*>(a) != nullptr;
}
// Returns true if 'a' is of type 'circle'    
bool isCircle(Figure* a)
{
    return dynamic_cast<Circle*>(a) != nullptr;
}
int main()
{
    Figure *p = new Figure[5];
    p[0] = new Circle;
    p[1] = new Circle;
    p[2] = new Square;
    p[3] = new Square;
    p[4] = new Square;
    int circleCnt = 0;
    int squareCnt = 0;
    for(int i = 0; i < 5; i++)
    {
        if(isCircle(p[i]))
        {
            circleCnt++;
        }
        if(isSquare(p[i]))
        {
            squareCnt++;
        }
    }
    cout << "Number of circles: " << circleCnt << endl;
    cout << "Number of squares: " << squareCnt << endl;
}
//如果“a”的类型为“square”,则返回true
布尔·伊斯夸尔(图*a)
{
返回动态_cast(a)!=nullptr;
}
//如果“a”的类型为“circle”,则返回true
布尔isCircle(图*a)
{
返回动态_cast(a)!=nullptr;
}
int main()
{
图*p=新图[5];
p[0]=新圆;
p[1]=新圆;
p[2]=新正方形;
p[3]=新广场;
p[4]=新广场;
int circleCnt=0;
int squareCnt=0;
对于(int i=0;i<5;i++)
{
if(isCircle(p[i]))
{
circleCnt++;
}
if(平方(p[i]))
{
squareCnt++;
}
}

这里可能有多个问题…标识符名称中不能有空格(几何图形),并且,您从未分配数组“p”。也许您正在寻找std::vector?为什么不继续运行总计?谢谢!我知道这是低效的,但实际上分配是查看图形向量中有多少圆和正方形,而不在我将其放入向量时对其进行计数。类似于:给定一个具有不同图形的向量让我们看看有多少是圆。
// Returns true if 'a' is of type 'square'
bool isSquare(Figure* a)
{
    return dynamic_cast<Square*>(a) != nullptr;
}
// Returns true if 'a' is of type 'circle'    
bool isCircle(Figure* a)
{
    return dynamic_cast<Circle*>(a) != nullptr;
}
int main()
{
    Figure *p = new Figure[5];
    p[0] = new Circle;
    p[1] = new Circle;
    p[2] = new Square;
    p[3] = new Square;
    p[4] = new Square;
    int circleCnt = 0;
    int squareCnt = 0;
    for(int i = 0; i < 5; i++)
    {
        if(isCircle(p[i]))
        {
            circleCnt++;
        }
        if(isSquare(p[i]))
        {
            squareCnt++;
        }
    }
    cout << "Number of circles: " << circleCnt << endl;
    cout << "Number of squares: " << squareCnt << endl;
}