如何具有抽象数据类型的参数

How to have a parameter of an abstract data type?

本文关键字:参数 抽象数据类型 何具      更新时间:2023-10-16

我有一个名为shape的抽象类。

class Shape{
public:
    virtual const ColorRGB getColor() const;
    virtual double rayIntersectionDistance(Ray r) = 0;
};

现在,我从 Shape 派生了以下类。

  1. class Sphere: public Shape { //implementation goes here }
  2. class Plane: public Shape { //implementation goes here }

我已经在这两个类中实现了getColor()和rayIntersectionDistance(Ray r)方法,以及特定于这些类的其他方法。

所以现在,在另一个名为 Scene 的类中,我有一个 render() 方法,它的原型是:

void render(int width, int height, Shape s);

这似乎不起作用,编译器抱怨我说:

错误:无法将参数"s"声明为抽象类型"形状"

我怎样才能做到这一点?实现这一目标的更好方法是什么?

按值传递Shape意味着传递Shape的实例。 但Shape是抽象的,因此无法创建实例。

改为传递指针或引用。 如果您不打算修改传递的对象,则const符合条件的对象(这也将阻止传递声明为 const 的对象,因为它们不应更改)。

 void func(Shape &s);    // define these functions as required
 void func2(Shape *s);
 void func3(const Shape &s);
 int main()
 {
        Sphere s;   // assumed non-abstract
        const Sphere s2;
        func(s);     // will work
        func2(&s);    // ditto
        func3(s);   // okay
        func3(s2);  // okay
        func(s);   // rejected, as s2 is const
 }

编辑:

正如 Barry 在评论中提到的,也可以传递智能指针,例如 std::unique_pointer<Shape>std::shared_pointer<Shape> - 这些指针可以按值传递。 正如理查德·霍奇斯(Richard Hodges)所提到的,这在实践中是不寻常的,尽管这是可能的。 事实上,任何管理指针或对Shape引用的类型都可以传递 - 假设其构造函数(特别是复制构造函数)实现了适当的行为。