2011-11-28 99 views
0
#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(); 

}

我收到编译错误。请任何人解释如何正确地写图片类的构造函数,以便我可以做出不同的形状?由于

回答

8

你不能做

​​

这是一个尝试实例化抽象类。我认为你想要做的是:

Picture(Shape *fp): s1(fp){} 

这将指派参数为s1变量,这是我认为你的意图。

另请注意,您底部的代码也不正确。你已经将图片构造函数声明为一个指向Shape的指针,但是你将传入Circle的值。你想要的是。

Circle cir; 
Picture pic(&cir); 

或者,更改Picture类,以便它使用引用而不是指针。

+0

谢谢@Nrdtron。有用!! – Alok

+1

接受他的答案然后:) –

+1

@Alok是的,如果答案是正确的,你应该接受它 - 点击复选标记。然后有人问到后来可以立即看到有一个可以接受的答案,这也可以帮助他们。 – Nerdtron

0

如果您想复制动态分配的形状,使其可复制(→ FAQ link)。

表示添加方法virtual Shape* clone() const = 0

在从Shape派生的每个具体类中实现它。

自动执行clone最实用的方法,是恕我直言定义一个宏。

但是由于年轻的SO读者对任何定义宏的建议都有激烈的反应历史,让我补充一点,在C++ 11中,替代方案是使用奇怪的循环模板模式来实现clone实现(因为C++ 11支持参数转发),并且在C++ 98中,还有另一种,但是相当复杂!,另一种方法是基于继承层次结构中的优势。然而,说了这么多,让我再次提出这个宏,或者简单地在每个类中写入相同的实现(无名变体)。

欢呼&心连心,

+1

不,我认为他只是有一个错字 - 查看Picture类的构造函数。 – Nerdtron

+2

@anonymous downvoter:downvoting没有任何解释的旧答案对任何人都没有帮助。正如我所看到的,答案非常好。当你拒绝透露时,我或其他人怎么能了解你的相反见解? –

0

如果我理解正确的话,你的抽象类形状的接口,因为它所有的方法都是纯虚。话虽如此,你不能实例化一个接口。您必须“声明”非虚拟纯方法或传入指向您的类的指针。

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(); 

} 
相关问题