« ポップカルチャーの表と裏 | トップページ | かみんぐあうと? »

2007年1月12日 (金)

C++は難しすぎる

マンガオタクによる、マンガオタクのための、「オタクマンガ」会議。

 半分ぐらいは読んでますね。オタク漫画は大好きです。腐女子漫画も大好きです。それにしても面白いな。これだけ妄想できたら、オタク漫画も本望だろう。


 さて、本題。

 ちょくちょく、C++についてクラス設計を試行錯誤しているのですが、C++ってむちゃくちゃ難しい言語ですね。デストラクタの存在がうざったいし、参照でヌルポインタを表現できないし、中途半端さにイライラしてしまいます。この言語を自由自在に操れる人は本当にすごい。そして、JAVAをつくった人らには見事と言うしかないです。

 そして、C++に関してすごく迷っていることがあります。
 まず、コンポジションは次のようなクラスなんだと思うんです。
class A

public:
    // 省略
private:
    B b;
};

 それに対して、集約は次のようなクラスじゃないかな?と考えています。
class A

public:
    // 省略
private:
    B* b;
};

 このとき、クラスBのオブジェクトを破棄するのはどのクラスなのでしょう? クラスA? それとも、クラスAを使用するクラス? ルールが統一されてないと様々なクラスでオブジェクトを破棄しようとしたり、どのクラスでも破棄されずにゴミが残ったりすると思うんですよね。本当にガベージコレクションは偉大です。
 結局、選択肢は4つです。
 ・ガベージコレクションもどきの仕組みをつくる
 ・集約を使わない
 ・クラスAでクラスBのオブジェクトを破棄する
 ・クラスAでクラスBのオブジェクトを破棄しない

 どれを選択すべきか、様々な本を読んでみたのですが、明確な回答がないんですよ。どなたかご存知の方がいらっしゃいましたら、教えていただきたいです。

|

« ポップカルチャーの表と裏 | トップページ | かみんぐあうと? »

「アニメ・コミック」カテゴリの記事

「パソコン・インターネット」カテゴリの記事

コメント

C++は基本的にマルチパラダイムなので、javaのように純粋なオブジェクト指向が出来ないようにインターフェイスを組む事も可能なんです。
でも上記のような場合は、class Aのデストラクタでdelete b;とするのが一般的です。

投稿: 通りすがり | 2007年1月18日 (木) 15時55分

おっと、すみません、訂正します。
if( b ) delete b;
ですね。

投稿: 通りすがり | 2007年1月18日 (木) 15時57分

 コメントいただき、ありがとうございます。
 やっぱりクラス内でメモリ解放する方が安全ですよね。この場合、セッターや代入演算子でも、メモリ解放する必要がありますよね。
 でも、そうするとオブジェクトを使いまわしできないんだよなあ。使いまわしはあきらめたほうがいいんでしょうかねえ?

投稿: せつな朱遊 | 2007年1月19日 (金) 00時00分

ヌルポインタをセットするときは、メモリ解放しないでポインタを切り離すようにするかなあ。

投稿: せつな朱遊 | 2007年1月24日 (水) 08時44分

 結局、可能な限りポインタのメンバ変数は作るなということなんだろうと理解しました。
 それって、集約がなくてコンポジションばかりということ?という気分が……結局、C#を勉強するようになってたり。

投稿: せつな朱遊 | 2007年9月30日 (日) 22時21分

 Effective C++を読んで、悩んだんだよなあ。原著は第3版があるみたいね。

投稿: せつな朱遊 | 2007年12月 7日 (金) 21時18分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/26230/13447056

この記事へのトラックバック一覧です: C++は難しすぎる:

« ポップカルチャーの表と裏 | トップページ | かみんぐあうと? »