如何具有抽象数据类型的参数
How to have a parameter of an abstract data type?
我有一个名为shape的抽象类。
class Shape{
public:
virtual const ColorRGB getColor() const;
virtual double rayIntersectionDistance(Ray r) = 0;
};
现在,我从 Shape 派生了以下类。
-
class Sphere: public Shape { //implementation goes here }
-
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
引用的类型都可以传递 - 假设其构造函数(特别是复制构造函数)实现了适当的行为。
相关文章:
- 如何使用宏根据参数定义不同的数据类型?
- 参数数据类型未知的可变参数函数
- 这种抽象模板矩阵类数据类型的方式好吗?
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 派生数据类型与抽象数据类型
- 具有数据类型的C 抽象基础将在派生类中定义
- 为什么指定数据类型而不是构造功能参数?C
- 如何创建抽象数据类型的模板类?
- 使用纯抽象数据类型作为返回
- 抽象数据类型(ADT)和数据结构之间有什么区别
- 抽象数据类型命名约定:(动态)数组,向量,序列,列表,容器,缓冲区
- 函数有没有办法自动检测其参数的数据类型?(请不要建议函数重载)
- 内置于c++/python/java中的抽象数据类型
- 如何具有抽象数据类型的参数
- 简单抽象数据类型链表
- 对抽象数据类型的stl::列表排序
- 我不能在我的抽象数据类型中使用队列
- 如果传递给函数的参数的数据类型是字符串类型,则抛出异常
- 传递参数时数据类型不匹配
- 是int, char也是抽象数据类型