使用 class 圆计算 class 圆柱

Calculate class Cylinder using class Circle

class“圆”的构造函数允许通过参数指定半径,而如果不指定参数则无法创建Circle类型的对象。此外,不得将实数自动转换为 Circle 对象。 Set 方法与构造函数的作用相同,也应该得到支持,除了它允许稍后更改已创建对象的半径。

Cylinderclass构造函数需要两个参数,分别代表滚子的底面半径和高度。如果不指定上述信息,也无法创建此 class 的实例。它还应该支持“Set”功能,它与构造函数的作用相同,只是它允许您修改已创建的对象。

两个classes必须有其他方法(在代码中列出)。

我需要在classCylinder里面使用classCircle来实现计算体积、面积等功能。

#include <cmath>
#include <iostream>

class Circle {
  double radius;

  public:
  Circle(double r);
  void Set(double r);
  double GetRadius() const;
  double GetPerimeter() const;
  double GetArea() const;
  void Scale(double s);
  void Print() const;
};

class Cylinder {
  Circle baze;
  double height;

  public:
  Cylinder(double r_baze, double h);
  void Set(double r_baze, double h);
  Circle GetBaze() const;
  double GetRadiusOfBaze() const;
  double GetHeight() const;
  double GetArea() const;
  double GetVolume() const;
  void Scale(double s);
  void Print() const;
};

int main() { 
  return 0; 
}

Circle::Circle(double r) {
  radius = r;
}

void Circle::Set(double r) {
  radius = r;
}

double Circle::GetRadius() const { return radius; }

double Circle::GetPerimeter() const { return 2 * 4 * atan(1) * radius; }

double Circle::GetArea() const { return radius * radius * 4 * atan(1); }

void Circle::Scale(double s) {
  radius *= s;
}

void Circle::Print() const {
  std::cout << "R= " << GetRadius() << " O= " << GetPerimeter()
            << " P= " << GetRadius();
}

Cylinder::Cylinder(double r_baze, double h) {
  baze.GetRadius() = r_baze;
  height = h;
}

void Cylinder::Set(double r_baze, double h) {
  baze.GetRadius() = r_baze;
  height = h;
}

Circle Cylinder::GetBaze() const { return baze; }

double Cylinder::GetRadiusOfBaze() const { return baze.GetRadius(); }

double Cylinder::GetHeight() const { return height; }

double Cylinder::GetArea() const {
  return baze.GetArea() * 2 + baze.GetPerimeter() * height;
}

double Cylinder::GetVolume() const { return baze.GetArea() * height; }

void Cylinder::Scale(double s) {
  baze.GetRadius() *= s;
  height *= s;
}

void Cylinder::Print() const {
  std::cout << "R= " << baze.GetRadiusOfBaze() << " H= " << height
            << " P= " << GetArea() << " V= " << GetVolume();
}

我是面向对象编程概念的新手。你能帮我弄清楚我哪里出错了吗?

我无法编译这个,因为我收到错误:

57 : no matching function for call to ‘Circle::Circle()’

14: note: candidate: ‘Circle::Circle(double)’

14: note: candidate expects 1 argument, 0 provided

3: note: candidate: ‘constexpr Circle::Circle(const Circle&)’

3: note: candidate expects 1 argument, 0 provided

62, 70, 91 : lvalue required as left operand of assignment

Cylinder::Cylinder(double r_baze, double h) {
 baze.GetRadius() = r_baze;
 height = h;
}

在您的 Cylinder class 中,当您的构造函数被调用时,baze 被隐式初始化为不存在的默认构造函数。

您想使用 initializer list 来处理该初始化,此时您的 Cylinder 构造函数中的代码变得不必要了。

Cylinder::Cylinder(double r_baze, double h) 
: baze(r_baze), height(h) {
}

或者,您可以在功能上为 Circle class 提供默认构造函数,然后 SetCylinder 的构造函数中提供半径,但这需要更多工作.

Circle::Circle(double r=0.0) {
  radius = r;
}

Cylinder::Cylinder(double r_baze, double h) {
  baze.Set(r_baze);
  height = h;
}

还有...

请注意 GetRadius returns 一个 double 不能赋值给,所以你会在那行代码上得到一个错误。