1 类设计

  • 基本功能

  (1)默认构造时,自动初始化为(0,0,0);

  (2)支持点之间的加、减运算;

  (3)支持点与常量数据的加、减、乘除运算;

  (4)支持点之间的相等或不能判断

  (5)如果把点类看作一个向量,应该支持向量的点乘、求模操作;

  • 成员变量是采用private还是public属性

  这是一个操作非常频繁的类,如果成员变量采用隐藏起来的方式,采用x()取值、采用setX()设置值,用起来很是不爽。

  示例1:point.x = point1.x + point2.x;  (简单易懂)

  示例2:  point.setX(point1.x() + point2.x()); (大量点运算时,很不爽)

  • 采用普通类还是模版类

  点类计算主要是一些基础数据类型运算,主要是int、double、float;

  如果采用普通类的话,最好定义默认的数据类型为double,所有的点运算都按照双精度浮点型计算,这基本上满足了很大部分的计算需求;

  尽管如此,本文还是采用模版类以满足通用性;

2 模版类定义

  非模版类和类成员函数的声明在h文件中,实现在cpp文件中;但是模版类的声明和实现都在cpp中。

  • 友元函数声明问题点:

  重载符号operator- 时,声明前缺少template <typename T>; 调用point = point1 - value时出现无法解析的外部符号;

  

  

  • 重载ostream问题

  出现非法使用显示模版参数的错误,正确定义为operator<< <>,不需要尖括号中的T

  

  

  • 定义别名,增强编程的可阅读性
typedef Gpoint3<int>       Gpoint3i;
typedef Gpoint3<float> Gpoint3f;
typedef Gpoint3<double> Gpoint3d;

3 Gpoint3模板类实现

 ////////////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2017, DuanBeiChen, all rights reserved.
