1.定义 GetPerim()函数计算对象的周长,通过重载来求矩形 Rectangle 和圆形 Circle的周长,并编写测试main()函数。
时间: 2024-11-06 07:35:37 浏览: 27
在C++中,为了计算不同形状的周长,如矩形和圆形,你可以定义一个名为`GetPerim()`的通用函数,利用C++的模板和运算符重载特性。这个函数接受一个类型参数,可以根据传入的对象类型动态确定相应的计算方式。以下是示例代码:
```cpp
#include <iostream>
// 模板定义,用于计算不同形状的周长
template <typename T>
double GetPerim(T obj) {
static_assert(std::is_base_of_v<std::enable_if_t<std::is_convertible_v<T, typename std::remove_cv<T>::type*>>, Shape>, "Shape type not supported");
// 矩形的周长计算
if constexpr (std::is_same_v<T, Rectangle>) {
Rectangle* rect = dynamic_cast(Rectangle*>(&obj);
return 2 * (rect->getWidth() + rect->getLength());
}
// 圆形的周长计算
else if constexpr (std::is_same_v<T, Circle>) {
Circle* cir = dynamic_cast(Circle*>(&obj);
return 2 * M_PI * cir->getRadius();
}
// 默认情况(未匹配到特定形状)
default:
throw std::runtime_error("Invalid shape for GetPerim()");
}
// 定义Rectangle和Circle类
class Rectangle {
private:
double length;
double width;
public:
Rectangle(double length, double width): length(length), width(width) {}
double getWidth() const { return width; }
double getLength() const { return length; }
double GetPerim() { return GetPerim<Rectangle>(*this); }
};
class Circle {
private:
double radius;
public:
Circle(double radius): radius(radius) {}
double getRadius() const { return radius; }
double GetPerim() { return GetPerim<Circle>(*this); }
};
// 测试main()函数
int main() {
try {
Rectangle rect(5, 7);
Circle circle(3.5);
std::cout << "Rectangle perimeter: " << rect.GetPerim() << std::endl;
std::cout << "Circle perimeter: " << circle.GetPerim() << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
在`main()`函数中,我们实例化了Rectangle和Circle对象,并调用它们的`GetPerim()`方法来获取周长。如果传入的不是一个支持的形状类型,会抛出运行时错误。
阅读全文