[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/13 19:22 / Filesize : 243 KB / Number-of Response : 945
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part69



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 としました。

730 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:22:20 ]
You are God.
I solved the problem, thank you.
What it only has to say the reward is not understood.

731 名前:703 [2009/06/03(水) 20:27:36 ]
と思ったら、まだ解決していませんでした。
申し訳ないです。

732 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:39:13 ]
<stdexcept> と <exception> って、
どっちをインクルードするほうが望ましいの?

733 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:41:32 ]
<stdexcept>で定義されている例外を使いたければ<stdexcept>

734 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:42:12 ]
>>731
書き直してもいい?

要するにファイルの内容は unsigned short 型のデータが
ビッグエンディアンで 6016x288 個格納されているのを
data1 に代入すれば data も idata も KOTAE も必要ないよね

735 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 20:53:56 ]
>>703
社内で使ってる(であろう)コードをこんなところに晒して、
ただで済むと思ってるのか?
オープンソースじゃないだろうし、上司に知られたらやばいんじゃねーの。

736 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 21:21:08 ]
スタックオーバーフローエラーを直してくれた先輩には
もう見限られたのか?

737 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 21:58:15 ]
>>731
なにが解決してないの?

738 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 22:40:43 ]
ほんとプロが作るソースって
ゴミクズだよな。
どこもかわらねえなぁ。



739 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 22:48:19 ]
え?>>703の話なら、プロのコードじゃないっしょ。

社内でコンピュータにちょっと詳しい人(事務職とかバイトのお兄ちゃんとか)に
アホ課長が「エクセルで計算するのめんどいからお前プログラム書けよ」って
仕方なくしこったんじゃない?

どうみてもCで書いたコードを、その人がやめちゃって保守要員がいなくなったので
これまたその辺のちょっとコンピュータ詳しい奴にむりくりやらせてるってところでは。

すごいエスパー。昔、エスパドリューはエスパーが身につける特別な装備だと思っていたのを思い出した。

740 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:49:15 ]
ふと思ったんだが↓↓

C++では関数が返せる変数の型は1つだけである。
(その型と継承関係によってはその子クラスの型でも返せることもあるが。)
ところが、例外処理におけるthrowは関数から外へ任意の型の例外を投げることが可能である。
これをその関数の返り値(戻り値)とみなして
プログラミングをするという面白い技法が
この世に存在していてもおかしくないのではないか

と思ったのだが、誰か知っている人いない?
例外を使ったプログラミングの話をしている訳じゃ無くて
あくまでthrowによる例外を戻り値として利用するスタイルってことで。

741 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:55:54 ]
テンプレートクラスを使えば戻り値の型なんて自由自在ですよ。
無茶しないでください。


742 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:57:22 ]
そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
していないならboost::any返せばいいでしょという話だと思う。

743 名前:デフォルトの名無しさん mailto:sage [2009/06/03(水) 23:57:35 ]
>>740
実用してる奴がいたら絶対に近づきたくないが
ネタとしてはおもしろそうだな。

はたして意味のあるプログラムを作ることができるのか・・・

744 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:04:54 ]
もしうまいことやったとしても、Schemeなんかの継続のきわめて限定的なまねごとになるのではと思う。
どういう形か想像もつかないが。

745 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:10:33 ]
継続ねえ。
じゃあお題は例外でC#で言うところのyield()を作る
でどうよ。

746 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:17:20 ]
_


さっそく自分で否定しちまった・・・

747 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 00:39:24 ]
>>740のは面白いな
何か可能性を感じる

748 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 01:27:32 ]
variantでいいじゃん
戻り値の型として使いたいものの集合がコンパイル時に決まっていないと
例外使う方法も結局何もできないわけだし



749 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 02:00:23 ]
変態プログラミングの可能性と聞いて

750 名前:703 [2009/06/04(木) 02:02:54 ]
>734様

先程、プログラミングを回してみた結果
無事解決しました。
727様のおっしゃるとおり
データ解析部分でデータの構造が合致してないことが
原因でした。
もし、お時間があるなら、書き直してくださったプログラムを
見せていただきたいです。

751 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 02:36:54 ]
>>740
そういうのはイベント駆動型とかいうやつじゃないか

752 名前:740 mailto:sage [2009/06/04(木) 06:28:37 ]
>>741
え?
どういうことだい?
よく分からないんだが。。。

