c++ - 如何遍历基类对象的 vector ?

标签 c++ inheritance stl

我有一个问题,我们需要有许多形状,例如圆形和方形,它们可以放置在平坦的二维平面上。所有形状,例如 Circle 和 Square,都继承自一个抽象基类 Shape;因此,我有一个指向形状的指针 vector 。

但是,我需要能够遍历平面并找到任何碰撞的形状,以便它们相交或接触。如果我从 vector 中得到一个形状,我不知道它是 Square 还是 Circle,因为它已经被切片到 Shape 基类。

我如何最好地解决这个问题?

#ifndef Plane_h
#define Plane_h

#include <vector>
#include "Shape.h"

class Plane {
public:
    Plane(std::vector<Shape*>);
    Plane(const Plane&);
    ~Plane();

    void add(Shape*);
    std::vector<Shape*> all() const;

protected:
    std::vector<Shape*> shapes;
};

#endif

最佳答案

您的类(class)尚未切片。 会产生一个切片对象:

vector<Shape> vec;
Circle circ;
vec.push_back(circ);

http://en.wikipedia.org/wiki/Object_slicing

在您的实例中,实例化对象保持完整并且指针指向整个对象 - 但几乎可以肯定的是,为了计算交集,您需要进行一些向下转换。虽然应该尽可能少地这样做,但这本身并不是犯罪。

你最好的选择是在基类中提供一个方法来返回一个指示对象类型的值——可能使用枚举——并使用它来向下转换特定的 Shape 指针或引用指向正确派生类型的指针/引用。

Shape 基类中的抽象方法,如 bool Intersects( const Shape& obj ) 可以被派生类覆盖,覆盖将参数向下转换为正确的派生类类型。

或者,您可能更愿意提供一个采用两种形状的全局/静态方法,或者私下实现该方法并从实例方法 Intersects()

中调用它

(检测交叉点并不是一项简单的任务。:-))

关于c++ - 如何遍历基类对象的 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286140/

相关文章:

c++ - 在流中的下一行之后定位迭代器的最简单方法?

c++ - std::pmr::polymorphic_allocator 的模板参数有什么用途?

c++ - CPP 中没有构造函数错误的实例

c++ - 在没有 GDB 的情况下使用 VS Code 调试 GNU

c++ - Qt 不会使用 exiv2.dll 编译项目

c# - .NET 重构,DRY。双重继承、数据访问和关注点分离

java - JAXB 生成 nillable=true

c++ - 如何在 C++ 中使用 STL 将带空格的字符串连接成一个字符串

java - 编译错误: constructor A in class A cannot be applied to given types

c++ - 跨 VS 项目的 STL vector 损坏