如何获得抽象数据类型的参数?

时间:2016-03-18 21:25:15

标签: c++ class oop abstract

我有一个名为 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 }
  3. 我在两个类中都实现了 getColor() rayIntersectionDistance(Ray r)方法,并使用了特定于这些类的其他方法。

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

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

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

      

    错误:无法将参数's'声明为抽象类型'Shape'

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

1 个答案:

答案 0 :(得分:3)

按值传递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引用的类型都可以传递 - 假设它的构造函数(特别是复制构造函数)实现了适当的行为。