promotion image of download ymail app
Promoted
? 發問時間: 電腦與網際網路程式設計 · 8 年前

C++ 函數 overload 改 函數 template

拜託幫我把 這個程式改成 template的寫法 我弄好久弄不出來...

#include<iostream>

using namespace std;

#define PI 3.14159

//計算圓

double area(double r)

{

return 2.0*PI*r*r;

}

//計算矩形

double area(double w, double h)

{

return w*h;

}

//計算三角形

double area(double a, double b, double c)

{

double s;

s=(a+b+c)/2.0;

return sqrt(s*(s-a)*(s-b)*(s-c));

}

int main()

{

double r,w,h,a,b,c;

cout<<"計算圓面積(請輸入半徑):";

cin>>r;

cout<<"圓面積為:"<<area(r)<<endl;

cout<<"計算矩形面積(請輸入長與寬):";

cin>>w>>h;

cout<<"矩形面積為:"<<area(w,h)<<endl;

cout<<"計算三角形面積(請輸入三角形三個邊):";

cin>>a>>b>>c;

cout<<"三角形面積為:"<<area(a,b,c)<<endl;

system("pause");

return 0;

}

已更新項目:

【帕拉提斯】

可不可以請你舉個簡單的例子 用overload 改成 template的寫法 >< 拜託

5 個解答

評分
  • Chen
    Lv 6
    8 年前
    最佳解答

    you may make different shape calculation in the same area.

    #include

    #include

    using namespace std;

    #define PI 3.14159

    template< class T> class CIRCLE

    {

    public:

    T area( T r );

    };

    template< class T> T CIRCLE ::area( T r )

    {

    return((T)(2.0*PI*r*r));

    }

    template< class T> class RECTANGLE: public CIRCLE

    {

    public:

    T area( T w, T h );

    };

    template< class T> T RECTANGLE ::area(T w, T h)

    {

    return((T)(w*h));

    }

    template< class T> class TRIANGLE: public RECTANGLE

    {

    public:

    T area( T a, T b, T c );

    };

    template< class T> T TRIANGLE ::area( T a, T b, T c)

    {

    double s; s=(a+b+c)/2.0;

    return((T)(sqrt(s*(s-a)*(s-b)*(s-c))));

    }#define circle CIRCLE::area

    #define rectangle RECTANGLE::area

    #define triangle area

    #define AREA TRIANGLEint main()

    {

    double r,w,h,a,b,c;

    AREA double_area;

    AREA int_area;

    cout<<"--------- Please input double area----------------\n";

    cout<<"計算圓面積(請輸入半徑):";

    cin>>r;

    cout<<"圓面積為:"<<double_area.circle(r)<<endl;

    cout<<"計算矩形面積(請輸入長與寬):";

    cin>>w>>h;

    cout<<"矩形面積為:"<<double_area.rectangle(w,h)<<endl;

    cout<<"計算三角形面積(請輸入三角形三個邊):";

    cin>>a>>b>>c;

    cout<<"三角形面積為:"<<double_area.triangle(a,b,c)<<endl;cout<<"--------- Please input int area----------------\n";

    cout<<"計算圓面積(請輸入半徑):";

    cin>>r;

    cout<<"圓面積為:"<<int_area.circle(r)<<endl;

    cout<<"計算矩形面積(請輸入長與寬):";

    cin>>w>>h;

    cout<<"矩形面積為:"<<int_area.rectangle(w,h)<<endl;

    cout<<"計算三角形面積(請輸入三角形三個邊):";

    cin>>a>>b>>c;

    cout<<"三角形面積為:"<<int_area.triangle(a,b,c)<<endl;system("pause");return 0;

    }

    2012-09-30 10:36:22 補充:

    AREA double_area;

    AREA int_area;

    • Commenter avatar登入以對解答發表意見
  • 8 年前

    觀念有點問題@@

    Template是指傳入參數的不同所應變出來,就像是三角形丟入不同型別的數字進去運算一樣,問題是每個面積的計算方法都不一樣,不可能把這些東西統整在一起,我覺得這種比較類似抽象介面,定義出一個抽象類別是shape,裡面固定有儲存這是甚麼形狀和Area面積,接著透過繼承在去實現詳細過程,這不太適合template。

    和 CBELL 說得差不多,這個例子不適合拿來用,就用最經典的NODE來試試看會比較有成就感XD

    • Commenter avatar登入以對解答發表意見
  • 8 年前

    我覺得你的三個area()實在是沒有封裝性可言。

    等過了幾個月後,你再回來看,(或是留給學弟用)

    用這函式的人,看輸入一個參數就能算出面積,

    到底是算出正方形面積、還是圓形面積?

    看輸入兩個參數就能算出面積,

    到底是算出橢圓形面積、三角形面積(底x高)、還是矩形面積?

    還要浪費時間往函式裡面看在做啥運算、理解在算啥,

    才知道如何使用這些函式。

    2012-09-30 09:48:04 補充:

    我想到你可以寫個class Shape,

    然後寫class Circle、class Rectangle、class Triangle都繼承來自class Shape。

    class裡提供兩個函式,一個是輸入數字並儲存到成員變數,

    另一個是Area()把成員變數拿出來計算。

    最後再寫個template function叫做area(const Shape&),

    裡面呼叫該物件的Area()。

    主程式就例如建立Circle的物件,呼叫輸入資料的函式,

    再丟入template function。

    你若看不懂我在說啥的話,請先讀完物件導向編程,再來讀泛型編程。

    2012-09-30 09:53:35 補充:

    上面說的東西是沒用到overload,

    overload最好是很明確地用來做同一件事。

    例如計算三角形面積可以是兩個參數(底x高),

    或是三個參數(如你寫的那段),

    上面那個class Triangle就能提供兩個overload function。

    而不是參數不同,就用來計算不同形狀的面積。

    • Commenter avatar登入以對解答發表意見
  • 8 年前

    帕拉提斯】

    可不可以請你舉個簡單的範例 一樣的程式 用overload 寫 跟 template寫 >< 拜託

    • Commenter avatar登入以對解答發表意見
  • 您覺得這個回答如何?您可以登入為回答投票。
  • 其威
    Lv 7
    8 年前

    這三個函數沒辦法改成 template 寫法,因為裡面作的運算都不一樣。

    2012-09-30 05:19:40 補充:

    沒什麼好拜託的,template 跟 overload 適用的範圍不一樣。

    以你這題為例,計算圓面積、矩形面積、三角形面積的方式都不一樣,沒辦法用一個 template 函式整合在一起。

    但是你可以把每個函式都變成 template 函式,讓他們在傳入參數型態不同的時候自動產生合適的函式。

    另外,你說你「弄了很久弄不出來」,可否敘述一下你的思路還有嘗試過的方法等等?

    2012-09-30 13:55:18 補充:

    回答 1 有些怪怪的...

    一個沒有用到任何其他成員的成員函式,卻需要物件實體才能呼叫?

    • Commenter avatar登入以對解答發表意見
還有問題?馬上發問,尋求解答。