C++ 如何拥有抽象数据类型的参数?
我有一个名为shape的抽象类C++ 如何拥有抽象数据类型的参数?,c++,class,oop,abstract,C++,Class,Oop,Abstract,我有一个名为shape的抽象类 class Shape{ public: virtual const ColorRGB getColor() const; virtual double rayIntersectionDistance(Ray r) = 0; }; 现在,我从Shape派生了以下类 class-Sphere:public-Shape{//implementation-goes-here} 类平面:公共形状{//实现在这里} 我在这两个类中都实现了getColor(
class Shape{
public:
virtual const ColorRGB getColor() const;
virtual double rayIntersectionDistance(Ray r) = 0;
};
现在,我从Shape派生了以下类
class-Sphere:public-Shape{//implementation-goes-here}
类平面:公共形状{//实现在这里}
void render(int width, int height, Shape s);
这似乎不起作用,编译器抱怨我说:
错误:无法将参数“s”声明为抽象类型“Shape”
我怎样才能做到这一点?实现这一点的更好方法是什么?通过值传递
形状
意味着传递形状
的实例。但是Shape
是抽象的,因此无法创建实例
而是传递指针或引用<如果不希望修改传递的对象,则代码>常量符合条件(这也将阻止传递声明为常量
的对象,因为它们不应更改)
编辑:
正如Barry在评论中提到的,还可以传递智能指针,例如
std::unique_pointer
或std::shared_pointer
——这些指针可以通过值传递。正如理查德·霍奇斯(Richard Hodges)提到的那样,这在实践中是不寻常的,尽管这是可能的。事实上,任何管理Shape
指针或引用的类型都可以传递,前提是其构造函数(特别是复制构造函数)实现了适当的行为。func4(unique_ptr)
,func5(shared_ptr)
,…;-)@巴里公平地说,将移动的唯一ptr传递给抽签功能是不寻常的@彼得我可能不会鼓励func()
或func2()
。太可恶了func3()
就是那个。@Barry-是的。也可以传递任何包含指针或对形状
的引用的类型,包括您提到的智能指针类型,只要该类型适当地管理其状态。@Richard-如果函数需要更改形状
的状态,常量
是不合适的。考虑一个<代码> RooTestObjt(Stand &),它更新形状的定义点(顶点、中心等)的坐标,即使这是通过调用< <代码> const 成员函数>代码>形状<代码>来完成的。这不能接受一个常量
@Peter在一般情况下你当然是对的。我想我在评论的时候仍然考虑到老年退休金计划的问题。他给出的例子是非变异函数。
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
}