みんなありがとう。
俺も絶対やらないと思うけど、
>そのアイデアに「catchされなければ呼出元へ伝播する」という例外の特徴も考慮した?
一応考えてる。
boost::anyやvariantは頭をよぎったが忘れることにした。

うーん、むずかしいよねぇ。
少なくとも俺はやらないけど、きっと誰かが何かすごいことを
やってくれるんじゃないかと思った。


753 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 11:11:57 ]
やらないのかよ

754 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 11:52:00 ]
>>752
c#でもやっていてください
とくにLINQ

755 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 14:00:53 ]
>>752
例外のキャッチってコストかかるんでパフォーマンス劣化が激しいと思うぞ

756 名前:デフォルトの名無しさん [2009/06/04(木) 14:02:25 ]
アゲ

757 名前:732 mailto:sage [2009/06/04(木) 17:05:22 ]
>>733
ありがとう!

758 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:20:46 ]
>>740
むやみやたらにthrow使うのはgotoと大して変わらないので、
普通やらん。
やめとけ。



759 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 17:51:57 ]
普通に関数オブジェクトでも引数として渡せばいいだけやん。

760 名前:740 mailto:sage [2009/06/04(木) 17:57:29 ]
もちろん俺だって普通はやらんさ。

でもまあどこかの変態級のプログラマがうまくこれを生かして…(ry

761 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:32:06 ]
試しに
#define return assert(0)
して、throw以外で関数から出るのを禁止してプログラム書いてみたらいい
何かが見えてくるかもしれんぞ

762 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 20:42:01 ]
C++の関数を全部こう書き換える

retType func(/* ... */){
  /* ... */
  return foo;
}



function func(/* ... */) throw(retType){
  /* ... */
  throw foo;
}

そして
class function{private:function();~function();};
と定義すれば、めでたく例外指向プログラミング言語の出来上がり

使うのは遠慮します

763 名前:740 mailto:sage [2009/06/04(木) 21:00:49 ]
>>761-762
ありがとう。
うーん、なんとも気持ち悪い物が出来上がりそうだw

764 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:10:07 ]
三値論理の関数型言語?で似たような事が出来たような?
よくわからんが

765 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:20:59 ]
boost::any を使えば受け取る側は関数側から何が返ってくるか知らなくてもいいけど
例外の場合は、帰ってくる型が何であるかは知っておく必要があるよね?

間違ってるかしら・・・

766 名前:デフォルトの名無しさん mailto:sage [2009/06/04(木) 23:47:52 ]
>>765
一応catch(...)で、何でも受けれる。
受けられるだけだが。

戻り値返しにない例外の機能として、
安全な中間すっとばしがある。

funcA() -> funcB() -> funcC() -> 例外発生
↑-----------------------------」

これを使えば、非常に柔軟な逆フロー制御が実現できる。
つまり、メインルーチンを例外のcatch()ブロックに書くのだ。
これを使って何が出来るかというと、それは次の人どうぞ。

767 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:11:17 ]
一方ロシアはgotoを使った。

768 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:16:15 ]
anyだろうと何だろうと型を知らないと何も出来ないから、
結局そのままどっかに転送するしかないよな
throw;で同じ事が出来そうな気はする



769 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:19:15 ]
VC9だと落ちるんだけどw
#include <iostream>
void fib(int n) {
  if (n < 2) { throw 1; }
  else {
    try { fib(n-1); } catch (int r1) {
      try { fib(n-2); } catch (int r2) {
        throw r1 + r2;
      }
    }
  }
}
int main() {
  try { fib(20); } catch (int ret) {
    std::cout << ret << std::endl;
  }
  return 0;
}

770 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:21:40 ]
あーそうだ、多重例外は未定義だったな

標準C++の範囲で例外指向プログラミングはできないようです

771 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:29:57 ]
うーん、
変態Chain Respinsibility?

void discover() {
 switch (random) {
 case 0:
  throw Chair;
 case 1:
  throw Human;
 case 2:
  throw Orange;
 case 3:
  throw Truth;
 }
}

void loop() {
 while (1) {
  Sitter(Killer(Eater(Philosopher(discover))));
 }
}

どうすんだこれ・・・

772 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:31:46 ]
綴りひでぇorz

773 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 00:45:36 ]
いいかんじに変態的だな

774 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 02:23:18 ]
>768
visitorで何とかする手はあるよ。
ttp://www.boostpro.com/vault/index.php?action=downloadfile&filename=holder.zip&directory=Data%20Structures&


