用c++定义 GetPerim()函数计算对象的周长,通过重载来求矩形 Rectangle 和圆形 Circle的周长,并编写测试main()函数。.
时间: 2024-11-06 12:22:11 浏览: 10
在 C++ 中,你可以定义一个通用的 `GetPerim()` 函数,然后通过模板和重载来适应不同的形状,比如矩形(Rectangle)和圆形(Circle)。首先,我们需要为每个形状定义一个基础结构体,包含它们各自的属性。假设我们已经有了 `Shape` 的基类和两个派生类 `Rectangle` 和 `Circle`。
```cpp
#include <iostream>
// 基础 Shape 类
class Shape {
protected:
double perimeter;
public:
virtual void setPerimeter(double p) { perimeter = p; }
double getPerimeter() const { return perimeter; }
};
// 矩形类
class Rectangle : public Shape {
private:
double length, width;
public:
Rectangle(double l, double w) : length(l), width(w) { setPerimeter(2 * (length + width)); }
void setLengthWidth(double l, double w) { length = l; width = w; }
// 定义矩形的周长计算方法
double getPerimeter() override { return 2 * (length + width); }
};
// 圆形类
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { setPerimeter(2 * M_PI * radius); }
void setRadius(double r) { radius = r; }
// 定义圆形的周长计算方法
double getPerimeter() override { return 2 * M_PI * radius; }
};
// 定义通用 GetPerim 函数,通过类型推导进行重载
template<typename T>
double calculatePerimeter(T& shape) {
if constexpr (std::is_base_of_v<Shape, std::remove_pointer_t<decltype(shape)>>)
return shape.getPerimeter();
else
throw std::invalid_argument("Invalid shape type for GetPerim().");
}
int main() {
Rectangle rect(5, 7);
Circle circle(3);
std::cout << "Rectangle perimeter: " << calculatePerimeter(rect) << std::endl;
std::cout << "Circle perimeter: " << calculatePerimeter(circle) << std::endl;
// 测试其他无效形状
try {
Rectangle invalidRect; // 错误地直接传递非对象
calculatePerimeter(invalidRect);
} catch (const std::invalid_argument& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
在这个例子中,`CalculatePerimeter()` 函数接受一个引用类型的 Shape 派生类实例,并通过 C++11 的模板和 SFINAE(Substitution Failure Is Not An Error)技术来判断传入的是哪种形状,进而调用相应的 `getPerimeter()` 方法。
阅读全文