//
// Author : DuanBeiChen
// Create : 2017-12-10 09:21
// Mail : duanchristian2015@gmail.com
// Version : 1.0
//
//
// Description : 一个基本的三维点类
// (1)默认构造时,自动初始化为(0,0,0);
// (2)支持点之间的加、减运算, point3 = point1 + point2;
// (3)支持点与常量数据的加、减、乘除运算, point2 = point1 + x;
// (4)支持点之间的相等或不能判断;
// (5)如果把点类看作一个向量,应该支持向量的点乘、求模操作;
////////////////////////////////////////////////////////////////////////////////////////
#pragma once #ifndef _G_POINT3_H_
#define _G_POINT3_H_ #include <iostream>
namespace DB
{ template <typename T> class Gpoint3
{
public:
//default constructor
Gpoint3(); //copy constructor
Gpoint3(const Gpoint3 &point1);
Gpoint3<T>& operator = (const Gpoint3<T> &point1); //constructor
Gpoint3(T m_x,T m_y,T m_z); ~Gpoint3(); /* 重载运算符 */
void operator += (const Gpoint3 &point1);
void operator -= (const Gpoint3 &point1);
void operator += (const T value);
void operator -= (const T value);
void operator *= (const T value);
void operator /= (const T value); bool operator == (const Gpoint3 &point1);
bool operator != (const Gpoint3 &point1); /* 重载操作流 ,可以删除声明 */
template <typename T>
friend std::ostream& operator<< <> (std::ostream &out, const Gpoint3<T> &point1); /* 友元函数 ,这部分声明可以删除 */
template <typename T>
friend Gpoint3<T> operator+ (const Gpoint3<T> &point1,const Gpoint3<T> &point2);
template <typename T>
friend Gpoint3<T> operator- (const Gpoint3<T> &point1,const Gpoint3<T> &point2);
template <typename T>
friend Gpoint3<T> operator+ (const T value ,const Gpoint3<T> &point2);
template <typename T>
friend Gpoint3<T> operator- (const T value ,const Gpoint3<T> &point2);
template <typename T>
friend Gpoint3<T> operator* (const T value ,const Gpoint3<T> &point2);
template <typename T>
friend Gpoint3<T> operator+ (const Gpoint3<T> &point1,const T value);
template <typename T>
friend Gpoint3<T> operator- (const Gpoint3<T> &point1,const T value);
template <typename T>
friend Gpoint3<T> operator* (const Gpoint3<T> &point1,const T value); public:
T x;
T y;
T z; }; /************************************************************************/
/* 构造函数和析构函数
/************************************************************************/
template <typename T>
DB::Gpoint3<T>::Gpoint3(): x() ,y() ,z() { } template <typename T>
inline DB::Gpoint3<T>::Gpoint3(const Gpoint3 &point1) : x(point1.x) , y(point1.y) ,z(point1.z){ } template <typename T>
inline DB::Gpoint3<T>::Gpoint3( T m_x,T m_y,T m_z ): x(m_x), y(m_y), z(m_z){ } template <typename T>
inline Gpoint3<T>& DB::Gpoint3<T>::operator=( const Gpoint3<T> &point1 )
{
x = point1.x;
y = point1.y;
z = point1.z; return *this;
} template <typename T>
DB::Gpoint3<T>::~Gpoint3()
{
x = ;
y = ;
z = ;
} /************************************************************************/
/* 重载运算符
/************************************************************************/
template <typename T>
inline void DB::Gpoint3<T>::operator+=( const Gpoint3 &point1 )
{
x += point1.x;
y += point1.y;
z += point1.z;
} template <typename T>
inline void DB::Gpoint3<T>::operator-=( const Gpoint3 &point1 )
{
x -= point1.x;
y -= point1.y;
z -= point1.z;
} template <typename T>
inline void DB::Gpoint3<T>::operator+=(const T value)
{
x += value;
y += value;
z += value;
} template <typename T>
inline void DB::Gpoint3<T>::operator-=(const T value)
{
x -= value;
y -= value;
z -= value;
} template < typename T>
inline void DB::Gpoint3<T>::operator*= ( const T value)
{
x *= value;
y *= value;
z *= value;
} template < typename T>
inline void DB::Gpoint3<T>::operator/= ( const T value)
{
if(abs(value) > 1e-)
{
x /= value;
y /= value;
z /= value;
}
} template <typename T>
inline bool DB::Gpoint3<T>::operator== (const Gpoint3 &point1)
{
return (x == point1.x && y == point1.y && z == point1.z);
} template <typename T>
inline bool DB::Gpoint3<T>::operator!= (const Gpoint3 &point1)
{
return !(x == point1.x && y == point1.y && z == point1.z);
} /************************************************************************/
/* Gpoint3 : non - member function
/************************************************************************/
template <typename T>
inline Gpoint3<T> operator+ (const Gpoint3<T> &point1, const Gpoint3<T> &point2)
{
Gpoint3<T> tempPoint;
tempPoint.x = point1.x + point2.x;
tempPoint.y = point1.y + point2.y;
tempPoint.z = point1.z + point2.z; return tempPoint;
} template <typename T>
inline Gpoint3<T> operator- (const Gpoint3<T> &point1, const Gpoint3<T> &point2)
{
Gpoint3<T> tempPoint;
tempPoint.x = point1.x - point2.x;
tempPoint.y = point1.y - point2.y;
tempPoint.z = point1.z - point2.z; return tempPoint;
} template <typename T>
inline Gpoint3<T> operator+ (const Gpoint3<T> &point1 , const T value)
{
Gpoint3<T> tempPoint;
tempPoint.x = point1.x + value;
tempPoint.y = point1.y + value;
tempPoint.z = point1.z + value; return tempPoint;
} template <typename T>
inline Gpoint3<T> operator- (const Gpoint3<T> &point1 , const T value)
{
Gpoint3<T> tempPoint;
tempPoint.x = point1.x - value;
tempPoint.y = point1.y - value;
tempPoint.z = point1.z - value; return tempPoint;
} template <typename T>
inline Gpoint3<T> operator* (const Gpoint3<T> &point1 , const T value)
{
Gpoint3<T> tempPoint;
tempPoint.x = point1.x * value;
tempPoint.y = point1.y * value;
tempPoint.z = point1.z * value; return tempPoint;
} template <typename T>
inline Gpoint3<T> operator/ (const Gpoint3<T> &point1 , const T value)
{
Gpoint3<T> tempPoint; if(abs(value) > 1e-)
{
tempPoint.x = point1.x / value;
tempPoint.y = point1.y / value;
tempPoint.z = point1.z / value;
} return tempPoint;
} template <typename T>
inline Gpoint3<T> operator+ (const T value, const Gpoint3<T> &point2)
{
return (point2 + value);
} template <typename T>
inline Gpoint3<T> operator- (const T value, const Gpoint3<T> &point2)
{
Gpoint3<T> tempPoint;
tempPoint.x = value - point2.x;
tempPoint.y = value - point2.y;
tempPoint.z = value - point2.z; return tempPoint; } template <typename T>
inline Gpoint3<T> operator* (const T value, const Gpoint3<T> &point2)
{
return (point2 * value);
} /************************************************************************/
/* 文件流
/************************************************************************/
template <typename T>
std::ostream& operator<< <>(std::ostream &out,const Gpoint3<T> &point1)
{
out << point1.x << " " << point1.y << " " << point1.z;
return out;
} typedef Gpoint3<int> Gpoint3i;
typedef Gpoint3<float> Gpoint3f;
typedef Gpoint3<double> Gpoint3d; } #endif

4 模版类测试

 #include "Gpoint3.h"

 int main()
{ DB::Gpoint3<int> point1;
std::cout << " point1 is " << point1 << std::endl; DB::Gpoint3<float> point2(1.0,2.0,3.0);
DB::Gpoint3<float> point3(2.2,3.5,4.1);
point3 += point2;
std::cout << " point2 is " << point2 << std::endl;
std::cout << " point3 is " << point3 << std::endl; point3 *= ;
std::cout << " point3 is " << point3 << std::endl; DB::Gpoint3<float> point4(10.0,10.0,10.0);
point4 /= 1e-;
std::cout << " point4 is " << point4 << std::endl; DB::Gpoint3<double> point5(1.2,1.2,);
DB::Gpoint3<double> point6 = (double) + point5 - (double); point5 = point6; if(point5 == point6)
{
std::cout << " point5 is equal to point6 " << std::endl;
std::cout << point6 << std::endl;
}
else
{
std::cout << " point5 is not equal to point6 " << std::endl;
} }

