我是 C++ 新手,我想编写我的第一个教程。
我想编写一个程序来实现对表示图形符号的对象列表的搜索。
该列表包含由两个边长描述的矩形和由半径描述的圆。
我还想创建一个搜索过程,它接受一个列表和矩形边长,并返回另一个列表,其中只包含适合给定矩形的这些符号。
列表(和搜索功能)的实现应该允许在不修改任何现有代码的情况下扩展已接受符号的列表(例如添加多边形)。
我应该遵循什么样的方法?你能给我一个类似的例子吗?
我是 C++ 新手,我想编写我的第一个教程。
我想编写一个程序来实现对表示图形符号的对象列表的搜索。
该列表包含由两个边长描述的矩形和由半径描述的圆。
我还想创建一个搜索过程,它接受一个列表和矩形边长,并返回另一个列表,其中只包含适合给定矩形的这些符号。
列表(和搜索功能)的实现应该允许在不修改任何现有代码的情况下扩展已接受符号的列表(例如添加多边形)。
我应该遵循什么样的方法?你能给我一个类似的例子吗?
这是多态性的用途——您将拥有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
返回的内容将其推送到另一个向量:
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);