【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)

目录

1、明确要实现的类的方法以及成员函数

【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)

2、假设已经编写Vec2D,根据要求,写出测试代码

遵循TDD的原则:

本部分要展示的内容如下:
假定平面向量类Vec2D已经编写完
在main函数中测试Vec2D中的各种函数.

在源文件中写入测试代码:

clude <iostream>

using std::cout;
using std::endl;

int main()
{
	//创建向量对象
	Vec2D v1{ 3,5 }, v2{ 4,6 };

	//向量转为字符串
	cout << "v1 = " << v1.toString() << endl;
	cout << "v2 = " << v2.toString() << endl;

	//向量加法: 向量 + 向量 ,向量 + 数
	Vec2D v3 = v1.add(v2);
	Vec2D v4 = v3.add(10.0);

	cout << "v2 = " << v3.toString() << endl;
	cout << "v3 = " << v4.toString() << endl;

	//向量减法,向量点积,向量数乘
	Vec2D v5 = v2.subtract(v1);
	double v6 = v2.dot(v1);					//两个向量的点积是一个数
	Vec2D v7 = v3.multiply(2.1);

	cout << "v2 - v1 = " << v5.toString() << endl;
	cout << "v2 * v1 = " << v6 << endl;
	cout << "v3 * 2.1 = " << v7.toString() << endl;
	//向量求负值
	Vec2D v8 = v2.negative();
	cout << "-v2 = " << v8.toString() << endl;
	//向量自增/自减
	cout << " ++v8 = " << v8.increase().toString() << endl;
	cout << " --v2 = " << v2.decrease().toString() << endl;
	//读取或者修改向量元素
	cout << "v1.x_ = " << v1.at(0) << endl;
	cout << "v1.y_ = " << v1.at(1) << endl;
	//向量的长度magnitude 和角度direction
	cout << "v1.magnitude = " << v1.magnitude() << endl;
	cout << "v1.direction = " << v1.direction() << endl;
	//比较两个向量
	cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;
	return 0;
}

由于Vec2D类还没有进行编写,这个测试程序显然是无法运行通过的。

3、编写平面向量类Vec2D,并进行测试

1、添加类
这里使用VS2019中的类向导来添加类:视图 -> 类视图 -> 选择项目,右键 -> 类向导 -> 添加类
【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
2、添加类成员变量:
返回类向导 - >成员变量-> 添加自定义
添加x_,y_,类型均未double,均为private.
【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
3、添加方法,注意这里的同名重载函数是不可以添加的,需要后面手动添加
【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
举个例子:
【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)

4、补充需要重载的函数以及遗漏的函数

add这里还有另外一个重载函数,与数值相加,同理subtract也有重载函数。

//cpp
//与数值相加
Vec2D Vec2D::add(double num)
{
	// TODO: 在此处添加实现代码.
	return Vec2D();
}
//h
	//与数值相加
	Vec2D add(double num);

补充遗漏的头文件

#include <iostream>
#include <string>
#include <cmath>
#include <exception>

5、完善每个成员函数的具体内容,并且对格式稍作修改

4、完整代码

Vec2D.h

#pragma once
#include <iostream>
#include <string>
#include <cmath>
#include <exception>
class Vec2D
{
private:
	double x_;
	double y_;
public:
	Vec2D();
	Vec2D(double , double );
	~Vec2D();
	// 将向量转换为字符串表达形式
	std::string toString();
	// 向量加法
	Vec2D add(Vec2D secondVec2D);
	//与数值相加
	Vec2D add(double num);
	// 读取或修改向量元素
	double& at(const int index);
	// 向量减法
	Vec2D subtract(Vec2D secondVec2D);
	//与数值相减
	Vec2D subtract(double num);
	// 向量点积
	double dot(Vec2D secondVec2D);
	// 向量数乘
	Vec2D multiply(double multiplier);
	// 向量求负值
	Vec2D negative();
	// 向量自增1
	Vec2D& increase();
	// 向量自减1
	Vec2D& decrease();
	// 求向量的范数(长度)
	double magnitude();
	// 求Vec2D与x+轴的夹角
	double direction();
	// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0
	int compareTo(Vec2D secondVec2D);
};

Vec2D.cpp

#include "Vec2D.h"
Vec2D::Vec2D() {
	x_ = 0.0;
	y_ = 0.0;
}

Vec2D::Vec2D(double x, double y) {
	x_ = x;
	y_ = y;
}

Vec2D::~Vec2D() {

}



// 将向量转换为字符串表达形式
std::string Vec2D::toString()
{
	// TODO: 在此处添加实现代码.
	return std::string("(" + std::to_string(x_) + ", "+ std::to_string(y_) + ")");
}


// 向量加法
Vec2D Vec2D::add(Vec2D secondVec2D)
{
	// TODO: 在此处添加实现代码.
	return Vec2D(x_ + secondVec2D.x_ , y_ + secondVec2D.y_);
}
//与数值相加
Vec2D Vec2D::add(double num)
{
	// TODO: 在此处添加实现代码.
	return Vec2D(this->x_ + num , this->y_ + num);
}

