分配抽象 class 类型 'Shape' 的对象?
Allocating an object of abstract class type 'Shape'?
我收到一条错误消息 "Allocating an object of abstract class type 'Shape'"。圆(双r):形状("Circle").
#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(){
}
这是ClassCircle/Square中构造函数的问题吗?我不确定,有点迷茫。在这一点上,任何关于我应该研究什么来找到答案的提示都会很棒。
谢谢!
getArea
和 getPerimeter
的签名与基 class 的签名不同。使用相同的签名,否则你只是隐藏了基本方法,而不是覆盖它们。
您不需要传入维度,您已经将它们作为成员。
回答你的问题:
您的构造函数 Shape(char *){};
是私有的。您不能在派生 class 中重复使用它。
但是您的代码中存在一些问题,这里有一些提示:
使用 member initialization list,使用 std::string
(不是 char*),使用 const 正确性,不要重新发明轮子 使用 M_PI
from <cmath>
一个有效且更好的代码:
#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
我收到一条错误消息 "Allocating an object of abstract class type 'Shape'"。圆(双r):形状("Circle").
#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(){
}
这是ClassCircle/Square中构造函数的问题吗?我不确定,有点迷茫。在这一点上,任何关于我应该研究什么来找到答案的提示都会很棒。
谢谢!
getArea
和 getPerimeter
的签名与基 class 的签名不同。使用相同的签名,否则你只是隐藏了基本方法,而不是覆盖它们。
您不需要传入维度,您已经将它们作为成员。
回答你的问题:
您的构造函数 Shape(char *){};
是私有的。您不能在派生 class 中重复使用它。
但是您的代码中存在一些问题,这里有一些提示:
使用 member initialization list,使用 std::string
(不是 char*),使用 const 正确性,不要重新发明轮子 使用 M_PI
from <cmath>
一个有效且更好的代码:
#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