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;
};
当然 Rectangle
和 Circle
将继承它:
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);
我是 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;
};
当然 Rectangle
和 Circle
将继承它:
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);