// 向量减法
Vec2D Vec2D::subtract(Vec2D secondVec2D)
{
	// TODO: 在此处添加实现代码.
	return Vec2D(x_ - secondVec2D.x_ , y_ - secondVec2D.y_);
}
// 向量减数
Vec2D Vec2D::subtract(double num)
{
	// TODO: 在此处添加实现代码.
	return Vec2D(this->x_ - num , this->y_ - num);
}


// 向量点积
double Vec2D::dot(Vec2D secondVec2D)
{
	// TODO: 在此处添加实现代码.
	return (x_ * secondVec2D.x_ + y_ * secondVec2D.y_);
}


// 向量数乘
Vec2D Vec2D::multiply(double multiplier)
{
	// TODO: 在此处添加实现代码.
	return Vec2D(x_ * multiplier ,y_ * multiplier);
}


// 向量求负值
Vec2D Vec2D::negative()
{
	// TODO: 在此处添加实现代码.
	return Vec2D( -x_ , -y_);
}


// 向量自增1
Vec2D& Vec2D::increase()
{
	x_++;
	y_++;
	// TODO: 在此处添加实现代码.
	return (*this);
}


// 向量自减1
Vec2D& Vec2D::decrease()
{
	x_--;
	y_--;
	// TODO: 在此处添加实现代码.
	return (*this);
}


// 求向量的范数(长度)
double Vec2D::magnitude()
{
	// TODO: 在此处添加实现代码.
	return sqrt(x_ * x_ + y_ * y_);
}


// 求Vec2D与x+轴的夹角
double Vec2D::direction()
{
	// TODO: 在此处添加实现代码.
	return atan(y_ / x_);
}


// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0
int Vec2D::compareTo(Vec2D secondVec2D)
{
	// TODO: 在此处添加实现代码.
	double m1 = this->magnitude();
	double m2 = secondVec2D.magnitude();
	if(abs(m1 - m2) < 1e-10)
		return 0;
	else
		return (m1 > m2 ? 1 : -1);
}


// 读取或修改向量元素
double& Vec2D::at(const int index)
{
	if( 0 == index)
		return x_;
	else if(1 == index)
		return y_;
	//使用异常处理的方式,抛出异常,并且打印携带信息
	else
		throw std::out_of_range("at() only accept 1 or 2 as parameter");
	// TODO: 在此处添加实现代码.
	// TODO: 在此处插入 return 语句
}

main.cpp

#include <iostream>
#include "Vec2D.h"
using std::cout;
using std::endl;

int main()
{
	//创建向量对象
	Vec2D v1{ 3,5 }, v2{ 4,6 };

	//向量转为字符串
	cout << "v1 = " << v1.toString() << endl;
	cout << "v2 = " << v2.toString() << endl;

	//向量加法: 向量 + 向量 ,向量 + 数
	Vec2D v3 = v1.add(v2);
	Vec2D v4 = v3.add(10.0);

	cout << "v2 = " << v3.toString() << endl;
	cout << "v3 = " << v4.toString() << endl;

	//向量减法,向量点积,向量数乘
	Vec2D v5 = v2.subtract(v1);
	double v6 = v2.dot(v1);					//两个向量的点积是一个数
	Vec2D v7 = v3.multiply(2.1);

	cout << "v2 - v1 = " << v5.toString() << endl;
	cout << "v2 * v1 = " << v6 << endl;
	cout << "v3 * 2.1 = " << v7.toString() << endl;
	//向量求负值
	Vec2D v8 = v2.negative();
	cout << "-v2 = " << v8.toString() << endl;
	//向量自增/自减
	cout << " ++v8 = " << v8.increase().toString() << endl;
	cout << " --v2 = " << v2.decrease().toString() << endl;
	//读取或者修改向量元素
	cout << "v1.x_ = " << v1.at(0) << endl;
	cout << "v1.y_ = " << v1.at(1) << endl;
	//向量的长度magnitude 和角度direction
	cout << "v1.magnitude = " << v1.magnitude() << endl;
	cout << "v1.direction = " << v1.direction() << endl;
	//比较两个向量
	cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;
	return 0;
}

5、最终结果

v1 = (3.000000, 5.000000)
v2 = (4.000000, 6.000000)
v2 = (7.000000, 11.000000)
v3 = (17.000000, 21.000000)
v2 - v1 = (1.000000, 1.000000)
v2 * v1 = 42
v3 * 2.1 = (14.700000, 23.100000)
-v2 = (-4.000000, -6.000000)
++v8 = (-3.000000, -5.000000)
–v2 = (3.000000, 5.000000)
v1.x_ = 3
v1.y_ = 5
v1.magnitude = 5.83095
v1.direction = 1.03038
v1 compare v2 :0

上一篇:TDD 测试驱动开发 可行吗?


下一篇:JMock+Junit4结合完成TDD实例