誰が為にconst
その3

2002/03/10 undo


今回もC++における「const」をとりあげます。
唐突ですが、すてきなパートナーとめぐり合い結婚することをクラスで表現してみましょう。


class Person {
public:
    Person() : partner(NULL) {};
    
    void Marry(Person& lover) {
        if (partner == NULL) { // 独身者だったら
            partner = &lover;
            lover.Marry(*this);
        }
    };

private:
    Person *partner;
};

こんな感じになるでしょう。別のインスタンスへのポインタを有するクラス定義なんてのは、どの本でも腐るほど出てきますので、説明の詳細は省略します。このとき、パートナーを設定するので「void Marry() const」とはなりません。
では気持ちが変わって離婚するときはどうでしょうか? ふつう男が心変わりするときは、すでに別の女がいるなんて話はよくありますが、ここでは考えません(^^;;


void Person::ChangeMind() {
    if (partner != NULL) {
        Person *p = partner;
        partner = NULL;
        p->ChangeMind();
    }
}

こんな感じでしょうか? これも同様に「const」とはなりません。
「おいおい! constの話じゃなかったのかよぉ〜」と思ったみなさん、ここまでが今日の前置きです(^^;;

「void ChangeMind()」では、constではない=表面上、自分も傷ついてしまいます。そこで、自分が傷つかない別れ方をお教えしましょう(^_^)

そんな別れ方を「bool NoChangeMind() const」としましょう。中味は非常に簡単です。相手からふられるようにすればいいのです。そうすれば、自分は全く傷つかないわけです。えっ?!分かりませんか? それでは次のコードを見てください。


void Person::NoChangeMind() const {
    if (partner != NULL) {
        partner->ChangeMind();
    }
}

花子は太郎と財産目当てで結婚した後、表面上、心変わりしていないといいながら、太郎のほうから離婚話を持ち出させて、慰謝料として財産をもらおうというのは、次のようなコードになるわけです(^^;;

constにはこういう罠があるのです。過信しすぎないようにしましょう。constはあなただけのためにあるわけじゃないのです。

えっ??使い方が悪いって! それが分かっているならば、立派なもんです :-p


    Person hanako;
    Person taro;
    
    taro.Marry(hanako);
    hanako.NoChangeMind();

今日の専門用語


戻る