- 1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
- 87 名前:デフォルトの名無しさん mailto:sage [2009/05/06(水) 23:50:53 ]
- 某サイトで「コンストラクタで例外を投げるな」なんて書いた人がいたけど
基本的には問題ないし、コンストラクタで正常にオブジェクトの構築が出来ないときは 例外を投げるのが最も適切。 もし、気になっている問題があるなら、具体的に書いてもらってもいいけど。
- 88 名前:デフォルトの名無しさん [2009/05/07(木) 00:05:27 ]
- >>86
全く問題ないよ。
- 89 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:13:08 ]
- >>71
> (pairが)等価ベースとはどういう事でしょうか? その元レスは直前のレスに対する独り言のようなものだろうから文面をそのまま受け取っては駄目。 おそらく以下の説明のようなことを踏まえての発言。 pairのoperator<はまずfirst同士を比較して、それが等しければsecond同士を比較するという流れ。 ここで等しければを判定するのに等値かどうかで判定するのではなく等価かどうかで判定する。
- 90 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:21:12 ]
- >>86
後始末が必要なものをしっかりかたづけてればおk。 A(){ h = gethandle(); // 後で明示的に解放する必要あり /* このあとに例外投げるかもしれない処理を行う */ } ~A(){ releasehandle(h); } みたいな場合、例外をコンストラクタの外に投げる前に後始末が必要。
- 91 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:32:28 ]
- 「解放すべきもの(newで確保されたメモリや、その他のリソースなど)を保持してデストラクタで解放する」
という仕事をするためのクラスを利用すると、例外に対処しやすい。 そういうクラス自体の設計時は例外安全に注意する必要がある(コンストラクタでうかつに例外を投げてはならない) が、そういうクラスの利用者のほうは適当に例外を投げてもリソースリークが起こらないようになる。
- 92 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 00:44:59 ]
- 日本語でおk
- 93 名前:91 mailto:sage [2009/05/07(木) 01:02:48 ]
- >>92は俺に言ってる?
例えばスマートポインタを使う場合が最も分かりやすい。 次のようなクラス MyClass があったとする。 class MyClass { public: MyClass(); ~MyClass(); private: MyAnotherClass* p; }; で、MyClass::MyClass() の内部で p = new MyAnotherClass(); などとして、 MyClass::~MyClass() で delete p; しているとする。この場合、MyClass::MyClass() が迂闊に例外を スローすると、MyClass::~MyClass() が実行されないためにpが解放されない場合があるから、 例外をスローする場合はpの解放がきちんとされるように、注意深くコードを書かなければならない。 ただし、メンバ変数 p をポインタではなくスマートポインタとすると、そのような注意は不要となる。 例えば std::auto_ptr<MyAnotherClass> p; となっていて、MyClass::MyClass() の内部で p(new MyAnotherClass()); とした場合、たとえMyClass::MyClass()が例外をスローしても newされたものはちゃんと解放されるから、神経質にならなくて済む。 忘れてはならないのは、スマートポインタのコンストラクタが迂闊に例外をスローしてしまうと、 結局、リソースリークの可能性は消えないということだ。まあ自分でスマートポインタを書いて使うことは 普通の人はないと思うけど、実際 boost::shared_ptr 等はコンストラクタで例外を投げる場合があり、 その場合でもリソースリークが起こらないようにちゃんと配慮されている。
- 94 名前:91 mailto:sage [2009/05/07(木) 01:08:31 ]
- ごめん、std::auto_ptr 使って p(new MyAnotherClass()); は無いね。
コンストラクタのメンバ初期化子に書いたと思ってくれ。
- 95 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 08:24:20 ]
- >>91
「そういうクラス」「そういうクラスの利用者」って何? 「そういうクラスの利用者『のほう』」って何と比べてるの?
- 96 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 10:34:03 ]
- >>95
文脈から明らかでないか?
- 97 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:10:34 ]
- 明らかじゃないから聞いてるんだろ。
明らかだと思うなら、どう明らかか書けばいい。
- 98 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:16:18 ]
- 例えば、>>93が>>91の説明であるならば、
>>93に登場するクラスのどれが、「そういうクラス」に相当するのか?
- 99 名前:11 mailto:sage [2009/05/07(木) 11:35:51 ]
- >>89
等値(equality) a == b 等価(equivalence) !(a < b) && !(b < a) これの事ですね。 ありがとうございました。
- 100 名前:デフォルトの名無しさん mailto:sage [2009/05/07(木) 11:36:10 ]
- >>98
std::auto_ptr とか boost::shared_ptr とかが「そういうクラス」。
- 101 名前:100 mailto:sage [2009/05/07(木) 11:37:50 ]
- まあクラスじゃなくてクラステンプレートか。
std::auto_ptr<MyAnotherClass> とかが「そういうクラス」だと思ってもらえれば。
|

|