775 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 05:26:42 ]
多重例外って何ですか?
アクティブな例外が2つ以上同時に発生することですか?
それともtry・catchブロックの中にtry・catchブロックがあることですか?

776 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 09:32:40 ]
例外ハンドラで例外が出ること

777 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 11:12:55 ]
テンプレートクラスで自身を返す場合、書き方としてどっちが正しいのでしょうか。
1も正しいなら今後1で書こうと思ってます。

template<class T> class X
{
public:
X &Func() // 1
X<T> &Func() // 2
{
return *this;
}
}


778 名前:デフォルトの名無しさん [2009/06/05(金) 11:33:33 ]
C++を1から学習しようかと思うのですが、参考書は何がおすすめでしょうか?
visual C++を使おうかと思っているのですが。
分厚くてもよいので、一冊で応用まで深く学習出来るのはありませんかね?



779 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 11:52:54 ]
>>777
2、テンプレート引数を省略しないといけないのはコンストラクタだけ

780 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 12:03:14 ]
>>778
禿本を買っておけば間違いは無い

781 名前:デフォルトの名無しさん [2009/06/05(金) 13:44:02 ]
>>780
禿本とは何ですか?

782 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 13:53:12 ]
softbank

783 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 13:54:12 ]
そういう時に真っ先に「C++ 禿本」で検索しない精神がよくわからん。

784 名前:デフォルトの名無しさん [2009/06/05(金) 14:47:44 ]
検索したのですが、出てきませんでした。
ていうより、59件ヒットしてその全てがただ禿本とC++を含んでるやつのみで
何の略かも書いてありませんでした。
その本の正式名称がわかりません。
すいませんが、本の正式名称で書いていただけませんか?


785 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:01:04 ]
C++ 禿

でぐぐったら一番上におっさんの名前出てきたわw

786 名前:780 mailto:sage [2009/06/05(金) 15:04:39 ]
確かにC++ってググるときに引用符を付けないと駄目なんだよな。

正式名称はThe C Programming Language(邦訳はプログラミング言語C++)
著者はC++の設計者である禿ことBjarne Stroustrupだ。
www.research.att.com/~bs/ に写真があるからよく拝んでおくように。

日本語訳については色々言われているみたいだが、俺は原著しか使ったことが
ないので分からん。英語に問題ないなら原著をすすめておく。

787 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:07:13 ]
一番、二番目に出てくるならまだしもそれ以外でググレとか言う奴の精神が分からん。
素直に教えて感謝されればいいのに

788 名前:デフォルトの名無しさん [2009/06/05(金) 15:12:09 ]
>>786
禿本とはそういう意味だったのですか。
教えてくださってどうもありがとうございました。参考にします。




789 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:37:25 ]
確かに"禿本"だけであとググれってのはちょっとひどいなw

英語に問題ないならTC++PL(禿本)よりも先にProgrammingを読んだほうがいいかも
同じようなこと書いてあるけどProgrammingのほうが分かりやすい
TC++PLにしか書いてないこともあるからどのみちTC++PLは読むんだけどね

790 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:39:18 ]
途中で送信しちまった…
TC++PL(禿本): www.research.att.com/~bs/3rd.html
Programming:  www.research.att.com/~bs/programming.html

791 名前:780 mailto:sage [2009/06/05(金) 15:42:31 ]
>>876
自己レススマソ。原著名間違えた。K&Rじゃないっての。

>>787
まあ2chだから仕方ないね。
禿本ってこのスレでは良く知られてると思ってたけど、意外とそうでもないのかな。

792 名前:777 mailto:sage [2009/06/05(金) 15:44:42 ]
>>779
ありがとう。コンパイル通るからいいのかと思ったけど
やっぱり基本的には全部書かないとだめなのね。


793 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 15:45:04 ]
禿本と書いてても意味がわからんからスルーしてた
スルーで正解だった

794 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:20:14 ]
>>787
> 一番、二番目に出てくるならまだしも
Googleを使わせるか否かを考えるのに「一番、二番目に出て来るかどうか」を基準にする、
怠惰な人間をつけあがらせる使命でもあるかのような考え方は理解不能だし、
悪いけど二番目の結果(環境依存OKスレの2スレ目)にこういう文章が出て来るぞ。
> 「プログラミング言語C++」は禿本と呼ぶ。

あ、"C++"と"禿本"をダブルクォーテーションで括る発想に至らないバカは考慮してないけど。

