C++ - 几何基元 class 层级

C++ - geometric primitives class hierarchy

我是 C++ 新手,我想完成我的第一个教程。

我想编写一个程序来搜索表示图形符号的对象列表。

该列表包含由两个边长描述的矩形和由半径描述的圆。

我还想创建一个搜索过程,它接受一个列表和矩形边长,returns 另一个列表仅包含适合给定矩形的这些符号。

列表(和搜索功能)的实现应该允许 在不修改的情况下扩展接受的符号列表(例如添加多边形) 任何现有代码。

我应该遵循什么样的方法?你能给我一个类似的例子吗?

这是多态性的用途 - 您将使用 std::vector<Object*>std::vector<std::shared_ptr<Object>> 来保存对象列表。

对象基本上应该是这样的:

class Object
{
public:
    virtual ~Object() = default;

    // needs to be implemented by deriving classes i.e. Rectangle and Circle
    virtual bool fitsIn(Rectangle const& r) const = 0;
};

当然 RectangleCircle 将继承它:

class Rectangle : public Object
{
    int x, y, w, h;

public:
    Rectangle(int x, int y, int w, int h) : x(x), y(y), w(w), h(h) {}

    virtual bool fitsIn(Rectangle const& r) const override
    {
        // return whether can fit in r based on this object's and r's x, y, w and h
    }
};

然后您就可以将它添加到列表中,遍历并在每个元素上调用 fitsIn,根据 fitsIn returns 将其推送到另一个向量:

std::vector<std::shared_ptr<Object>> objects, fitting_objects;

objects.push_back(new Rectangle(10, 10, 20, 20)); // classic polymorphism spectacle

// rectangle for the area containing the objects we're looking for
Rectangle r(5, 5, 30, 30);

for(auto const& object : objects)
    if(object.fitsIn(r))
        fitting_objects.push_back(object);