2014年1月18日土曜日

C++ オブジェクトをメンバに持つ





今回はオブジェクトをメンバに持つクラスの
説明です。


通常の変数や関数と同様に、オブジェクトを
クラスのメンバにすることもできます。(^^)




オブジェクトをメンバにして新しいクラスを作ることは、よくあります。
例えば以下のようになります。

//Dateクラスの定義
class Date
{
public:
    Date(int year, int month, int day)
    {
        m_year = year;
        m_month = month;
        m_day = day;
    }
private:
    int m_year;
    int m_month;
    int m_day;
};

class Food
{
public:
    static double sm_tax;
    static void SetTax(double tax){
        sm_tax = tax;
    }
    void SetPrice(int price);
    int GetPrice(void);
private:
    Date BestBeforeDate;  //DateクラスのBestBeforeDateオブジェクト
    int m_price;
};

そのままFoodクラスの中に、Dateオブジェクトがあるイメージです(^^;)

メンバにしたオブジェクトを初期化するには
先のようにメンバにしたオブジェクトの初期化は、コンストラクタで行います。
但し、コンストラクタの中ではなく、初期化リストという部分で初期化します。

//BestBeforeDateオブジェクトの初期化と変数m_priceの初期化
Food()
:BestBeforeDate(2014, 1, 13), m_price(105)
{}

初期化リストの形式は、「:(コロン)」に続けて初期化するためのリストを
書いていきます。複数ある場合は、「,(カンマ)」で区切ります(^-^)

このように、オブジェクトだけでなく int型やdouble型 などの
メンバ変数もここで初期化することができます。

初期化されるときの順番は、メンバにしたオブジェクトの後に
コンストラクタの内容が実行されます。

class Date
{
public:
    Date(int year, int month, int day)
    {
        m_year = year;
        m_month = month;
        m_day = day;
        cout << "I'm Date Object." << endl;
    }
    :
class Food
{
public:
    Food()
    :BestBeforeDate(2014, 1, 13), m_price(105)
    {
        cout << "I'm Food Object." << endl;
    }
    :

こんな感じに実験してみると、確かにDateの方が先に実行されて
いるのがわかります。

# ./test
I'm Date Object.
I'm Food Object.

ただ、初期化リストはたまにしか使わないと、ついつい書式を忘れて
Google先生に聞くことになりますね...(*´Д`)

今日の名言
些細なことをとやかく言うな。取るにも足りぬこと - 人生のシロアリ - に
自分の幸福を食いつぶされるな。
                               デール・カーネギー

やるべきことは、遠くにぼんやり見えるものを見ることではなく、
手直にはっきり見えるものを行うことである。
                               トーマス・カーライル

もはや手の施しようのない事態になったら、事態の成り行きに任せるだけだ。
                               ヘンリー・フォード

「記録を調べてみよう」そして、こう自問するのだ。「平均値の法則によると、
不安の種になっている事柄が実際に起こる確率はどのくらいだろうか?」
                               デール・カーネギー

一度決断を下し、後は実行あるのみとなったら、その結果に対する責任や
心配を完全に捨て去ろう。
                               ウィリアム・ジェイムズ