#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;}
};
我想创建一个Picture类,我可以在其中绘制不同的形状。我在Picture类构造函数中传递Shape类指针(Abstract),如:
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类构造函数,以便我可以制作不同的形状?感谢
答案 0 :(得分:8)
你做不到
new Shape
这是尝试实例化抽象类。我想你想做的是:
Picture(Shape *fp): s1(fp){}
这会将参数分配给s1变量,我想你的意思。
另请注意,底部的代码也不正确。您已将Picture构造函数声明为获取指向Shape的指针,但随后您将传递Circle by值。你想要的是什么。
Circle cir;
Picture pic(&cir);
或者,更改Picture类,使其使用引用而不是指针。
答案 1 :(得分:1)
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();
}
答案 2 :(得分:0)
如果要复制动态分配的形状,请将其设为可克隆(→FAQ link)。
这意味着,添加方法virtual Shape* clone() const = 0
。
在从Shape
派生的每个具体类中实现它。
自动执行clone
的最实用方法是恕我直言,以定义一个宏。
但是,由于年轻的SO读者有过对任何定义宏的建议的暴力反应的历史,让我补充一点,在C ++ 11中,另一种方法是使用奇怪的重复模板模式来实现clone
(因为C ++ 11支持参数转发),而在C ++ 98中,还有另一种,但相当复杂的替代方案,基于继承层次结构中的支配。
答案 3 :(得分:0)
如果我理解正确,你的抽象类形状就是一个接口,因为它的所有方法都是纯虚拟的。话虽如此,你无法实例化一个接口。您必须“声明”非虚拟纯方法或传入指向您的类的指针。