中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++細節問題(bug調試)以動態綁定代碼來示例

發布時間:2020-07-04 21:51:47 來源:網絡 閱讀:1027 作者:liam2199 欄目:編程語言

在程序界,有句話是,程序好些,bug難調。

很多bug并不一點是邏輯錯誤,而是一些細節問題。

我們分析下三個細節錯誤引起的無法運行問題:

//#define M_PI 3. 14159265358979323846      3.14中間有個空格

\t        寫成了\ t       有個空格

首先,創建了一個新類型CFigure。我們想創建一些具體的圖形(如,三角形、正方形或者圓),以及計算這些圖形周長和面積的方法。但是,我們并不知道具體的圖形是什么類型,所以無法用方法直接計算圖形的這些特性。這就是要把CFigure類創建為抽象類的原因。抽象類是至少聲明了一個虛方法的類,該虛方法沒有實現,且其原型后面有=0。以這種方式聲明的函數叫做純虛函數。抽象類不能有對象,但是可以有繼承類。因此可以實例化抽象類的指針和引用,然后從CFigure類派生出CTriangle、CSquare和CCircle類,分別表示三角形、正方形和圓形。

我們要實例化這些對象的類型,所以在這些派生類中,實現了FigureType方法、Circumference方法和Area方法。雖然這3個類中的方法名都相同,但是它們的實現不同,這與覆蓋類似但含義不同。

如何理解?在本例的main函數中,聲明了一個數組,內含3個CFigure類型的指針。作為指向基類的指針或引用,它們一定可以指向該基類的任何派生類。因此,可以創建一個CTriangle類型的對象,并設置CFigure類型的指針指向它,

CFigure* figures[3];

同理,用下面的代碼可以設置其他圖形:

	figures[0] = new CTriangle(2.1,3.2,4.3);	
	figures[1] = new CSquare(5.4,6.6);
	figures[2] = new CCircle(8.9);

現在,考慮下面的代碼:

for (int i = 0; i < 3; i++)
	{
		cout << "Figure type:\t" << figures[i]->FigureType();
		cout<< "\nCircumference:\t" << figures[i]->Circumference();
		cout<< "\nArea:\t\t" << figures[i]->Area();
		cout<< endl << endl;
	}

編譯器將使用C++的動態綁定(dynamicbinding)特性,確定圖形指針具體指向哪個類型的對象,調用合適的虛方法。只有把方法聲明為虛方法,且通過指針或引用訪問才能使用動態綁定。


全部代碼如下,直接可以編譯運行:

#include "stdafx.h"
#include < iostream>
#include <tchar.h> 
#define M_PI 3.14159265358979323846
using namespace std;
//#define M_PI 3. 14159265358979323846      3.14中間有個空格

class CFigure  //base class
{
public:
	virtual char* FigureType() = 0;
	virtual double Circumference() = 0;
	virtual double Area() = 0;
	virtual ~CFigure()
	{ 
	
	}
};

class CTriangle : public CFigure //Derived Class
{
public:
	CTriangle()
	{
		a = b = c = 0;
	}
	CTriangle(double a, double b, double c) : a(a), b(b), c(c) { }

	virtual char* FigureType()
	{
		return "Triangle";
	}
	virtual double Circumference()
	{
		return a + b + c;
	}
	virtual double Area()
	{
		double S = Circumference() / 2;
		return sqrt(S * (S - a) * (S - b) * (S - c));
	}
private:
	double a, b, c;
};
class CSquare : public CFigure  //Derived Class
{
public:
	CSquare()
	{
		a = 0.0;
		b = 0.0;
	}
	CSquare(double a, double b) : a(a), b(b)
	{

	}
	virtual char* FigureType()
	{
		return "Square";
	}
	virtual double Circumference()
	{
		return 2 * a + 2 * b;
	}
	virtual double Area()
	{
		return a * b;
	}
private:
	double a, b;
};
class CCircle : public CFigure //Derived Class
{
private:
	double r;

public:
	CCircle()
	{
		r = 0;
	}
	CCircle(double r) : r(r)
	{

	}
	virtual char* FigureType()
	{
		return "Circle";
	}
	virtual double Circumference()
	{
		//return 2 * r * M_PI;
		double res = 0.00000000000000000000000;
		res = 2 * r * M_PI;
		//res = 2 * r *  3. 141592;
		return res;

	}
	virtual double Area()
	{
		double res = 0.000000000000000000000;
		res = 2 * r * M_PI;
		//res = 2 * r *  3. 14159265358979323846;
		return res;

	}

};
int _tmain(int argc, _TCHAR* argv[]) 
{
	CFigure* figures[3];
	figures[0] = new CTriangle(2.1,3.2,4.3);	
	figures[1] = new CSquare(5.4,6.6);
	figures[2] = new CCircle(8.9);

	for (int i = 0; i < 3; i++)
	{
		cout << "Figure type:\t" << figures[i]->FigureType();
		cout<< "\nCircumference:\t" << figures[i]->Circumference();
		cout<< "\nArea:\t\t" << figures[i]->Area();
		cout<< endl << endl;
	}

	getchar();
	return 0;
}

運行結果:

C/C++細節問題(bug調試)以動態綁定代碼來示例

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

六安市| 嘉义县| 阿尔山市| 得荣县| 沙田区| 红桥区| 新野县| 洪江市| 邹城市| 锦屏县| 荆州市| 汕尾市| 宜章县| 湖州市| 如东县| 漾濞| 广河县| 德安县| 崇文区| 通渭县| 望奎县| 岳普湖县| 乐安县| 佛坪县| 彰武县| 胶南市| 商水县| 湛江市| 濮阳市| 佛山市| 江西省| 常熟市| 天镇县| 石屏县| 绵竹市| 余江县| 托克托县| 河间市| 旬阳县| 增城市| 图木舒克市|