写一个矢量类,巩固类设计,重载运算符和namespace
矢量,就是物理上那个术语,有大小有方向,可以用水平分量和垂直分量表示,也可以用模长和角度表示,矢量有效的操作有:加减法以及数乘。所以,很明显,矢量不可能用一个量表示,而是需要用一个类来表示,下面我们尝试设计这个类,并借此巩固名称空间,友元函数,内联函数,访问权限,构造函数,函数重载,运算符重载等知识,还能涉及到一些代码重用的知识。
示例1 基本功能 编译器决不能接收任何形式的二义性
//vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
namespace VECTOR
{
class Vector
{
public:
enum Mode {
RECT, POL};
private:
double x;
double y;
double mag;
double ang;
Mode mode;//rect or polar,所以Mode枚举量要定义在前面
void set_x();
void set_y();
void set_mag();
void set_ang();
public:
Vector();
Vector(double n1, double n2, Mode form = RECT);
~Vector();
void reset(double n1, double n2, Mode form = RECT);//用于给一个Vector对象重新设置值,很好的必需的方法
//内联函数
double xval() const {
return x;}
double yval() const {
return y;}
double magval() const {
return mag;}
double angval() const {
return ang;}
void polar_mode();//设置为polar模式
void rect_mode();
//operator overloading
Vector operator+(const Vector & v) const;
Vector operator-(const Vector & v) const;
Vector operator-() const;//方向取反
Vector operator*(double n) const;
//friends
friend Vector operator*(double n, const Vector & v){
return v * n;}//利用成员运算符函数进行代码重用,设计内联友元函数
friend std::ostream & operator<<(std::ostream & os, const Vector & v);
};
}
#endif
//vector.cpp
#include <iostream>
#include <cmath>
#include "vector.h"
const double RAD_TO_DEG = 180 / 3.141592657;
namespace VECTOR{
Vector::Vector()
{
x = y = mag = ang = 0.0;
mode = RECT;
}
Vector::Vector(double n1, double n2, Mode form)//不要把默认参数写在函数定义中
{
mode = form;
if (mode == RECT)
{
x = n1;
y = n2;
set_mag();//私有函数可以不用对象和成员运算符调用
set_ang();
}
else if(mode == POL)
{
mag = n1;
ang = n2;
set_x();
set_y();
}
else
{
std::cout << "Wrong mode! Incorrect 3rd argument to Vector() -- ";
std::cout << "Vector set to 0.\n";//不能贸然设置为某一个格式,否则输入不匹配
Vector();
}
}
Vector::~Vector()
{
}
void Vector::set_x()
{
if (mode == POL)
x = mag * std::cos(ang);//在polar模式下设置x
}
void Vector::set_y()
{
if (mode == POL)
y = mag * std::sin(ang);//在polar模式下设置y
}
void Vector::set_mag()
{
if (mode == RECT)
mag = std::sqrt(x * x + y * y);//在rect模式下设置mag
}
void Vector::set_ang()
{
if (mode == RECT)
{
if