博覽網_C++_第三週_Rectangle類的初步實現(二)
阿新 • • 發佈:2019-02-19
// 本檔名 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; }
七、執行截圖