C++ day19 使用类(三)示例 矢量类

写一个矢量类,巩固类设计,重载运算符和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 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值