1. 程式人生 > >博覽網_C++_第三週_Rectangle類的初步實現(二)

博覽網_C++_第三週_Rectangle類的初步實現(二)

//	本檔名  class_define.h			我的程式設計環境VS2013
/*		本程式的註釋代表僅代表個人理解,不一定完全正確,全是我親自敲上去的,如有錯誤請聯絡我。						*/
/*	本程式隨機數生成器類和變引數print()函式使用了C++11 的標準,可能有的編譯器不能編譯通過,我會截圖一下編譯結果	*/
/*	本程式沒有使用原型的設計模式,而是採用結構體的模式	*/
#ifndef __CLASS_DEFINE_H__
#define __CLASS_DEFINE_H__
#include<iostream>
#include<random>
using namespace std;
const double PI = 3.1415926;			//π


namespace guo
{
	template<typename T>
	class Shape
	{
	private:
		int no;					//給每個Shape類及其子類按建立物件順序標號
	public:
		static int count;		//統計當前存活的Shape類及其子類按建立物件(數目)
		Shape() :no(++count) { ; }							//建構函式
		Shape(const Shape& other) :no(++count)	{ ; }		//拷貝建構函式
		Shape& operator=(const Shape& other)
		{
			if (this == &other)
			{
				return *this;
			}
			else
			{
				no = other.no;
				return *this;
			}
		}
		~Shape() { count--; }			//當前存活的Shape類及其子類按建立物件(數目減一)
		int get_no() const { return this->no; }
		static void set_count(const int x)	{ count = x; }
		virtual T getArea() = 0;		//得到面積


	};

	class Point
	{
	private:
		int x;
		int y;
	public:
		Point(int x1 = 0, int y1 = 0) : x(x1), y(y1)	{; }	//	建構函式,支援物件符合
		int get_x() const { return x; }
		int get_y() const { return y; }
	};

	class Rectangle : public Shape<double>
	{
	private:
		int width;
		int height;
		Point leftUp;
	public:
		Rectangle(int width1 = 0, int height1 = 0, int x1 = 0, int y1 = 0);			//建構函式	
		//Rectangle(const Rectangle& other);							//拷貝建構函式
		Rectangle& operator=(const Rectangle& other);				//拷貝賦值函式
		~Rectangle();												//解構函式 只宣告不定義會出無法解析的錯誤
		int get_width() const { return width; }
		int get_height() const { return height; }
		const Point& get_leftUp() const { return leftUp; }
		virtual double getArea()	{ return (this->height)*(this->width); }				//得到面積
		friend Rectangle& __doequ(Rectangle*, const Rectangle&);	//賦值實際運算函式
		//int get_no() const { return no; }
	};

	class Circle : public Shape<double>
	{
	private:
		Point center;
		int radius;
	public:
		Circle(int radius1 = 0, int x2 = 0, int y2 = 0);			//建構函式
		~Circle();												//解構函式 只宣告不定義會出無法解析的錯誤
		Circle& operator=(const Circle& other);				//拷貝賦值函式
		int get_radius() const { return radius; }
		const Point& get_center() const { return center; }
		virtual double getArea()	{ return PI*(this->radius)*(this->radius); }		//得到面積
	};

	class Rand_int				//等概率整數的隨機數生成器		隨機生成器由引擎(負責生成一組隨機值或者偽隨機數)和一種分佈(負責把引擎產生的值對映到某個數學分佈上)
	{
	public:
		Rand_int(int low, int high) : dist{ low, high }
		{
			;
		}	 		//建構函式  初始化隨機數範圍
		int operator()(){ return dist(re); }		//操作符() 過載	得到一個隨機int
	private:
		default_random_engine re;		//預設隨機引擎
		uniform_int_distribution<> dist;//分佈:生成的所有整數概率相等

	};

	typedef struct twotype
	{
		Rectangle p;
		Circle q;
	}twotype;

/************************************						The Rectangle class member function define.						************************************/

	inline Rectangle::Rectangle(int width1, int height1, int x1, int y1) : width(width1), height(height1), leftUp(Point(x1, y1))	//Rectangle類的建構函式,需要Point有建構函式
	{
		;
	}

	inline Rectangle::~Rectangle()
	{
		;
	}

	Rectangle& Rectangle::operator=(const Rectangle& other)
	{
		if (this == &other)
		{
			return *this;
		}
		Shape<double>::operator=(other);
		this->width = other.width;
		this->height = other.height;
		this->leftUp = other.leftUp;
		return *this;
	}




/****************************************************************************************************************************************************************/

/************************************						The Circle class member function define.						************************************/

	inline Circle::Circle(int radius2, int x2, int y2) :radius(radius2), center(Point(x2, y2))
	{
		;
	}

