编译错误:将抽象类作为参数传递给类构造函数
#include <iostream>
using namespace std;
class Shape
{
public:
virtual void draw()=0;
};
class Circle:public Shape
{
public:
void draw(){cout<<"circle "<<endl;}
};
class Rectangle:public Shape
{
public:
void draw(){cout<<"Rectangle "<<endl;}
};
我想创建一个图片类,我可以绘制不同的形状。我传递Shape类指针(摘要)中的图片类的构造函数那样:编译错误:将抽象类作为参数传递给类构造函数
class Picture
{
public:
Shape* s1;
Picture(Shape *fp): s1(new Shape){}
void PictureDrawn()
{
s1->draw();
}
};
int main()
{
Circle cir;
Picture pic(cir);
pic.PictureDrawn();
}
我收到编译错误。请任何人解释如何正确地写图片类的构造函数,以便我可以做出不同的形状?由于
你不能做
这是一个尝试实例化抽象类。我认为你想要做的是:
Picture(Shape *fp): s1(fp){}
这将指派参数为s1变量,这是我认为你的意图。
另请注意,您底部的代码也不正确。你已经将图片构造函数声明为一个指向Shape的指针,但是你将传入Circle的值。你想要的是。
Circle cir;
Picture pic(&cir);
或者,更改Picture类,以便它使用引用而不是指针。
如果您想复制动态分配的形状,使其可复制(→ FAQ link)。
表示添加方法virtual Shape* clone() const = 0
。
在从Shape
派生的每个具体类中实现它。
自动执行clone
最实用的方法,是恕我直言定义一个宏。
但是由于年轻的SO读者对任何定义宏的建议都有激烈的反应历史,让我补充一点,在C++ 11中,替代方案是使用奇怪的循环模板模式来实现clone
实现(因为C++ 11支持参数转发),并且在C++ 98中,还有另一种,但是相当复杂!,另一种方法是基于继承层次结构中的优势。然而,说了这么多,让我再次提出这个宏,或者简单地在每个类中写入相同的实现(无名变体)。
欢呼&心连心,
不,我认为他只是有一个错字 - 查看Picture类的构造函数。 – Nerdtron
@anonymous downvoter:downvoting没有任何解释的旧答案对任何人都没有帮助。正如我所看到的,答案非常好。当你拒绝透露时,我或其他人怎么能了解你的相反见解? –
如果我理解正确的话,你的抽象类形状的接口,因为它所有的方法都是纯虚。话虽如此,你不能实例化一个接口。您必须“声明”非虚拟纯方法或传入指向您的类的指针。
class Picture
{
public:
Shape* s1;
Picture(Shape *fp): s1(fp){}
void PictureDrawn()
{
if(s1 != NULL)
s1->draw();
}
};
int main()
{
Circle cir;
Picture pic(&cir);
pic.PictureDrawn();
}
谢谢@Nrdtron。有用!! – Alok
接受他的答案然后:) –
@Alok是的,如果答案是正确的,你应该接受它 - 点击复选标记。然后有人问到后来可以立即看到有一个可以接受的答案,这也可以帮助他们。 – Nerdtron