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

目录

  • 1、明确要实现的类的方法以及成员函数
  • 2、假设已经编写Vec2D,根据要求,写出测试代码
  • 3、编写平面向量类Vec2D,并进行测试
  • 4、完整代码
  • 5、最终结果

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

考虑到效率问题,我们一般将函数的参数设置为引用类型。
函数参数类型设置为引用类型的一个重要目的是避免对象拷贝的开销。

在这里插入图片描述

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

遵循TDD的原则:

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

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

include <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 和角度directioncout << "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中的类向导来添加类:视图 -> 类视图 -> 选择项目,右键 -> 类向导 -> 添加类
在这里插入图片描述
2、添加类成员变量:
返回类向导 - >成员变量-> 添加自定义
添加x_,y_,类型均未double,均为private.
在这里插入图片描述
3、添加方法,注意这里的同名重载函数是不可以添加的,需要后面手动添加
在这里插入图片描述
举个例子:
在这里插入图片描述

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();// 向量自增1Vec2D& increase();// 向量自减1Vec2D& decrease();// 求向量的范数(长度)double magnitude();// 求Vec2D与x+轴的夹角double direction();// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0int 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;elsereturn (m1 > m2 ? 1 : -1);
}// 读取或修改向量元素
double& Vec2D::at(const int index)
{if( 0 == index)return x_;else if(1 == index)return y_;//使用异常处理的方式,抛出异常,并且打印携带信息elsethrow 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 和角度directioncout << "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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

md5模式 签名_MD的完整形式是什么?

md5模式 签名医师&#xff1a;医学博士/常务董事 (MD: Doctor of Medicine / Managing Director) 1)医学博士&#xff1a;医学博士 (1) MD: Doctor of Medicine) MD is an abbreviation of a Doctor of Medicine degree. In the field of Medicine, it is the main academic de…

八、卷积层

一、Conv2d torch.nn.Conv2d官网文档 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone) 参数解释官网详情说明in_channels输入的通道数&#xff0c;如果是彩色照片通道…

【C++grammar】左值、右值和将亡值

目录C03的左值和右值C11的左值和右值将亡值在C03中就有相关的概念 C03的左值和右值 通俗的理解&#xff1a; (1) 能放在等号左边的是lvalue (2) 只能放在等号右边的是rvalue (3) lvalue可以作为rvalue使用 对于第三点可以举个例子&#xff1a; int x ; x 6; //x是左值&#…

九、池化层

一、Pooling layers Pooling layers官网文档 MaxPool最大池化层下采样 MaxUnpool最大池化层上采样 AvgPool最大池化层平均采样 例如&#xff1a;池化核为(3,3)&#xff0c;输入图像为(5,5)&#xff0c;步长为1&#xff0c;不加边 最大池化就是选出在池化核为单位图像中的最大…

十、非线性激活函数

一、ReLU torch.nn.ReLU(inplaceFalse)官网提供的API 其中inplace表示是否在对原始数据进行替换 由函数图可以看出&#xff0c;负数通过ReLU之后会变成0&#xff0c;正数则不发生变化 例如&#xff1a;input -1&#xff0c;若inplace True&#xff0c;表示对原始输入数据进…

最短公共子序列_最短公共超序列

最短公共子序列Problem statement: 问题陈述&#xff1a; Given two strings, you have to find the shortest common super sequence between them and print the length of the super sequence. 给定两个字符串&#xff0c;您必须找到它们之间最短的公共超级序列&#xff0c…

QTP自传之web常用对象

随着科技的进步&#xff0c;“下载-安装-运行”这经典的三步曲已离我们远去。web应用的高速发展&#xff0c;改变了我们的思维和生活习惯&#xff0c;同时也使web方面的自动化测试越来越重要。今天&#xff0c;介绍一下我对web对象的识别&#xff0c;为以后的对象库编程打下基础…

leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

