🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: japan.comp.lang.visual-c++
Article #18

Re: コンストラクタ内を避けるべき処理

#18
From: Yuki Shiino
Date: Sat, 06 May 2000 00:00
54 lines
3011 bytes
 椎野です。

電子のお針箱さんの記事<8eu2vv$pun$1@newsjp.mbn.or.jp>から
> Yukihiro Hashi <yukihiro@sky.plala.or.jp> wrote in message
> news:8es3l3$kas$1@pin2.tky.plala.or.jp...
> 
> > コンストラクタは返り値を持たないので、
> >エラーの発生する処理をある程度避けるべきだと思っていますが、
> 
>   この基準の意図がわかりません。エラーを返しにくいと言うことですか ? 例外処
> 理で十分と思いますが...。

>   必要なエラー処理は全て入れ、エラー発生は例外で伝えます。

 エラーの別の通知法としては、エラー状態を保持するというものも
あります。

    ifstream fin("DataFile");
    if (!fin) error();  // if (fin.fail()) error();

の様なパターンです。例外を投げた方が良いのか、エラー状態を保持
した方が良いのかは、複数の判断基準によって決まる難しい問題でしょ
う。


 コンストラクタの仕事はインスタンスの構築なので、インスタンス
の構築に必要な処理は全て行う必要があります。その際生じたエラー
の通知法は前述の通り、大きく分けて2通りでしょう。

 問題はifstreamの様な例なのでしょう。果してファイルのオープン
までコンストラクタで行う必要があるのか。メンバ関数(open())に処
理を任せれば良いのではないか。しかしコンストラクタでファイルの
オープンまで出来た方が便利かもしれないし、「入力ストリーム」を
用意するという目的を考えると寧ろオープンすべきかもしれない。
 果してコンストラクタでどこまで処理を行うべきだろうか。
 おそらく質問の核心はここにあるのでしょう。(違っていたらご指
摘下さい。)

> > 諸兄の経験に基づくご意見をいただければと思います。
> > みなさまはどのような基準をお持ちでしょうか?

 難しい質問なので答え難いです。
 オブジェクトがすぐに使える状態になっているのが望ましいとは思
いますが、そうではない例も多数あります。ifstreamの例ですとファ
イルをオープンするのが望ましいとは思いますが、オープンするべき
ファイルの名前が構築時には決定できないこともあります。
 一つの解決策はifstreamの様に複数のタイプのコンストラクタを用
意することです。ユーザのニーズに応じて処理を行い、エラーの通知
法も必要に応じて複数用意します。
 人により意見の分かれそうな問題なので、他の方の意見も参考にし
て下さい。(本当に難しい。)

-- 
 椎野 裕樹   <yuki@cds.ne.jp>
Technical Details
Message-ID: <8ev2fq$pqb$1@news.cds.ne.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <8es3l3$kas$1@pin2.tky.plala.or.jp> <8eu2vv$pun$1@newsjp.mbn.or.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 10a2c7,d8108d20cf4aa80b
X-Google-Attributes: gid10a2c7,public
X-Google-Thread: f71b3,d8108d20cf4aa80b
X-Google-Attributes: gidf71b3,public
From: Yuki Shiino <yuki@cds.ne.jp>
Subject: Re: コンストラクタ内を避けるべき処理
Date: 2000/05/06
Message-ID: <8ev2fq$pqb$1@news.cds.ne.jp>
X-Deja-AN: 619681043
References: <8es3l3$kas$1@pin2.tky.plala.or.jp> <8eu2vv$pun$1@newsjp.mbn.or.jp>
Content-Type: text/plain; charset=iso-2022-jp
Organization: none
Mime-Version: 1.0
Newsgroups: japan.comp.lang.visual-c++,fj.comp.lang.c++