修改Example13,Example14中的类定义和成员函数定义。使在公有借口不变的情况下,不再存储极坐标下的坐标值。
在Example13,Example14,Example15的基础上修改。因公有借口不变,所以randwalk.cpp不用做任何修改。
vector.h,vector.cpp修改后的程序清单如下:
// vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cmath>
namespace VECTOR
{
class Vector
{
public:
enum Mode {RECT, POL};
private:
double x;
double y;
Mode mode;
public:
Vector();
Vector(double n1, double n2, Mode = RECT);
void reset(double n1, double n2, Mode = RECT);
~Vector();
double xval() const {return x;}
double yval() const {return y;}
double magval() const {return sqrt(x * x + y * y);}
double angval() const {return atan2(y, x);}
void polar_mode();
void rect_mode();
Vector operator+(const Vector& b) const;
Vector operator-(const Vector& b) const;
Vector operator-() const;
Vector operator*(double n) const;
friend Vector operator*(double n, const Vector& a);
friend std::ostream& operator<<(std::ostream& os, const Vector& v);
};
}
#endif
// vector.cpp
#include <iostream>
#include "vector.h"
using std::sqrt;
using std::sin;
using std::cos;
using std::atan;
using std::atan2;
using std::cout;
namespace VECTOR
{
const double Rad_to_deg = 45.0 / atan(1.0);
Vector::Vector()
{
x = y = 0.0;
}
Vector::Vector(double n1, double n2, Mode form)
{
mode = form;
if (form == RECT)
{
x = n1;
y = n2;
}
else if (form == POL)
{
x = n1 * cos(n2);
y = n1 * sin(n2);
}
}
void Vector::reset(double n1, double n2, Mode form)
{
mode = form;
if (form == RECT)
{
x = n1;
y = n2;
}
else if (form == POL)
{
x = n1 * cos(n2);
y = n1 * sin(n2);
}
}
Vector::~Vector()
{
}
void Vector::polar_mode()
{
mode = POL;
}
void Vector::rect_mode()
{
mode = RECT;
}
Vector Vector::operator+(const Vector& b) const
{
return Vector(x + b.x, y + b.y);
}
Vector Vector::operator-(const Vector& b) const
{
return Vector(x - b.x, y - b.y);
}
Vector Vector::operator-() const
{
return Vector(-x, -y);
}
Vector Vector::operator*(double n) const
{
return Vector(n * x, n * y);
}
Vector operator*(double n, const Vector& a)
{
return a * n;
}
std::ostream& operator<<(std::ostream& os, const Vector& v)
{
if (v.mode == Vector::RECT)
os << "(x,y) = (" << v.x << ", " << v.y << ")";
else if (v.mode == Vector::POL)
os << "(m,a) = (" << sqrt(v.x * v.x + v.y * v.y)
<< ", " << atan2(v.y, v.x) * Rad_to_deg << ")";
return os;
}
}
randwork.cpp不变,结束。