1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
520 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:41:40 ] >>517 先生方のルールを参考にしてはどうかな www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp
521 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:53:51 ] 一応>>520 のを書いておくと クラス名 :小文字+アンダーバーの組み合わせ(例:multi_array) ネームスペース名 :クラス名同様 ローカル変数名 :クラス名同様のルールで短めに メンバ変数名 :クラス名のルールに加えて最後にアンダーバー 短くなくても良い(例:allocated_elements_) 関数名 :クラス名同様 テンプレート型引数名:パスカルケース(例:NDims) マクロ名 :大文字+アンダーバーの組み合わせ (BOOST_STATIC_CONSTANT)
522 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:54:58 ] typedef enumはどうすれあいいの?
523 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:03:51 ] typedefはクラス名同様 enumはメンバ変数名と同じ ただ、boostの中で完全に統一されてるわけでもないみたい
524 名前:デフォルトの名無しさん [2008/06/30(月) 01:04:28 ] >>517 unko_t unko;
525 名前:デフォルトの名無しさん [2008/06/30(月) 01:16:04 ] Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。 その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、 VCで作成することはできますか? 検索してもgccばかりが見つかってしまって。 ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。
526 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:20:46 ] >>525 dll と同じようなものです UNIX系では shared object Windows系では dynamic link library
527 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:41:04 ] >>517 >438で出てたGoogleのルールのまとめ: ●ファイル名 ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc ●クラス名 各語の先頭を大文字にする。 FooBar ●名前空間名 ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar ●変数名 ぜんぶ小文字で、単語は_で区切る。 foo_bar ●メンバ変数名 ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_ ●関数名 クラス名と同じ。アクセサだけは変数名と同じ。 ●定数 先頭にkを付けて、単語区切りは大文字。 kFooBar ●マクロ名 マクロなんて使うな。 アクセサと定数が妙だなあ。
528 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:07:19 ] 定数の接頭語のkって何の意味?
529 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:43 ] konstant。なぜかこれだけドイツ語。
530 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:47 ] koteiのk
531 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:16:10 ] >>518-521 ,527 細かくありがとうございます いろいろな方法があるんですね 検討して、しっくりくる方法を選びたいと思います
532 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:23:02 ] constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな マクロ禁止なら全部大文字でもよさそうだが・・・
533 名前:デフォルトの名無しさん [2008/06/30(月) 03:40:28 ] メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい
534 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 07:48:41 ] >>533 boostにもあったりするよw www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp > const traits& m_traits; > const Results& m_results; > OutputIterator m_out; > ...
535 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:36:05 ] 標準的な識別子のプレフィックス一覧みたいなのなーい? てか、どこの会社でもまちまちなんだろうけど。
536 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:41:49 ] プレフィックス一覧って? 命名ルールなら上で出てるgoogleかboostので十分だと思うけど。
537 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:27:37 ] なんか、なんちゃら記法みたいなのなかったっけ? ポインタはpを付けるとか。C言語の時代か?
538 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:49:34 ] ジャンガリアン
539 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:50:56 ] ハンガリアン記法 ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95 ただし、ポインタにpを付けたりするのは システムハンガリアンと呼ばれる間違ったハンガリアン記法。 本当のハンガリアン記法は アプリケーションハンガリアンと呼ばれてる。
540 名前:デフォルトの名無しさん [2008/06/30(月) 19:08:04 ] 禿リアン
541 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:30:34 ] >>539 おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。 けっきょくプレフィックスなんてないほうがいいのかね……
542 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:44:44 ] プレフィクスの使い方を間違わなければ有用らしいよ 間違ったコードは間違って見えるようにする - The Joel on Software Translation Project local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
543 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:29:03 ] つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す プレフィックスを付けるって感じ? システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?
544 名前:506 mailto:sage [2008/06/30(月) 21:13:12 ] >>508 ごめん。眠かったから間違えた。 by498
545 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:01:10 ] void hoge(const std::vector<foo>& foos); という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している ヘッダもhoge.hでインクルードしないといけないでしょうか? それともhoge.hでは class foo; と書くだけでおkでしょうか?
546 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:50:55 ] データを線形リストでアクセス可能かつキューのように 扱えるデータ構造ってありませんかね? data[3].hogeみたいにアクセスもしたいし dequeue(data)みたにもアクセスしたい
547 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:58:57 ] >>546 std::dequeが火を噴くときが来たな
548 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:19:19 ] なんという出番w
549 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:09:47 ] >>545 標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。 つまり class foo; だけじゃダメ。
550 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:33:31 ] forkについて 1プロセスで三回printfを実行して別プロセスを作成 そこからまた三回printfを実行して別プロセス 10プロセス実行完了したら最初のプロセスから終了していく そんな課題なのだけどforkが理解できなくて困っている… 申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
551 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:59:33 ] >>550 まずスレ違い。OSの話で言語と関係無い。 で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。
552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ] >>550 fork → UNIX/Linux系のシステムコールで環境依存 printf → C言語 【初心者歓迎】C/C++室 Ver.55【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1213466622/l50 >そんな課題 C/C++の宿題を片付けます 111代目 pc11.2ch.net/test/read.cgi/tech/1214563642/l50 >解説して www.google.com/search?q=fork
553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ] 質問です。 newでメモリを動的確保する場合失敗するとNULLが返るのですが、 これを意図的に失敗させたい場合どのような手段があるでしょうか? どういう場合にnewが確実に失敗するのかがよくわかりません。 よろしくお願いします。
554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ] >newでメモリを動的確保する場合失敗するとNULLが返るのですが 返らないよ. newが失敗したらbad_allocって例外が投げられる ためしに以下の失敗するコードを実行してみるといいよ char *a = new char[0x7FFFFFFF]; if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない
555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ] >>554 先生、失敗しないんですけど
556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ] ワロタ
557 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:00:19 ] struct test_type{ char mem[0x7FFFFFFF]; }; test_type *a = new test_type[0x7FFFFFFF]; if(a == NULL) printf("%s", "print format");
558 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ] >>555 for (;;) で囲め。
559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ] コンパイラのバージョンを聞いたほうがいい 古いやつとか組み込み用は標準と違う動作をするだろ
560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ] ご回答ありがとうございます。 コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。 >>554 のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。 コンパイラが古いとNULLを返す仕様になっているのでしょうか?
561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ] 10年くらい前なら NULL を返したかもしれない 今はみんな bad_alloc を投げる
562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ] msdn.microsoft.com/ja-jp/library/kftdy56f (VS.80).aspx >In Visual C++ 2005, the C Runtime Library's new function will also >throw a std::bad_alloc exception if the memory allocation fails. >If you still want the non-throwing version of new for the C Runtime Library, >link your program with nothrownew.obj. However, when you link with nothrownew.obj, >new in the Standard C++ Library will no longer function.
563 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ] 失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。
564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ] >>557 数学的に破綻してるコード嫌い
565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ] 今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、 最新の2008を使うべきでは。商用コンパイラ必要になるほどの 大プロジェクトじゃないならね。
566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ] >>564 数学的に破綻って?
567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ] >>566 失敗しない環境がありうるだろ 7で始まるのがプゲラとか言う問題ではない
568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ] 大抵の環境で失敗するだろうから細かいことはいいんだお!
569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ] size_tの最大値じゃん。
570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ] >565 Express Edition は無料でいいんだが、MFCが使えん。 お偉いさんは、見た目が一番なんだよ。
571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ] >>570 見た目を気にするなら、なおさらMFCはダメだろ
572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ] >>569 何が?
573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ] size_tは符号無し整数だよ。サイズは処理系定義だけど。 それはともかく、普通に2Gも確保出来るってのが・・・w >>565 2008はWin2Kに入らなかったりしてなw 2Kをバカにすん(ry >>570 WTL+ATL使おうぜ
574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ] >>573 メモリ確保操作は、物理メモリのサイズが足りなくても アドレスだけ確保して返して成功してしまう場合がある。 実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。 これは、デマンドページングといって、物理メモリの確保が 実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。 C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから この仕組みがあったからといって実際に得はしないような気はするけどな。
575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ] UNIX系はそうなんだっけか まあVCには全く関係がないな 連続した大領域確保しようとするとよく失敗するし
576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ] >>574 デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?
577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ] >>574 単にスワップメモリで足りただけじゃね?
578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ] >>576 典型的にはいらないページをスワップアウトしにいく >>577 確保だけならスワップは発生せずに即終了する
579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ] 「スワップに充分な領域が必要」な環境もあるし 「スワップに余裕があるか判断しない」環境もある。 後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。 www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html >>578 の世界はLinuxだけで出来ている模様。 あと、どうしても失敗したければ new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが この2を2Lにしないとオーバーフローする環境もあるし 逆にlong引数のnewを認めない環境もあるんだろうな。
580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ] > new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが だから、何でそうなる
581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ] >>579 ん? なんで自分がバカにされているのか全然理解できないんだけど いろいろな環境があることを頭に置いているからこそ578では 「典型的には」と頭につけたんだけどな あとそのコード変だよ 少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし そういうことやりたいなら new char[std::numeric_limits<size_t>::max()] で十分じゃないかな # ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず # なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから
582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ] > new char[std::numeric_limits<size_t>::max()] で十分じゃないかな やっと出てきたw が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな
583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ] std::size_t
584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ] SIZE_MAX
585 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:03:07 ] VC++のスレから来ました。相談させてください。 以下の710の質問をしました。 711の回答をもらいました。 それはそうだ、と納得しました。 --- 710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13 templateの使い方を教えてください class parent; class child : parent; の2つのクラスがあって、 void hogeFunc(vector<shared_ptr<parent> > & param) を呼び出したいとき、 vector<shared_ptr<parent> > vp; は渡せるけど、 vector<shared_ptr<child> > vc; が渡せないのはなんでかわからないです。 お分かりの方、理由を教えていただけないですか。 ちゃんと、pとcは親子関係にあるので問題ないと思っています。 711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53 vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。 --- で、解決方法について相談させてください。以下は正しいですか? ・ void hogeFunc(vector<shared_ptr<parent> > & param) のように、多態をvectorでやろうとしてるのが根本的に間違っている。 間違っているならこういったコンテナの要素を多態で扱いたいときは、 どのようにコーディングされているのか教えてください。
586 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:27:04 ] template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){ struct check{ void f(){ T* a=NULL; parent* b = a; } }; ... }
587 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ] 樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?
588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ] class Tree { Tree[] subtrees; }
589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ] ここC++だったorz こんなのでいいんじゃない class Tree { std::vector<Tree*> subtrees; };
590 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:55:38 ] template<typename T> struct node<T> { T value; node* prev; node* next; node* parent; node* first_child; static node* tree_next(node* n){ if(n==NULL){ return NULL; } if(n->first_child!=NULL){ return n->first_child; } return tree_next_no_child(n); } static node* tree_next_no_child(node* n){ if(n==NULL){ return NULL; } if(n->next!=NULL){ return n->next; } if(n->parent==NULL){ return NULL; } return tree_next_no_child(n->parent); } }; for(node* it=n; it!=NULL; it=node::tree_next(it)){ }
591 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ] >>587 C++を使う できない人は他のスレで聞く
592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ] >>591 ここってC++スレじゃないのか??
593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ] >>592 そうだけど、あの聞き方ではhello worldから教える必要があるだろ
594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ] 俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる? Aclass.Bclass.element = NULL 昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…
595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ] class Hoge { const char msg="nullpo"; } これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。
596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ] 大体型がおかしいだろ。 staticつけとけ
597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ] よーだょ。 ただしbool/char/short/int/long系に限りできる。floatは×
598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ] どうも、static付けてみます
599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ] enumが便利だよ
600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ] あ、なるほど。すっかり忘れてました。
601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ] C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな? なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。 まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた 版を出して欲しいけどね。
602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ] const 定数のみのクラスってどうやってかけばいいのですか? あとこういうエラー用の定数クラスは1枚のファイルに1こずつ 定義するのが流儀?
603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ] Javaじゃあるまいし
604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ] >>602 なんでクラスの中に定義する必要があるの せいぜいネームスペースでいいじゃん
605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ] シングルトンですけど、boostに入ってないですよね? Lokiぐらいしかないんでしょうか?
606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ] すみません、素朴な疑問なのですが C++ではハードあるいはOSレベルの例外(例えば零による除算)は 通常どのように扱うののでしょうか? もう少し具体的に言うと、例えばVC++なら_ _try, __except という 構造化例外のための機能が提供されていますが、 gccなどの他のコンパイラではこれと同様な機能を実現する手段は ないのでしょうか。 windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、 例外処理をどのようにするべきなのか非常に疑問です。
607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ] うーん・・・ msdn.microsoft.com/ja-jp/library/cc440193 (VS.71).aspx >C++ でプログラミングしたり、コードに移植性を持たせたい場合は、 >可能な限り標準 C++ の例外を使うことを強くお勧めします。 developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide >例外は、幅広くは実装されていない C++ の次なる一例です。 >そのため、それらの使用は C++ の移植性を低下させます。 >例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。 例外についての注意勧告がされていますが、では実際にどうするかという 代替案はないということなのか・・?
608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ] >>605 209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton
609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ] 鼻から悪魔という言葉があってな
610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ] >>607 俺はWinCE用のソースとかでは std::auto_ptr<std::exception> を戻り値にしてる。 コンストラクタで失敗したものは fail() で返す。 で、毎回戻り値などのチェック。 パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。
611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ] >>607 VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。 オプションなしの場合C++例外は一切使わない。 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。 /EHa 同期と非同期例外をc++例外としてキャッチする。 で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。 もちろんゼロ除算も。
612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ] >>608 どうもです。 detailsの中にあることにはあるんですね。 とりあえずkろえを使っておきます。
613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ] >>610-611 ありがとうございます。 VC++の場合はわかるのですが、 gccなどでは同じような処理を行えないのでしょうか? メモリの不正アクセスにしろ零除算にしろ、いくらでも 起こりうる例外だと思うのですが、Javaのように 統一的にcatchできないものかと悩んでいます・・・。 実際、至るところで零除算の起こりうる数値解析の ようなシステムを作ったとして、いざシステムを起動 したら零除算で処理が中断したが、どこで起こったかは わからない、なんてことは有り得ないですよね・・?
614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ] gccというよりunix系だとそういうのはsignalではないかな。 ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、 メモリの不正アクセスはデバッグ時に潰すべきもので、 例外でキャッチしてリカバリーをかける類のものじゃない。
615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ] >>585 最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?
616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ] >>594 struct { struct { void* element; } Bclass; } Aclass; よくわからんが、これでやりたいことができたことになるの?
617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ] >>607 どこまでの移植性が必要かで判断すればいい。 Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。
618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ] >>607 mozilla のページ、情報がえらく古いな もっとも古いというだけでは済まされない記述も散見されるが
619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ] >>586 目からうろこがぼろぼろでた気分です。 ありがとうございました。
620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ] shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、 getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。 それぞれのメリット、デメリットがはっきりとわかっていません。 class AAA { private: shared_ptr<BBB> bbbptr; public: AAA() { bbbptr = new BBB; } shared_ptr<BBB> getBBB1() { return bbbptr; } shared_ptr<BBB>& getBBB2() { return bbbptr; } BBB* getBBB3() { return bbbptr; } };