795 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:27:12 ]
質問です。どうしてこのスレには捻くれた奴が湧くんですか?

796 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 16:30:53 ]
たとえばどのレスのことなのか例を挙げてくれないと、
本当にそういう傾向があるのか、自分のバカさを指摘されたバカが
必死にそう見ようとしてるだけなのか判断つかず、回答できないです。

797 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:31 ]
>>792
2でもいいんだけどね。テンプレートパラメータは
宣言された範囲(テンプレートのスコープ)内では省略していいことになっている。
クラス定義の冒頭で template が宣言されていて、その範囲内に入っているので、
この場合のメンバ関数宣言のテンプレートパラメータは省略できる。
(Accelerated C++ p.197などを参照)

template < class T > class foo {
 template < class T > foo &bar( foo<T> &t );
};

のような紛らわしい宣言も可能な様子。

798 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:26:34 ]
>>795
捻くれものは大抵、過去に何らかの形で虐げられた経験がある
あとはわかるな?



799 名前:デフォルトの名無しさん mailto:sage [2009/06/05(金) 19:29:36 ]
>795
C++自体が捻れた言語だからです。

800 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 15:12:48 ]
>>797
全然別人なんだけど割り込んで聞いて良い?

template < class T > class foo {
 template < class T > foo &bar( foo<T> &t );
};
ってのは要するに
template < class T > class foo {
 template < class U > foo<T> &bar( foo<U> &t );
};
ってことだよね?

801 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:23:43 ]
>>798
わかります。
現実の現在で叩きのめされたので、架空の過去を夢想して脳内逆襲ですね?

802 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 20:26:59 ]
>>800
最初の方はgcc 4.2.1ではエラーになった。

803 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 21:46:37 ]
(・3・) エェー。ぼじゅあるくっぷぷ(Visual C++)では問題なしだYO

>>800
Yes。

804 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 22:04:24 ]
以下の変態プログラムでテンプレートパラメータの挙動についてご確認ください
#include <iostream>
using namespace std;

template < class T > class foo {
public:
foo() : x( 0 ) {};
foo( foo *p ) : x( p ) {};
template < class T > foo &bar( foo<T> &t ){
cout << t.member << endl;
return *x;
}
T member;
foo *x;
};

int main() {
foo< int > base;
base.member = 1000;

foo< int > i(&base);
foo< char > c;
i.member = 1;
c.member = 'a';

foo< int > r = i.bar( c );
cout << r.member << endl;
}

805 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:02:33 ]
危うく騙されそうになったが
return *xだから挙動自体は普通だな

806 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 05:28:11 ]
r.memberが初期化されない…と思ったがコピーコンストラクタじゃないのか。

807 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:07:05 ]
>>804
読むだけで疲労した。
barメンバ関数が何をやりたいのか意図が分からない
(練習プログラムだから仕方ないことだが。)
のに理解をじゃまされた。

分かって良かった。

808 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 12:38:25 ]
>>807
>>797の再現じゃないの?



809 名前:807 mailto:sage [2009/06/07(日) 12:56:34 ]
>>808
ああそうなのか、ここのところこのスレ見てなかったから
全然流れを読んでなかったわ。


810 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 13:58:30 ]
下のように、クラスAAのインスタンスを、メモリーに割り当てたときに。
コンストラクタとデストラクタをどうやって起動したらいいのでしょ?

class AA { int i1,i2; AA(); ~AA(); }
void func()
{
 char dat[100];
 AA *dat;
 dat = (AA *)dat;
}

811 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:02:17 ]
コンストラクタ
new(dat) AA();
デストラクタ
dat->~AA();

812 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:11:53 ]
AA * dat = new AA[100];
delete[] dat;

813 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:38:59 ]
上の例、バッファーとポインターが同じでした、ミスすみません
>>881 下記のようにうにエラーになります  >>812 100個のインスタンスを作るわけではないです
class AA
{
 int a1,a2;
public:
 AA() { printf("AA コンストラクタ\n"); }
 ~AA() { printf("AA デストラクタ\n"); }
};
int _tmain(int argc, _TCHAR* argv[])
{
 char buf[100];
 AA *datp;
 datp = (AA *)buf;
 new(datp) AA(); // ここがエラーになる…
 datp->~AA();
 return 0;
}
エラー 1 error C2660: 'operator new' : 関数に 2 個の引数を指定できません。


814 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:39:55 ]
#include <new> が抜けてるだろ

