2014年3月5日水曜日

C++ テンプレートクラス





テンプレートクラスとは、使用する型を
曖昧な状態で定義しておくクラスです。


テンプレートクラスの機能を使うことで、
複数の型に対応することができます。(^^)




// 三辺の長さから、三角形の面積を求めるクラス
template<class T>  // T はテンプレート引数です(^^;)
class Triangle {
public:
    Triangle(T a, T b, T c) {
        m_a = a;
        m_base = b;  // 辺b を底辺としよう(^^;)
        m_c = c;
    }
    T GetHeight() {
        return ((m_a + m_base + m_c) / 2) * 2 / m_base;
    }
    T GetSummation() {
        return (m_a + m_base + m_c) / 2;  // ヘロンの公式
    }

    T m_a, m_base, m_c;
};

テンプレートクラスのオブジェクトを生成する場合は、次のように
使用する型を指定します。

Triangle<int> IntTriangle;             // int型を指定します
Triangle<double> DoubleTriangle;  // double型を指定します

また、テンプレート引数が二つ以上ある場合は、次のように
複数指定します。

template<class T1, class T2> // テンプレートなだけにT1, T2
class Triangle {
    :
};
    :
Triangle<int, double> tri;  // int型、double型を指定します
    :

それでは、今回のサンプルプログラムです。
#include <iostream>

using namespace std;

template<class T>  // T はテンプレート引数です(^^;)
class Triangle {
public:
    Triangle(T a, T b, T c) {
        m_a = a;
        m_base = b;
        m_c = c;
    }
    T GetHeight() {
        return ((m_a + m_base + m_c) / 2) * 2 / m_base;
    }
    T GetSummation() {
        return (m_a + m_base + m_c) / 2;
    }

    T m_a, m_base, m_c;
};

int main(void)
{
    Triangle<int> tri1(59, 50, 100);
    cout << "a = 59, b = 50, c = 100" << endl;
    cout << "height = " << tri1.GetHeight() << endl;
    cout << "   sum = " << tri1.GetSummation() << endl;

    cout << "---" << endl;

    Triangle<double> tri2(12.3, 45.6, 78.9);
    cout << "a = 12.3, b = 45.6, c = 78.9" << endl;
    cout << "height = " << tri2.GetHeight() << endl;
    cout << "   sum = " << tri2.GetSummation() << endl;

    return 0;
}

実行結果
# ./test
a = 59, b = 50, c = 100
height = 4
   sum = 104
---
a = 12.3, b = 45.6, c = 78.9
height = 3
   sum = 68.4

うーん、書いておいてなんですが合っているのかどうかが
分からないですね...(-_-;)

ちなみに、面積を求めるときのヘロンの公式をググったときに
面積 S とあったのですが、ふとこの S が何の略か気になり
これもまたググったところ、数学界の定説は

和を表すsumあるいはsummationの頭文字

とのことです。

surface じゃなかったんだ...|д゚)


今日の名言
今日気にかかることで、明日も気にかかることはめったにない。だから夜、
床につく時、たいていの悩みに対しては、安心してこう言い聞かせられる。
「お前には全力を尽くした。今後もう会うことはあるまい」
                          ウィリアム・クーパー

私は未来のことを考えない。あっという間にやってくるからだ。
                          アルバート・アインシュタイン

神の到来を待ち望む者は、自分が神の御手の中に現在いることが
分からない。神と幸福は不離一体であるという信念を抱いて、あらゆる
幸福を現在のこの一瞬の中に注ぎ込むことだ。
                          アンドレ・ジード

落し物の広告。昨日、日の出から日の入りの間のどこかで、それぞれ
六十分のダイヤモンドをちりばめた貴重な時間を二つ紛失。
なお拾い主には賞金なし。永遠に失われしゆえ。
                          ホレス・マン