编译错误:将抽象类作为参数传递给类构造函数

时间:2011-11-28 18:17:46

标签: c++

   #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类构造函数,以便我可以制作不同的形状?感谢

4 个答案:

答案 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中,还有另一种,但相当复杂的替代方案,基于继承层次结构中的支配。

然而,说了这么多,让我再次建议宏,或者只是在每个类中编写相同的实现(没有名称变体)。

欢呼&amp;第h。,

答案 3 :(得分:0)

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