	inline Circle::~Circle()
	{
		;
	}

	Circle& Circle::operator=(const Circle& other)				//拷貝賦值函式
	{
		if (this == &other)
		{
			return *this;
		}
		Shape<double>::operator=(other);
		center = other.center;
		radius = other.radius;
		return *this;
	}

/****************************************************************************************************************************************************************/
	
/*							print函式							*/
	void print()
	{
		;
	}
	template<class type, class... types>		//class 的定義和 typename 類似 都是說這個模板引數定義的是一個類,而不是變數.class type 和	class... types      type 和 types 是模式 , ...  是包擴充套件
	void print(const type& x, const types&... next)
	{
		cout << x << endl;
		print(next...);
	}
/****************************************************************************************************************************************************************/


	//Rectangle** create_array(Rectangle **buff, const int& count)
	//{
	//	Rand_int randx{1,10};
	//	for (int i = 0; i < count; i++)
	//	{
	//		buff[i] = new Rectangle(randx(), randx(), randx(), randx());
	//	}
	//	//for (int i = (count / 2); i < count; i++)
	//	//{
	//	//	buff[i] = new Circle(randx(), randx(), randx());
	//	//}
	//	return buff;
	//}

	//Circle** create_array(Circle **buff, const int& count)
	//{
	//	Rand_int randx{ 1, 10 };
	//	for (int i = 0; i < count; i++)
	//	{
	//		buff[i] = new Circle(randx(), randx(), randx());
	//	}
	//	return buff;
	//}

	ostream& operator<<(ostream& os, guo::Rectangle& rec)			//The Rectangle class operator function. 
	{
		return os << ' ' << "NO." << rec.get_no() << ' ' << '(' << "長=" << rec.get_height() << ',' << "寬=" << rec.get_width() << ',' << "面積=" << rec.getArea() << ')' << "      " << "座標=" << '(' << rec.get_leftUp().get_x() << ',' << rec.get_leftUp().get_y() << ')' << endl;
	}

	ostream& operator<<(ostream& os, guo::Circle& cir)			//The Rectangle class operator function. 
	{
		return os << ' ' << "NO." << cir.get_no() << ' ' << '(' << "半徑=" << cir.get_radius() << ',' << "面積=" << cir.getArea() << ')' << "      " << "座標=" << '(' << cir.get_center().get_x() << ',' << cir.get_center().get_y() << ')' << endl;
	}

	twotype* create_array(twotype *buff, twotype *buff2, const int& count)
	{
		Rand_int randx{ 1, 10 };
		
		print("初次建立:");
		for (int i = 0; i < count; i++)
		{
			Rectangle a(randx(), randx(), randx(), randx());
			Circle b(randx(), randx(), randx());
			buff[i].p = a;
			buff[i].q = b;
			cout << buff[i].p << endl;
			cout << buff[i].q << endl;
		}
		print("刪除面積小於之後:");
		for (int i = 0; i < count; i++)
		{
			if (buff[i].p.getArea() >= 50)
			{
				buff2[i].p = buff[i].p;
				cout << buff2[i].p << endl;
			}
			if (buff[i].q.getArea() >= 50)
			{
				buff2[i].q = buff[i].q;
				cout << buff2[i].q << endl;
			}
		}
		

		return buff;
	}

}

#endif

//	本檔名  main.h			我的程式設計環境VS2013
/*		本程式的註釋代表僅代表個人理解,不一定完全正確,全是我親自敲上去的,如有錯誤請聯絡我。						*/
/*	本程式隨機數生成器類和變引數print()函式使用了C++11 的標準,可能有的編譯器不能編譯通過,我會截圖一下編譯結果	*/
/*	本程式沒有使用原型的設計模式,而是採用結構體的模式	*/
#include<iostream>
#include"class_define.h"
#include<random>

using namespace std;
int guo::Shape<double>::count = 0;
const int x = 10;

int main(void)
{
	//guo::Rectangle r1{ 2, 2, 1, 1 };
	//guo::Circle c1{ 2, 3, 4 };
	//guo::Rectangle *a1[x];
	//guo::Circle *a2[x];
	guo::twotype a3[x];
	guo::twotype buff2[x];


	//cout << "矩形r1:" << r1 << endl;

	//cout << "圓形c1:" << c1 << endl;

	//cout << "sizeof(r1)=" <<sizeof(r1) << endl;		//繼承證明驗證

	/*guo::print("請輸入建立陣列的大小(20):");*/		//自定義print()函式驗證
	//cin >> x;

	guo::create_array(a3, buff2, x);					//建立刪除一體

	/*printArray(a3, x);*/



	getchar();
	getchar();
	return 0;
}

七、執行截圖