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();