目錄
- 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