一个关于取什么为对象的问题,希望高手来解。
问题描述:
一个半径为R的游泳池。
游泳池边一个环形跑道。宽度为3
跑到边上一个半径为R+3的栅栏。
修建跑道每平米花费5。栅栏每米花费为4。
输入R求总费用。要求使用面向面向过程和面向对象两种方法。
面向过程的我已经解出来了。(很简单,这个题目不是考算法的)
面向对象我建立的是 游泳池(pool) 有一个半径R的属性。一个计算费用的方法(HowMuch),一个显示费用的方法(Show)。
但是老师说我的是错的 。 并给了提示 说 建立类 要能抽象出多个对象的共同特点。如果一个类只生成一个对象,那还不如用面向过程的 方法来实现。
希望高手来指点一下到底应该如何建立这个类。
[解决办法]
可能是你类的实现有具体,没有考虑别的情况吧,例如再加一圈草坪,要么就是改方形的游泳池,反正得可扩充。
[解决办法]
估计继承,多态什么的。
[解决办法]
封装、继承和多态是面向对象的根本哈。
[解决办法]
#include <iostream>
const double PI = 3.1415927;
class Arch
{
public:
virtual double CalcExpense(void) = 0;
protected:
static inline double sqr(double x) { return x * x; }
};
class Runway : public Arch
{
public:
explicit Runway(double r) : r_(r) {}
virtual double CalcExpense(void) { return (sqr(r_ + 3.0) - sqr(r_)) * PI * 5.0; }
private:
double r_;
};
class Guardrail : public Arch
{
public:
explicit Guardrail(double r) : r_(r) {}
virtual double CalcExpense(void) { return 2.0 * PI * 4.0 * r_; }
private:
double r_;
};
int main(void)
{
Arch *ArchArr[2];
const size_t ARCHARRSIZE = sizeof ArchArr / sizeof ArchArr[0];
std::cout < < "Input a number: ";
double r;
std::cin > > r;
Runway runway(r);
Guardrail guardrail(r + 3.0);
ArchArr[0] = &runway;
ArchArr[1] = &guardrail;
double sum = 0.0;
for (size_t i = 0; i < ARCHARRSIZE; ++i)
{
sum += ArchArr[i]-> CalcExpense();
}
std::cout < < "Total Expense: " < < sum < < std::endl;
return 0;
}
[解决办法]
设计一个类Circle,描述一个圆,看上去像这样
class Circle
{
public:
Circle (int R);
double Perimeter () const;
double Area () const;
};
很显然,可以用Circle来描述所有的东西
Circle pool(R);
Circle course(R+3);
Circle barrier(R+3);
总的费用为5 * (course.Area() - pool.Area()) + 4 * barrier.Perimeter()