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

Alo*_*lok 0 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;}
};
Run Code Online (Sandbox Code Playgroud)

我想创建一个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();
Run Code Online (Sandbox Code Playgroud)

}

我收到编译错误.请任何人都可以解释如何正确编写Picture类构造函数,以便我可以制作不同的形状?谢谢

Ner*_*ron 8

你不能这样做

new Shape
Run Code Online (Sandbox Code Playgroud)

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

Picture(Shape *fp): s1(fp){}
Run Code Online (Sandbox Code Playgroud)

这会将参数赋值给s1变量,我认为这是你想要的.

另请注意,底部的代码也不正确.您已将Picture构造函数声明为获取指向Shape的指针,但随后您将传递Circle by值.你想要的是什么.

Circle cir;
Picture pic(&cir);
Run Code Online (Sandbox Code Playgroud)

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