1 名前:デフォルトの名無しさん [2008/02/28(木) 00:01:39 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.49【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1203478421/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
47 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 22:43:40 ] 使わなければいつまで経っても初心者だ。 練習コードなんだから、なんでもやってみればいい。 >>45 OK
48 名前:デフォルトの名無しさん [2008/02/28(木) 23:03:04 ] 上級者もnewやポインタを使わない方がいい 使うのは、速度やサイズの気になる場面だけだ それまで気になるならアセンブラにする
49 名前:デフォルトの名無しさん [2008/02/28(木) 23:04:10 ] 極論するとC言語は使わない方がいい
50 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:19:17 ] 極論するとプログラミングなんかしない方がいい
51 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:47:12 ] 速度が気になるんだったら、newを使うのはいけないと思うんだ。 少なくとも考えなしに使うのは。
52 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 01:12:20 ] boost::Pool
53 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 01:27:58 ] >>51 実測もせずに new を避けるのも良くない。
54 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:16:43 ] 結局のところ重複はこっちでいいんかい?
55 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 06:28:30 ] >>53 は受け売りでしゃべっているだけですから気にしないでください。
56 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:16:31 ] newのなにがいけないのだろうか? 動的にオブジェクトの生成をしたらだめ?
57 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 11:02:47 ] 馬鹿?馬鹿なの?ねえ? あえてだめっていう理由があるとしたらオーバーヘッドだろうか、ログ読んでないからなんともいえないが
58 名前:27 [2008/02/29(金) 11:39:19 ] >>37 ,38,39,41 昨日は急用で落ちてしまいました27です。 >mutableを非staticなメンバーに指定すれば、constメンバー関数内で 変更できるはずだけど。 を実践したところコンパイル通りました! constとかややこしくて触らないようにしてたんですけど これからちょこっと勉強してみようと思います みなさんありがとうございました!!
59 名前:デフォルトの名無しさん [2008/02/29(金) 12:10:15 ] 基本的に動的確保は頻繁にやるべきではない 不安定になる
60 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:16:40 ] >>59 動的確保が悪いんじゃない。正しく扱わないプログラマが悪いんだ。 C++ なら、 new したらすぐ auto_ptr なりに突っ込んどくとか、 new [] したくなったら標準コンテナを使うとか、そういう正しい対処をしとけば ミスもほとんど防げる。 原因も把握せずに「不安定になる」とか言ってプログラムの手段を 制限するのは得策じゃないね。
61 名前:デフォルトの名無しさん [2008/02/29(金) 12:24:44 ] あらかじめ必要な領域を見積もって確保すべき for(n=0;n<100000;n++) str+="A"; などは解放確保を繰り返し良くない
62 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:29:33 ] reserve 使っておけばいいし
63 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:45:50 ] 本業はWEBアプリ屋なんですが、必要に迫られてActiveXの開発することになったC++ド素人です。 環境はVS2008、作ろうとしてるモノはMFC ActiveXです。 内部で文字列の暗号化処理(Blowfish)をしたいのですが、以下のソースを書いてコンパイルも 一応通ったものの、案の定うまく動きません。 LPSTR lpszPassword; //パスワード LPTSTR lpszInputStr;//暗号前文字列 //↑に値を適当にセットした上で↓ UCHAR digest[16]; MD5String(lpszPassword, digest); CBlowFish bf; bf.Initialize(digest, sizeof(digest)); unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr)); // エンコード bf.Encode((unsigned char*)lpszInputStr, outBuf, sizeof(lpszInputStr)); printf("%S", outBuf) よくわからなくて、ググりつつ適当に書いたソースなのでめちゃくちゃだと思います。 最終的には暗号化されたMD5ハッシュ値のような感じの文字列が出力されることを期待 していたのですが、バケバケな上入力値を変えても同じ値が返ってきますw 若干お手上げなので、皆さんのお知恵を拝借ください
64 名前:63 mailto:sage [2008/02/29(金) 13:49:43 ] ちなみに、BlowfishのソースはJim Congerさんが書いたのそのままです。 ↓ここから持ってきました。 www.schneier.com/blowfish-download.html
65 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:56:07 ] waveファイルを再生しようと思い、playsound()というAPIがあるよ、と教えて貰ったので 調べてみたのですが、 VC++2005 #include <mmsystem.h> // PlaySound()のため #pragma comment(lib,"winmm") #define FILENAME "Windows XP Startup.wav" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: //再生 PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); return 0; case WM_RBUTTONDOWN: //停止 PlaySound(NULL,NULL,0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } このようなサンプルを見つけたのでコンパイルしてみたのですが、 error C2065: 'CALLBACK' : 定義されていない識別子です。 error C2065: 'DRIVERPROC' : 定義されていない識別子です。 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません なぜでしょうか?
66 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 13:57:41 ] >>65 #include <windows.h>
67 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:14:23 ] >>66 ありがとうございます。ですが、まだエラーが出てしまいます>< VC++2005 #include <windows.h> #include <mmsystem.h> // PlaySound()のため #pragma comment(lib,"winmm") #define FILENAME "Windows XP Startup.wav" LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_LBUTTONDOWN: //再生 PlaySound(FILENAME,NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); return 0; case WM_RBUTTONDOWN: //停止 PlaySound(NULL,NULL,0); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } error C2664: 'PlaySoundW' : 1 番目の引数を 'const char [23]' から 'LPCWSTR' に変換できません
68 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:17:28 ] #define FILENAME TEXT("Windows XP Startup.wav")
69 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:28:38 ] >>68 ありがとうございます。&重ね重ねすいません。まだ駄目みたいです。 error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。 fatal error LNK1120: 外部参照 1 が未解決です。
70 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:33:19 ] エラーメッセージでぐぐれ
71 名前:デフォルトの名無しさん [2008/02/29(金) 14:33:42 ] #include <windows.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") main(){ PlaySound("C:\\WINDOWS\\system32\\oobe\\images\\clickerx.wav", NULL,SND_FILENAME | SND_ASYNC | SND_LOOP); Sleep(2000); PlaySound(NULL,NULL,0);}
72 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:35:57 ] >>69 main関数がないのに動くわけないだろう
73 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:38:11 ] >>70 int main を追加する方法や システム>サブシステムをwindowにする方法 エントリポイントにMainを追加してみたりは試した上で質問はしました。。><
74 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:49:57 ] VCだよね?mainをこう書いてみたら? int APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmd, int nCmd) { ... } あとWindowProcを呼ばせるにはちゃんとウィンドウを作って、 メッセージ処理しないとだめだと思うぞ。
75 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:59:41 ] >>72 書き終わった直後に気付いて書いてみたのですが根本的な原因は別にあるようでした。 >>74 そうみたいです!。ありがとうございます。 >>71 これに、文字セットをマルチバイトにしてみたところ。うまくいったので、これをベースにして、考えているプログラムにしてみたいと思います。 みなさんお付き合い頂いてありがとうございました。
76 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:06:52 ] >>63 >unsigned char* outBuf = (unsigned char*)malloc(sizeof(lpszInputStr)); 俺unix屋だから windows のこと詳しくないけど lpszInputStr は LPTSTR だからポインタだと思うよ。 上のコードのしていることは文字列の分ではなく ポインタのサイズの分をmallocで確保している。多分4バイトくらい。 まず文字列のバイト数を正しく求めることから始めないといけないんじゃないかな。 size_t size_of_in = sizeof(TCHAR) * (lstrlen(lpszInputStr)+1); // NUL 文字に+1文字分 あと outBuf には暗号化されたバイナリが入るだろうから printf("%S") ではうまく表示されないと思うよ。バイナリで扱わないと。 他にも暗号化単位やバイトオーダーなども問題になるかもしれないよ。
77 名前:63 mailto:sage [2008/02/29(金) 16:02:41 ] >>76 ども、ありがとうございます。 PHPやASPな人間なもんで、厳密な型変換やったことないんでさっぱりです。 バイナリを文字列(1-9,a-z.A-Z)に戻すのは、どうすればいいんでしょうか。
78 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:04:03 ] newってそんなに遅いの?
79 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:08:03 ] その程度のオーバーヘッドも看過できないような状況では十分に「遅い」。
80 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:21:26 ] まぁ、何を作ってるか、によるよね。 趣味でLisp方言作ってたときは、operator new()を工夫しただけで全体の動作が3割速くなったし。
81 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 16:33:06 ] >>79 boost::Poolのほうが断然速かった。
82 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 17:23:19 ] >>78 メモリマネージャ次第じゃね? Windowsに限ってもVCとBCBじゃnewでもメモリ確保の仕方違うし。
83 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 23:15:19 ] newを忌避しすぎるのも意味が無い。「まだ最適化するな」。
84 名前:デフォルトの名無しさん [2008/03/01(土) 01:01:15 ] 初期化方法おしえてください 全部通りません vector<int> x={1,2,3}; vector<int> x(3,{1,2,3}); vector<int> x({1,2,3});
85 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:04:48 ] >>84 static int const initial_x = {1,2,3}; vector<int> x(&initial_x[0], &initial_x[3]);
86 名前:85 mailto:sage [2008/03/01(土) 01:05:36 ] ごめん。 [] が抜けてた。 static int const initial_x[] = {1,2,3};
87 名前:デフォルトの名無しさん [2008/03/01(土) 01:08:49 ] そういうやり方しかないですか・・・そしたらint x[]={1,2,3}ですませます すみません
88 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:16:29 ] #include <boost/assign/std/vector.hpp> ... vector<int> v; v += 3, 1, 4;
89 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:16:34 ] boost::assignとか
90 名前:89 mailto:sage [2008/03/01(土) 01:16:55 ] ごめんリロードしてなかった
91 名前:デフォルトの名無しさん [2008/03/01(土) 01:21:24 ] vectorに関数追加する方法ありませんか? x={1,2,3}の代入を可能にする関数です
92 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:23:37 ] 配列数が8000ぐらいあるものでそれぞれが4つくらいのアイテムを持っている場合、 vectorやらmapやらを使いたいんですが、メモリ消費や処理速度的にどのようにしたらよいでしょうか? ちなみに8000くらいあるほうは歯抜けで番号が記録されていてコール元から頻繁にアイテムを求めてきます。(ユニークキー) 4つくらいのアイテムの方は可変になってしまうのでそれぞれをvectorにしようかと思ったのですが、 消費メモリが大きくなりそうだったので悩んでいます。
93 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:23:45 ] >>91 継承すれば
94 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:24:00 ] ありません
95 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:35:05 ] >>92 「なりそう」で悩む前に素直に実装してみて、実際のメモリ消費量見てから考えるのがいいよ。
96 名前:デフォルトの名無しさん [2008/03/01(土) 01:44:11 ] vec x(10, 10, 10, 0); で初期値0の3次配列を定義できるようにするには、どう書けばいいですか? int 型限定でよいです 4次や5次もしたいです
97 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:45:17 ] >91 無理。C++0x を待て。
98 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:46:56 ] >>95 ありがとうございます。 ちょっと試してみます。 業務で初めてC++使っているので勉強の毎日です。><
99 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:53:25 ] >>96 コンストラクタ多重定義しとけば。
100 名前:デフォルトの名無しさん [2008/03/01(土) 01:56:57 ] このように書けば可変個の引数をとれますが、内部の型が一つに決まってしまって変更できません どうすればいいですか? class vec{ int x; public: vec(int n, ...){} };
101 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:59:21 ] template使え
102 名前:デフォルトの名無しさん [2008/03/01(土) 02:04:43 ] 100次元でもできるようにするためには、テンプレートを再帰的につかうようにすれば いいと思いますがわかりません どう書けばいいですか
103 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:09:53 ] まだこれいたのか
104 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:13:35 ] もう誰も触るなよ。
105 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 03:20:54 ] Cのcursesについてお教ください printw("mojiretsu"); char buf[]="mojiretsu" printw("%s",buf); これで前者が表示され後者が表示されないのは何故なんでしょうか。
106 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 04:17:36 ] >>105 環境くらい書いた方が。 どちらのコードも問題はないと思う。 refreshはしている? 前者が表示されているってことなので大丈夫だとは思うけど。 お試しコードみたいに短いのを書いていて、 printw→refreshのあと、すぐにendwinとかしてたら表示が見えていない可能性あり。
107 名前:105 mailto:sage [2008/03/01(土) 04:36:50 ] OSはクノーピクスのDVD最新ver、コンパイラはgccです。 int main() { initscr(); move(5,1); printw("mojiretsu"); refresh(); char buf[]="mojiretsu"; move(8,1); printw("%s",buf); refresh(); getch(); getchで止まった時に上のmojiretsuは表示されているのに下はされないという状態です。 最初はcygwinでやろうかと頑張ったのですが、cursesライブラリがどうやってもリンクできずクノーピクスを使うに至っています。
108 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 05:28:37 ] >>107 fedoracoreでは特に問題なく二つの行ともに表示された。 そのソースでcursesを使うプログラムとしては特に問題はないと思うけど、 くのーぴくすに入ってるライブラリのバグなのかな…… windows上でなら、cygwinのcursesでもいいと思うけど、 PDcursesを取ってきて自前でライブラリを自分の得意の環境でコンパイルする手もあるよ。 それならリンクのやりかたが分からないとかって問題もないと思う。
109 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 05:31:29 ] printw("mojiretsu");とprintw("%s",buf);の順番が逆の時はどう?
110 名前:105 mailto:sage [2008/03/01(土) 05:57:14 ] 逆にした場合もprintw("mojiretsu");の側しか表示されません。 どうやら環境が問題のようなので108さんが紹介してくださった方法等試してみます。 ありがとうございました。
111 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 06:18:59 ] printwww
112 名前:デフォルトの名無しさん [2008/03/01(土) 09:03:27 ] C++のdeleteについて質問させてください。 環境はWindowsXP VS2005EEです。 newしたポインタをdeleteすると、メモリの中身がfe ee fe eeとなります。 fe ee fe eeという値には何か意味があるのでしょうか?
113 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 10:36:51 ] >>112 メモリ管理の都合やらデバッグの都合やらで値を書き換えているのかも しれない。ともかく、delete後のメモリなんて参照しちゃダメ。ぜった いダメ。
114 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 13:27:17 ] >>113 もちろん、その値を何かに使ったりはしませんが 見るだけでも何かまずいことがおこるんですか?
115 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:00:51 ] ネットからダウンロードしたデータがシフトJISコードの場合char型のに入れると 文字化けしてしまってまともに処理できないんですが、ecuに変換すればいいんでしょうか? できたらやり方かサンプルソース公開してくれてるサイト教えて欲しいです
116 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:05:12 ] 間違えたecuじゃなくてEUC
117 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:23:31 ] GNUのlibiconvでも使えば? GPLイヤンならIBMのICU 窓限定でいいのなら ttp://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=613442&SiteID=7
118 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:42:32 ] >>117 ありがとう。勘違いしてたEUC→SJISに変換だった 自力で関数作ってどうにかできました
119 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 14:43:11 ] >>114 起こらないかもしれないが、起こるかもしれない まだOSにメモリを返してなければ大丈夫かもしれないが、 返しちゃってた場合はアクセス違反で落ちるかも 処理系の実装と運次第
120 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 15:22:17 ] >>114 動作未定義だから鼻から悪魔が出るかもしれんし、HDDが フォーマットされるかもしれない。
121 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 16:32:42 ] VCで定数のアライメントってどうするん? packじゃ出来なかったYO
122 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 16:47:33 ] 定数のアライメント に一致する日本語のページ 約 件中 - 件目 ( 0.201466 秒) 定数のアライメント に該当するページは見つかりませんでした。
123 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:32:52 ] ifとswitchくらいしかまだ使ったことがないのですが、 条件分岐をする際 if を良く使います。ifの中にifその中にif って普通でしょうか?
124 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:48:13 ] 普通
125 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 17:52:33 ] あまり深くすると後で読みづらくなったりする。個人的には5段とか行くと分割を考える。
126 名前:デフォルトの名無しさん [2008/03/01(土) 18:14:46 ] C++で、doubleという名前の関数を作れるでしょうか? void double(int a); とかそんな感じ。今あるソースをみているんですが、コンパイルできなくて、 どうもそこでひっかかってるんじゃないかと。。できないとおもうんですが、 そう言いきってしまっていいですか?
127 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:25:21 ] doubleは予約語だから当然ダメ。Doubleならおk
128 名前:デフォルトの名無しさん [2008/03/01(土) 18:32:13 ] >>127 ありがとうございます。
129 名前:デフォルトの名無しさん [2008/03/01(土) 18:49:02 ] コンパイラや標準ライブラリベンダが使用する識別子について質問です どうやら以下の条件を満たす識別子は使ってはいけないみたいですが 1 _で始まり、大文字が続く名前 2 __(アンダースコア2こ)を含む名前 3 グローバルスコープで _で始まる名前 ケースA int _Hoge;//ダメ(1に抵触) ケースB int __hoge;//ダメ(2,3に抵触) ケースC int hoge__hige;//ダメ(2に抵触) ケースD int _hoge;//ダメ(3に抵触) ケースE namespace foo{ _hoge;} //これはok? ケースF class Hage{ int _hoge;} //これはok? ケースEとFが合法なのかどうかわかりません この辺を指摘(警告とか)してくれるコンパイラとかないんですかね
130 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 18:54:36 ] ないでしょうね、なにろ標準ライブラリが使っているわけですから・・・ しかし、初めてみたなそのルール。 _ __ が最初につく名前は駄目だというのは知ってたけど。 129 ルールでは E F は合法っぽいけどね自分の知っているルールでは非合法だ。
131 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:06:45 ] >>129 _ に小文字が続く識別子に関しては、 グローバルネームスペースでのみしか禁止されていない。 でも、マクロでは禁止されてた気がする。
132 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:20:17 ] マクロはnamespace関係ないからな。
133 名前:デフォルトの名無しさん [2008/03/01(土) 19:44:45 ] __FILE__や__LINE__ってどのファイルに定義してあるのでしょうか??
134 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:49:30 ] 大抵は字句解析器が置換する。
135 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:50:50 ] tryブロックでthrowされた例外がcatchされてcatch内で例外処理が成された後、 正常系はどこから復帰になるのでしょうか?
136 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:52:05 ] 最後のcatch節の下
137 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 19:53:51 ] 復帰しないよ?そのまま続く。 try{ A; //例外発生 B; }catch( exception &e ){ C; //例外処理 } D; なら、正常は:A, B, D。 Aで例外時は:A, C, D。 もちろん、Cで例外が発生したり、throwしたりしたら別だけど。
138 名前:デフォルトの名無しさん [2008/03/01(土) 19:58:13 ] Win32APIのWindowsアプリケーション開発環境を作るためにPlatform SDKを インストールしたのですが、corewin_express.vspropsのデータの修正が出来 なくて困っています。 どうしたら、修正する事が出来るようになるのでしょうか? ちなみに、OSはvistです。
139 名前:デフォルトの名無しさん [2008/03/01(土) 20:01:49 ] visual stdio2008のexpressいれとけ
140 名前:デフォルトの名無しさん [2008/03/01(土) 20:13:48 ] >>134 ありがとうございます。
141 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:34:52 ] >>136-137 ありがとうございます tryブロックの範囲の選定も気をつけないといけないようですね またまた質問なんですが std::exceptionを継承してMyExceptionクラスを作ってそこに、例外発生時のログ取り機能を追加しました 不正な引数を取ってしまったときinvalid_argumentのような例外クラスを投げたいのですが 多重継承は色々ややこしいのでMyExceptionから派生させて相当の自作クラスを投げる やっぱりMyExceptionとinvalid_argumentの多重継承を行う どちらがよいのでしょうか?
142 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:39:40 ] ログ取り機能を例外クラスから分離した方がいいと思う。
143 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 20:41:52 ] MyExceptionからログ鳥部分を分離して、派生のない ExceptionLogクラスを作り、std::invalid_argumentと 派生した例外を投げる、みたいな。
144 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:02:07 ] >>142-143 必要な標準例外クラスから派生したmy標準例外クラスを作って そのクラスにログ取り機能クラスを保有させたほうがいい ということですよね? そのほうが系統だった例外クラスの構造になるのでしょうか?
145 名前:138 [2008/03/01(土) 22:11:41 ] 2005で作りたいのですが、いい方法はありませんか? どこかの設定をいじると書き込み可能になったりとかないんでしょうか・・・。
146 名前:デフォルトの名無しさん [2008/03/01(土) 22:12:05 ] 1クラスに2つ以上の機能を入れるのは一般によくないとされている
147 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 22:23:16 ] とりあえずロガークラスを作るのは確定としても、 以降をどう実装するかは結構悩みどころだな。 個人的には throw をマクロ LOG_THROW みたいなので置き換えて、 その中で例外を投げる前にログを取るようにするのがいいと思う。 マクロは使わずに済むなら使わないのが一番いいんだけど、 デバッグ時に __FILE__, __LINE__ を利用したり、 文字列化演算子を使って移植性の高い方法でクラス名を表示したりできるから、 ログ取りには便利だと思う。