【问题标题】:Allocating an object of abstract class type 'Shape'?分配抽象类类型“形状”的对象?
【发布时间】:2015-11-21 01:59:00
【问题描述】:

我收到一条错误消息“分配抽象类类型‘形状’的对象”。圆(双 r):形状(“圆”)。

#include <iostream>
using namespace std;

class Shape{
    char name[20];
    Shape(char *){};
    virtual double getPerimeter()=0;
    virtual double getArea()=0;
};

class Circle : public Shape{
    double rad;
    static const double PI;
public:
    Circle(double r):Shape("Circle"){
        rad = r;
    }
    double getRadius(){
        return rad;
    }
    double getPerimeter(double rad){
        return 2 * PI * rad;
    }
    double getArea(double rad){
        return PI * (rad * rad);
    }
};

class Square : public Shape{
    double side;
public:
    Square(double s):Shape("Square"){
        side = s;
    }
    double getPerimeter(double side){
        return side * 4;
    }
    double getArea(double side){
        return side * side;
    }

};

const double Circle::PI = 3.1415;

int main(){

}

这是类 Circle/Square 中的构造函数的问题吗?我不确定,有点失落。在这一点上,我应该研究什么以找到答案的任何提示都会很棒。

谢谢!

【问题讨论】:

    标签: c++ class abstract pure-virtual


    【解决方案1】:

    回答你的问题:

    您的构造函数Shape(char *){}; 是私有的。您不能在派生类中重用它。

    但是您的代码中有几个问题,这里有一些提示: 使用member initialization list,使用std::string(不是char*),使用const 正确性,不要重新发明轮子使用M_PI from &lt;cmath&gt;

    有效且更好的代码:

    #include <iostream>
    #include <string>
    #include <cmath>
    
    class Shape {
    public:
      Shape(std::string n) : name(n) {}
      // virtual double getPerimeter() const = 0;
      virtual double getArea() const = 0;
    protected:
      std::string name;
    };
    
    class Circle : public Shape {
    public:
      Circle(double r) : Shape("Circle"), rad(r) {}
      double getPerimeter() const { return  2 * M_PI * rad; }
      double getArea() const { return M_PI * rad * rad; } ;
    private:
      double rad;
    };
    
    class Square : public Shape {
    public:
      Square(double s) : Shape("Square"), side(s) {}
      double getPerimeter() const { return  4 * side; }
      double getArea() const { return side * side; } ;
    private:
      double side;
    };
    
    int main() {
        Square square(4.0);
        std::cout << square.getPerimeter() << " " << square.getArea() << '\n';
        Circle circle(1.0);
         std::cout << circle.getPerimeter() << " " << circle.getArea() << '\n';
    }
    

    输出:

    16 16
    6.28319 3.14159

    【讨论】:

      【解决方案2】:

      getAreagetPerimeter 的签名与基类的签名不同。使用相同的签名,否则您只是隐藏基本方法,而不是覆盖它们。

      您不需要传入维度,您已经将它们作为成员。

      【讨论】:

      • 好点,但实际上这不是导致此错误的原因。
      • @coincoin 对于那个错误,是的。该类是抽象的,因为在派生类中没有实现纯虚方法。如果不是这个,是什么原因?我阅读了您的答案,并且您还提供了此解决方案,以及其他不会导致此错误的解决方案(私有构造函数会导致编译器错误,因此我怀疑这是他的实际代码),或者根本不会导致错误(您的其他提示)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多