目录1、传引用2、vector使用初始化方法常用成员函数3、字符串string初始化方法常用成员函数4、哈希表 unordered_map初始化常用成员函数示例&#xff1a;计数器5、哈希集合 unordered_set初始化常用成员函数6、队列 queue初始化成员函数7、栈stack初始化常用成员函数7、emplace…

十一、线性层

一、Linear Layers torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 以VGG神经网络为例&#xff0c;Linear Layers可以将特征图的大小进行变换由(1,1,4096)转换为(1,1,1000) 二、torch.nn.Linear实战 将CIFAR-10数据集中的测试集二维图像[6…

leetcode 42. 接雨水 思考分析(暴力、动态规划、双指针、单调栈)

目录题目思路暴力法动态规划双指针法单调栈题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组…

十二、Sequential

一、Sequential介绍 torch.nn.Sequential(*args) 由官网给的Example可以大概了解到Sequential是将多层网络进行便捷整合&#xff0c;方便可视化以及简化网络复杂性 二、复现网络模型训练CIFAR-10数据集 这里面有个Hidden units隐藏单元其实就是连个线性层 把隐藏层全部展开整…

社交问答:取代BBS的Web2.0革命

编者按&#xff1a;本文由乐维UP创始人俞越撰写&#xff0c;你也可以点击这里关注俞越的新浪微博。 BBS在中国的兴起是在95年&#xff0c;之后以惊人的速度发展起来。从2011年开始&#xff0c;国内的问答社区也如当年的BBS一样&#xff0c;大量涌现快速成长&#xff0c;大体分为…

单调栈 leetcode整理(三)

目录42. 接雨水思路分析901. 股票价格跨度思路581. 最短无序连续子数组思路一&#xff1a;排序双指针思路二&#xff1a;单调栈思路三&#xff1a;双指针(最省时)42. 接雨水 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&…

python 抠图 锯齿_Python | 绘图中的抗锯齿

python 抠图 锯齿Antialiasing is another important feature of Matplotlib and in this article, we will review how to use this functionality. pyplot.antialiased() is an inbuilt function in matplotlib.pyplot which performs our required operation. 抗锯齿是Matpl…

apk 反编译

引用&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 最新版:dex2jar http://code.google.com/p/dex2jar/downloads/list 错误&#xff1a;http://code.google.com/p/dex2jar/issues/detail?id20 这段时间在学Android应用开发&#xff0c;在想既然是用Jav…

OpenDiscussion_DataDrivenDesign

本文源于公司内部技术交流&#xff0c;如有不当之处&#xff0c;还请指正。 Content&#xff1a; 1. What is Data-driven design?2. WPF revolution.3. More about ObservableCollection.4. Question.1. What is Data-driven design?Data-driven design: is a design of usi…

十三、Loss Functions

一、Loss Functions损失函数 损失函数的作用&#xff1a; 1&#xff0c;损失函数就是实际输出值和目标值之间的差 2&#xff0c;由这个差便可以通过反向传播对之后的数据进行更新 Loss Functions官网给的API 里面由很多种损失函数&#xff0c;不同的损失函数有其不同的用途及表…

linux命令行界面_Linux中的命令行界面

linux命令行界面If you are like most people, you are probably most familiar with using a Graphical User Interface (GUI) to control your computer. Introduced to the masses by Apple on the Macintosh computer and popularized by Microsoft, a GUI provides an eas…

十四、OPTIM

一、torch.optim torch.optim.Optimizer(params, defaults)优化器官网说明 由官网给的使用说明打开看出来优化器实验步骤&#xff1a; ①构造选择优化器 例如采用随机梯度下降优化器SGD torch.optim.SGD(beyond.parameters(),lr0.01)&#xff0c;放入beyond模型的参数param…

leetcode 滑动窗口小结 (二)

目录424. 替换后的最长重复字符思考分析1优化1004. 最大连续1的个数 III友情提醒方法1&#xff0c;基于当前最大频数方法2&#xff0c;基于历史最大频数424. 替换后的最长重复字符 https://leetcode-cn.com/problems/longest-repeating-character-replacement/ 给你一个仅由大…