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