815 名前:デフォルトの名無しさん [2009/06/07(日) 14:41:49 ]
atnd.org/events/702

124.45.27.25:12086/stream.mp3.m3u
IRCNET #CRYBUTSU

816 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 14:55:53 ]
>>814 できました、ありがとうございます。

817 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:12:11 ]
ローカル変数に対するplacement newって、アラインメントを気にする必要がなかったっけ?

818 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 15:16:19 ]
気にする必要があると思います。
実際のプログラムは、sizeof で確認をしています



819 名前:デフォルトの名無しさん [2009/06/07(日) 16:27:09 ]
std::vector のようなコンテナを作ろうと思うんだが、
要件について詳しくまとまってるページない?

820 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:49:49 ]
規格を読め

821 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 16:55:54 ]
別にinterfaceクラスを継承してるわけでもないし、
要件なんて無いぞ。

822 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:05:30 ]
要するに value_type なんかの必須 typedef や
領域確保時の用件とかを知りたいんじゃろ?

領域確保に new を使っちゃらめとか、
知らないとはまる部分もあるしー。

823 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:09:05 ]
>>819
www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf
の23.2.6をしっかり読むこと。

SGIのドキュメントはまとまっていて良かったんだが、最新の仕様と乖離してるのかな。
www.sgi.com/tech/stl/Vector.html

>>821
馬鹿か?

824 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:17:18 ]
>>820-823
トンクス

825 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 17:21:58 ]
>>821
ちょwww

826 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:02:35 ]
>>769-770
>>775-776
このレスで出てきている多重例外「例外ハンドラで例外が出ること」についてですが、
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw 42;}//ここが多重例外
ってことですよね?
では
try
{foo();}//適当な例外を投げる関数
catch(const std::exception& ex)
{throw ex;}//ここは?
この様に例外を再送する場合も多重例外となり未定義の動作ですか?
また、再送する場合{throw;}と書いても未定義になりますか?


827 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 19:33:06 ]
>>826
>770や>776は何か勘違いしているような・・・。
例外ハンドラ(catch節)で例外を投げるのは正当。

多重例外というのはもっと異常な事態で、
例外によるスタックの巻戻し中にデストラクタがさらに例外を投げたとか、
値渡しのcatchへ例外をコピー中にコピーコンストラクタが例外を投げたとかのことを言い、
そういう時でも未定義ではなく、terminate()が呼ばれるんじゃなかったっけ?

828 名前:==775==826 mailto:sage [2009/06/07(日) 20:20:29 ]
とりあえず例外の再送出は問題ないと分かれば当面は解決です。ありがとうございます。

>>827
>例外によるスタックの巻戻し中にデストラクタがさらに例外を投げた
は、
私(>>775)の言う
>アクティブな例外が2つ以上同時に発生すること
ってヤツですよね。
この場合は未定義だとEffective C++で紹介されています。
しかし
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
ここによると
>デストラクタから例外を送出するクラスAのオブジェクトを自動記憶域で宣言し、
>その生存期間内で他の例外が発生した場合、A::~A()が呼び出されて、
>その中でまた例外が送出されます。これは二重例外と呼ばれ、
>問答無用でstd::teminateが呼び出されます。
>次に、デストラクタから例外を送出するかもしれないオブジェクトを
>静的記憶域期間で宣言した場合を考えてみてください。
>静的記憶域のオブジェクトを監視ブロック(try〜catchの制御文)で囲む構文を
>記述することはできません。すなわち、こちらはデストラクタから例外が発生した
>時点で(std::terminateの呼び出しではなく)未定義の動作になります。
と書いてありますが、果たして何がどうなんでしょうね。




829 名前:デフォルトの名無しさん mailto:sage [2009/06/07(日) 21:16:02 ]
catch節で例外を受けた場合、受け取った例外を再送するか、
受け取った例外を破棄して別の例外を送出するしかなくて、
結局、伝播する例外は1つだけになるので問題ない。
それ以外で例外伝播中に他の例外が発生すると、
2つの例外を伝播させなければならなくなるけど、
それはできないことになってて、かわりにstd::terminate()が呼ばれる。

830 名前:828 mailto:sage [2009/06/07(日) 22:14:01 ]
>>829
・・・としますと
Effective C++の未定義だという記述の方が誤りで、
デストラクタからの例外送出::実装技術
ttp://cppemb.blog17.fc2.com/blog-entry-31.html
の方が正しいと言うことでしょうか?







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<243KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef