- 1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
- 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; } };
- 621 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ]
- 状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。
- 622 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:00:22 ]
- #include <stdio.h>
int main(void) { float f; for(f=1.0; (int) f<=5; f=f + 0.1) printf("%f \n", f); return 0; } このプログラム実行したら 2.600000 2.700000 2.799999 2.899999 2.999999 3.099999 3.199999 3.299999 3.399999 3.499999 と2.7から普通に計算できなくなりました 2.700000 2.800000 2.900000 と計算するようにしたいのですがどればいいですか?
- 623 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ]
- >>622
float -> double もしくは 二進化十進表現でgoogle
- 624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ]
- >>623
できました>< floatって精度かなり悪いみたいですね・・・
- 625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ]
- >>622
つうか思いっきりC言語じゃね?
- 626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ]
- Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか? できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?
- 627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ]
- マングリング
extern "C"
- 628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ]
- >>626
#ifdef __cplusplus #error C++ is not supported #endif とか書かれてるなら諦めるしかないだろ。
- 629 名前:デフォルトの名無しさん [2008/07/03(木) 17:52:58 ]
- 誰か教えてください。。。
現在プログラムでマウスクリックをさせるものを作っていて、 ボタンのクリックなどはできるようになったのですが、 タブ(TabControl)の切り替えができません。 だれかご存知の方がいましたらご教授いただけると助かります。。 以下プログラム抜粋---------------------------------- POINT pt = {任意の座標X , 任意の座標Y}; HWND hWnd = ::WindowFormPoint(pt.x , pt.y); // マウスを任意の位置に移動 SetCursorPos(pt.x , pt.y); // クリック (Down -> UP) ::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y)); ::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y)); よろしくお願いします。
- 630 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ]
- スレ違い、Win32APIスレで聞いたら
- 631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ]
- >>620
BB1は安全。戻り値最適化が期待できるので速度も十分 BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。 BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。
- 632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ]
- BBB2も代入できるだろ
- 633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ]
- C99では
if (...) statement...; else statement...; などのstatementがそれぞれ{}で囲まれたように扱われるようですが これはC++から来たものなのですか?
- 634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ]
- 元から (C89から) そうでは?
- 635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ]
- C99よく知らないんだけど、
囲まれたように扱われる場合と 囲まれたように扱われない場合って何が違うの?
- 636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ]
- 変数のスコープのこといってるんじゃね?
- 637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ]
- >>636
そもそも{}で囲まないと変数は定義できないだろう。
- 638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ]
- もともとif文の構文は
if (expr) statement [ else statement ] expr ; の形の単文はstatementだから{}で囲む必要は無い 複文はstatementではないから、{}で囲んでstatementにしなければならない そんだけのことだ C99とかは関係ないだろ
- 639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ]
- seclan.dll.jp/c99d/c99d07.htm#dt19991108
「選択文と反復文のブロック化」のことだな。 C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。 そこではこういう例が載せられている。 if (x) int i; このルールによって、if文を抜けたらiはもう使えないという具合。 >>637 C++だと、ブロック内の宣言は文だから、できるんだなこれが。 C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。
- 640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ]
- >>639
そんなVC6の時代の知識で語られても。
- 641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ]
- VC6でお世話になったマクロの意味がわかる
#define for if (0); else for
- 642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ]
- #define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが
- 643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ]
- >>642
それは生兵法というもの
- 644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ]
- #define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね
- 645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ]
- >>642
OpenSSL脂肪wwwwwwwww
- 646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ]
- あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる
- 647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ]
- >>646のコードはメンテしたくない。
- 648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ]
- 同じく
- 649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ]
- hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。 後で#undefで即死されるのは同じだが。
- 650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ]
- while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです
- 651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ]
- while(1)をやめる
- 652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ]
- whileの代わりにgotoをつかえばいい
- 653 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:26:15 ]
- >>650
フラグかgotoのどちらかを選ぶんだ。
- 654 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:29:06 ]
- >>650
そのwhileブロックは、breakをreturnに変えて 何らかの意味のある名前を付けられるくらいの処理ではありませんか?
- 655 名前:650 mailto:sage [2008/07/08(火) 00:40:53 ]
- whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい
- 656 名前:650 mailto:sage [2008/07/08(火) 00:42:49 ]
- ということに気づき自己解決しました。
レスありがとうございました (うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)
- 657 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 05:41:19 ]
- あくまで自己解決と言い張るならもう質問すんなよ
- 658 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:09:44 ]
- 何怒ってんだよw
- 659 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 06:25:05 ]
- 657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う
- 660 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:38:38 ]
- >>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw
- 661 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 09:56:40 ]
- 時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと
- 662 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:15:01 ]
- 自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、 もうちょっと心に余裕を持った方が良いかと。
- 663 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:20:05 ]
- 良いなぁこの馬鹿をかばう気持ち悪い空気
- 664 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:23:10 ]
- 相当頭に来てる御様子ですね。
- 665 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:27:14 ]
- 自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw
- 666 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:35:03 ]
- >>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。 なるほどね。
- 667 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:46:23 ]
- >>666
>>662の後に>>663なら、普通は 「>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう? そこでこう書けばというのは、それこそ馬鹿丸(ry
- 668 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 11:48:25 ]
- もう質問者にとって、このスレは用済みだからこねえよ
- 669 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:42:48 ]
- >>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。 なるほどね。
- 670 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:49:02 ]
- オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。
- 671 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 12:50:18 ]
- >>669
それは自虐ギャグですか?
- 672 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:19:05 ]
- unique_ptrって本当にC++0xに入ってくれるんだろうか
- 673 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 16:47:35 ]
- ばかばっか
- 674 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:18:49 ]
- >>673
お前がな
- 675 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:26:45 ]
- >>674
オマエモナー
- 676 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 17:27:46 ]
- いってよし?
- 677 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 18:06:30 ]
- 逝ってよし
- 678 名前:デフォルトの名無しさん [2008/07/08(火) 22:11:51 ]
- >>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ
- 679 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:13:35 ]
- gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。
- 680 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 22:38:18 ]
- 初心者スレと分けてる意味が無いように思う
- 681 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:06 ]
- 初心者スレってVC++しかなくね?
- 682 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:33:08 ]
- newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar); この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが 動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか? イメージ的には↓のようなことをしたいです Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };
- 683 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:08 ]
- 出来ません
- 684 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 00:37:54 ]
- >>683
ありがとうございます
- 685 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 07:03:55 ]
- 一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意
- 686 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 12:38:32 ]
- まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?
- 687 名前:デフォルトの名無しさん [2008/07/09(水) 12:41:11 ]
- 引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。
- 688 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:09:17 ]
- VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・
- 689 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:18:31 ]
- 2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・
- 690 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 19:56:05 ]
- >>688
それってダメなんじゃないの?
- 691 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 20:48:29 ]
- >>682
vectorじゃだめなのかい?
- 692 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 06:15:03 ]
- 最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?
- 693 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 07:29:57 ]
- C99はまだスルーされてる
- 694 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:04:51 ]
- まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度
- 695 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 11:05:45 ]
- C99なんて有ったの… とか
- 696 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 12:30:01 ]
- 対応させるメリットないしな
- 697 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 14:39:59 ]
- 一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや
- 698 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:25:18 ]
- たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。 Variable-length arrayなんて、いまどき誰が使うんだ。
- 699 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 15:51:39 ]
- C++があるからねえ・・・
- 700 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 16:16:02 ]
- gccでは可変長配列に対応してたりするけどな
- 701 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:36:42 ]
- C99欲しい人は何が目当てなの?
- 702 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 17:39:47 ]
- >>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。
- 703 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:04:05 ]
- >歴史的経緯でalloca()が実装されてない
どこのはなし?
- 704 名前:デフォルトの名無しさん mailto:sage [2008/07/10(木) 18:53:10 ]
- stdint.hが欲しいんだ。
|

|