一个三维点类Gpoint3的实现的更多相关文章

  1. iOS之02-第一个OC的类

    OC是一门面向对象的语言,因此它也有类.对象.静态\动态方法.成员变量的概念.这讲就来创建第一个OC的类. 第一个类的源码: /* 人 类名:Person 属性(成员变量\实例变量):体重.年龄 行为 ...

  2. 怎么使用jquery判断一个元素是否含有一个指定的类(class)

    在jQuery中可以使用2种方法来判断一个元素是否包含一个确定的类(class).两种方法有着相同的功能.2种方法如下:(个人喜欢用hasClass()) 1.           hasClass( ...

  3. 我写的一个ExcelHelper通用类,可用于读取或生成数据

    读取或生成EXCEL数据的方法有很多,一般常见的有: 1.通过OFFICE EXCEL组件,优点:读取与生成EXCEL文件方便,缺点:服务器上必须安装OFFICE软件,且进程无法及时释放 2.通过第三 ...

  4. Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例

    利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...

  5. 我写了一个java实体类,implements了Serializable接口,然后我如何让serialversionUID自动生成

    写了一个java实体类,implements了Serializable接口,让serialversionUID自动生成方法: 1.点击类旁边的警告符号: 2.选择Add generated seria ...

  6. JAVA 一个特殊的类 Object

    一个特殊的类Object:它是java中所有对象的直接或间接父类,根父类(基类),它里面定义的功能是所有对象都应该具备的(所有的类,都是继承这个类的) 记住:当定义一个新类时,没有指明要继承某类,它默 ...

  7. 【Objective-C】0-第一个OC的类

    OC是一门面向对象的语言,因此它也有类.对象.静态\动态方法.成员变量的概念.这讲就来创建第一个OC的类. 一.语法简介 1.类 在Java中,我们用1个.java文件就可以描述清楚一个类:在OC中, ...

  8. 一个使用CSocket类的网络通信实例

    http://www.cppblog.com/changshoumeng/archive/2010/05/14/115413.html 3.8 一个使用CSocket类的网络通信实例 本例采用CSoc ...

  9. 如何创建一个要素数据类 IField,IFieldEdit,IFields,IFieldsEditI,GeometryDef,IGeometryDefEdit接口

    如何创建一个要素数据类 创建要素类用到了IFeatureWorkspace.CreateFeatureClass方法,在这个方法中有众多的参数,为了满足这些参数,我们要学习和了解下面的接口. IFie ...

随机推荐

  1. excel中添加拼接行

    Sub 万途标签()Dim iFor i = 1 To Sheets.Count    If Sheets(i).Name = "数据表" Then        If MsgBo ...

  2. web项目生成war包的问题

    今天面试一家公司,问我生成war包的命令是什么? 当时没明白,就说自己用的eclipse直接右键 export --->war 完了重启tomcat(第一种) 好久没用maven了.回来一查才明 ...

  3. SpringBoot初体验(续)

    1.如果你还不知道SpringBoot的厉害之处,或者你不知道SpringBoot的初级用法,请移步我的上一篇文章,传送门 2.SpringBoot中的表单验证 所谓验证,无非就是检验,对比,正如ja ...

  4. 在vue2.0中使用sass

    第一步:使用sass必须安装下面三个东西 cnpm install node-sass --save //安装node-sass cnpm install sass-loader --save //安 ...

  5. java 操作hbase1.2

    说明: .第一部分为代码 .第二部分为工程pom文件 [java] view plain copy import org.apache.hadoop.conf.Configuration; impor ...

  6. Python pip 下载速度慢? Windows 设置 国内源,用 阿里云 国内镜像 加速

    pip 提供了对 Python 包的查找.下载.安装.卸载的功能,是非常方便的 Python 包管理工具.但是,令人苦恼的是 pip 在国内的下载速度非常慢,速度常常只有每秒几十 K,甚至才几 K,小 ...

  7. 蓝桥杯-算法训练--ALGO-6 安慰奶牛

    问题描述Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但 ...

  8. HTML学习笔记 CSS文本及字体及连接及列表(a标签使用及缩进) 案例 第七节 (原创)参考使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 记录我发现的第一个关于 Google 的 Bug

    先贴上 Bug 链接: https://issuetracker.google.com/issues/68969655 Bug 本身是很简单的,就是 Google 的 Android 在线参考文档中, ...

  10. 【WEB API项目实战干货系列】- API访问客户端(WebApiClient适用于MVC/WebForms/WinForm)(四)

    这几天没更新主要是因为没有一款合适的后端框架来支持我们的Web API项目Demo, 所以耽误了几天, 目前最新的代码已经通过Sqlite + NHibernate + Autofac满足了我们基本的 ...