1 名前:v(^・^)v [2007/09/26(水) 03:41:13 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ(実質 part57) C++相談室 part56 pc11.2ch.net/test/read.cgi/tech/1185377587/
2 名前:v(^・^)v mailto:sage [2007/09/26(水) 03:41:45 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq-lite/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] www.cppreference.com/ (英語) www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない) [禿 Stroustrup] public.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?&RKKNP_vJISJISNO=X3014 ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3 名前:v(^・^)v mailto:sage [2007/09/26(水) 03:42:22 ] ■Books■ amazon.com C, C++関連書籍 www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/ The C++ Programming Language ttp://www.amazon.com/exec/obidos/ASIN/0201700735/ ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳) C++ Primer (3rd Edition) ttp://www.amazon.com/exec/obidos/ASIN/0201824701/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳) The C++ Standard Library ttp://www.amazon.com/exec/obidos/ASIN/0201379260/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳) Effective C++ ttp://www.amazon.com/exec/obidos/ASIN/0201924889/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳) More Effective C++ ttp://www.amazon.com/exec/obidos/ASIN/020163371X/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳) Exceptional C++ ttp://www.amazon.com/exec/obidos/ASIN/0201615622/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳) More Exceptional C++ ttp://www.amazon.com/exec/obidos/ASIN/020170434X/ Exceptional C++ Style ttp://www.amazon.com/exec/obidos/ASIN/0201760428/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳) C++ Coding Standards ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/ ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)
4 名前:v(^・^)v mailto:sage [2007/09/26(水) 03:42:53 ] ■Books(Templateまわり)■ Effective STL www.amazon.com/exec/obidos/ASIN/0201749629/ www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳) Modern C++ Design www.amazon.com/exec/obidos/ASIN/0201704315/ www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳) C++ Templates www.amazon.com/exec/obidos/ASIN/0201734842/ C++ Template Metaprogramming www.amazon.com/exec/obidos/ASIN/0321227255/
5 名前:v(^・^)v mailto:sage [2007/09/26(水) 03:44:42 ] ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache STDCXX incubator.apache.org/stdcxx/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) www005.upp.so-net.ne.jp/episteme/html/stlprog/ (日本語) www.wakhok.ac.jp/~sumi/stl/ [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
6 名前:v(^・^)v mailto:sage [2007/09/26(水) 03:45:13 ] 1 ttp://piza.2ch.net/tech/kako/980/980175292.html 2 ttp://pc.2ch.net/tech/kako/996/996640937.html 3 ttp://pc.2ch.net/tech/kako/1003/10038/1003832761.html 4 ttp://pc.2ch.net/tech/kako/1009/10090/1009071535.html 5 ttp://pc.2ch.net/tech/kako/1014/10142/1014217496.html 6 ttp://pc.2ch.net/tech/kako/1018/10184/1018454705.html 7 ttp://pc.2ch.net/tech/kako/1021/10217/1021787032.html 8 ttp://pc3.2ch.net/tech/kako/1025/10250/1025010364.html 9 ttp://pc3.2ch.net/tech/kako/1027/10273/1027347982.html 10 ttp://pc3.2ch.net/tech/kako/1029/10293/1029315669.html 11 ttp://pc3.2ch.net/tech/kako/1032/10323/1032345774.html 12 ttp://pc3.2ch.net/tech/kako/1035/10350/1035005882.html 13 ttp://pc3.2ch.net/tech/kako/1038/10380/1038031395.html 14 ttp://pc5.2ch.net/tech/kako/1041/10413/1041328679.html 15 ttp://pc5.2ch.net/tech/kako/1043/10436/1043605481.html 16 ttp://pc5.2ch.net/tech/kako/1045/10457/1045746245.html 17 ttp://pc5.2ch.net/tech/kako/1047/10475/1047560042.html 18 ttp://pc5.2ch.net/tech/kako/1050/10501/1050177746.html 19 ttp://pc5.2ch.net/tech/kako/1052/10526/1052625846.html 20 ttp://pc5.2ch.net/tech/kako/1055/10551/1055162298.html 21 ttp://pc5.2ch.net/tech/kako/1057/10575/1057580107.html 22 ttp://pc5.2ch.net/tech/kako/1060/10603/1060361082.html 23 ttp://pc5.2ch.net/tech/kako/1062/10626/1062690663.html 24 ttp://pc5.2ch.net/tech/kako/1066/10665/1066546387.html 25 ttp://pc5.2ch.net/tech/kako/1067/10679/1067949669.html 26 ttp://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子) 27 ttp://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子) 28 ttp://pc5.2ch.net/test/read.cgi/tech/1077985164/ 29 ttp://pc5.2ch.net/test/read.cgi/tech/1082047479/ 30 ttp://pc5.2ch.net/test/read.cgi/tech/1084030770/
7 名前:デフォルトの名無しさん mailto:age [2007/09/26(水) 03:57:30 ] _____ (すた☆らき)  ̄ ̄\| ̄ www.freewebs.com/premiumtv/?X3/?STV=%E3%82%89%E3%81%8D+%E3%81%99%E3%81%9F
8 名前:v(^・^)v mailto:sage [2007/09/26(水) 04:08:11 ] 31 ttp://pc5.2ch.net/test/read.cgi/tech/1086185282/ 32 ttp://pc5.2ch.net/test/read.cgi/tech/1088236078/ 33 ttp://pc5.2ch.net/test/read.cgi/tech/1090180012/ 34 ttp://pc5.2ch.net/test/read.cgi/tech/1092018643/ 35 ttp://pc5.2ch.net/test/read.cgi/tech/1093958200/ 36 ttp://pc5.2ch.net/test/read.cgi/tech/1096304546/ 37 ttp://pc5.2ch.net/test/read.cgi/tech/1098543578/ 38 ttp://pc5.2ch.net/test/read.cgi/tech/1101473340/ 39 ttp://pc5.2ch.net/test/read.cgi/tech/1106466303/ 39(実質40) ttp://pc8.2ch.net/test/read.cgi/tech/1106527792/ 40(実質41) ttp://pc8.2ch.net/test/read.cgi/tech/1113408957/ 41(実質42) ttp://pc8.2ch.net/test/read.cgi/tech/1120190961/ 43 ttp://pc8.2ch.net/test/read.cgi/tech/1124113879/ 44 ttp://pc8.2ch.net/test/read.cgi/tech/1128512737/ 45 ttp://pc8.2ch.net/test/read.cgi/tech/1133007604/ 46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/ 47 ttp://pc8.2ch.net/test/read.cgi/tech/1139931895/ 48 ttp://pc8.2ch.net/test/read.cgi/tech/1142423595/ 49 ttp://pc8.2ch.net/test/read.cgi/tech/1146185570/ 50 ttp://pc8.2ch.net/test/read.cgi/tech/1149427282/ 51 ttp://pc8.2ch.net/test/read.cgi/tech/1153079297/ 52 ttp://pc8.2ch.net/test/read.cgi/tech/1156525695/ 53 ttp://pc11.2ch.net/test/read.cgi/tech/1159340181/ 54 ttp://pc11.2ch.net/test/read.cgi/tech/1162215248/ 55 ttp://pc11.2ch.net/test/read.cgi/tech/1164951094/ 56 ttp://pc11.2ch.net/test/read.cgi/tech/1170343752/ 56 (実質57) ttp://pc11.2ch.net/test/read.cgi/tech/1170343752/
9 名前:v(^・^)v mailto:sage [2007/09/26(水) 04:08:43 ] ■関連スレ■ 多すぎ。とりあえずスレタイ C++ で検索して。 以下、スレタイで見付からなさそうな関連スレ。 Boostを語れゴラァ part4 pc11.2ch.net/test/read.cgi/tech/1175663346/l50 GCCについて part7 pc11.2ch.net/test/read.cgi/tech/1145357824/l50 Cygwin + MinGW + GCC 相談室 Part 3 pc11.2ch.net/test/read.cgi/tech/1177944767/l50
10 名前:v(^・^)v mailto:sage [2007/09/26(水) 04:10:15 ] テンプレ終了。 ISO のリンクが "301 Moved permanently" だったんで更新しといた。
11 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 04:38:06 ] ぉぉ。すごい。乙です。
12 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 04:38:46 ] 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
13 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 07:30:25 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
14 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 07:31:09 ] C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
15 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 10:56:04 ] やっぱり貼られるんだなこれ
16 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:17:02 ] 地鎮祭が済んだな乙
17 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 11:35:06 ] そこまでがテンプレだからな。
18 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:00:46 ] stlとかboost使いまくったら通常は1M程度で住むものが 10M超えたりするんでしょうか?
19 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:07:37 ] 「通常」の定義がわからん
20 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:15:08 ] それでは、よくある「クラスと継承が使えるbetter Cとして書いたC++のコード」を「通常」だと想定して答えて下さい 今作ってるものがboostをヴァリヴァリに使っているので それと比較すればどれぐらいバイナリサイズは肥大するのかがちょっと気になります
21 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:25:32 ] バイナリサイズよりコンパイル時間の肥大が気になる。
22 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:28:21 ] 通常、増える場合と減る場合、そして変わらない場合があります。
23 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 12:33:21 ] 全スレ >827 名前:デフォルトの名無しさん 投稿日:2007/09/22(土) 23:20:47 >emacsでc++開発をするときの環境に関するサイトってないでしょうか? flymake d.hatena.ne.jp/pyopyopyo/20070715/p1
24 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 19:15:43 ] >>22 何そのトートロジー
25 名前:デフォルトの名無しさん [2007/09/26(水) 20:27:10 ] int data[10] ={10,20,30,40,50,60,70,80,-999} このようなint配列があります 配列の内容を実行結果のように表示するプログラムを作りなさい -999になれば処理を終了します ポインタを固定して表示させる処理とポインタを変化させて表示させる処理の2つ作成しなさい この内容がわからないので教えて下さいお願い致します
26 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 20:31:33 ] なんだマルチか
27 名前:デフォルトの名無しさん mailto:sage [2007/09/26(水) 21:52:11 ] スレ建て乙
28 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 00:22:22 ] >>1 おつかれ >>10 GJ! 有用なサイトを手っ取り早く見つける方法... それはテンプレを見ることだ。
29 名前:デフォルトの名無しさん [2007/09/27(木) 00:22:33 ] int *p = data; int i = 0; while(*p++ != 999) std::cout << *p << std::endl; while(*(p + i) != 999) std::cout << *(p + i) << std::endl;
30 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 01:55:53 ] 999ではなく-999 2つ目のループ前にpを初期化しないといけない
31 名前:デフォルトの名無しさん [2007/09/27(木) 09:48:49 ] C++で書かれた、正規表現処理クラスみたいなものってありませんか?
32 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 10:00:16 ] boost/random.hpp
33 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 10:00:50 ] ミスった。 boost/regex.hpp
34 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 10:25:06 ] !?
35 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 10:57:19 ] double a[3000][3000]; て定義すると蹴られるんだけど、なんでかわかる人いますか?
36 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 11:09:59 ] 環境は?
37 名前:デフォルトの名無しさん [2007/09/27(木) 11:14:19 ] VC6のSDKでウィンドウを持ったクラスの継承がしたいです。 Hoge1クラス:メインウィンドウになるクラス Hoge2クラス:継承元となるウィンドウを持ったクラス Hoge3クラス:Hoge2クラスを継承したクラスでHoge1ウィンドウのボタンを押したときに表示されるウィンドウを持ったクラス Hoge2クラスはWinProcをstaticでクラス内に入れています。クラスの登録やウィンドウを生成する関数はprivateとして存在します。 Hoge3クラスも同じような構成です。 で、Hoge3クラスで不用なメッセージ処理はHoge2のウィンドウクラスに回してやりたいのですが、 その方法がいまいちわかりません。手順・・がいまいちです。 Hoge3クラスの登録をする前に、Hoge2クラスのウィンドウを登録する必要があると思い、 WNDCLASSEXを使ってウィンドウの登録をする?と思いきや、横取りするHoge2にあるプロシージャとかも指定しないといけないわけですよね? でもこの段階だと、Hoge2クラスの存在すら誰も知らないわけで・・・この辺りがよくわかりません。 ボタンのスーパークラス化と同じようなイメージでいるのですが、ボタンの場合は ウィンドウズが予めその存在を認識しているからGetClassInfoExを使って情報を取得する ことができますが、自作ウィンドウクラスの場合はそれができなくて・・・
38 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 11:16:33 ] >>35 俺のエスパー能力が、環境がx86なPCであると言っている。 さらに、かなりの確率でWindowsであると言っている。 さらに、俺のエスパー能力はこう言っている。 コンパイラ「スタック足りねーよボケッ!」 ttp://www.google.com/search?&q=8+*+3000+*+3000+byte
39 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:15:58 ] >>35 配列が大きすぎてスタック領域が足りてない。と思われる。 巨大な配列を宣言するときは new するか static にするべき
40 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:28:43 ] 俺の環境ではgcc 3.4やvc2005でも文句言われないんだけど… そのかわり実行時にスタックオーバーフロー そういうオプションでもあるの?
41 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:34:20 ] >>35 誰に蹴られるって?
42 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 12:38:23 ] >>41 金色のファルコ
43 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 21:58:29 ] >>39 必要ないのに無駄にnewなんか使うなよ。 どうしてもSTLは使いこなせないってことなら話は別だが。
44 名前:デフォルトの名無しさん mailto:sage [2007/09/27(木) 21:59:28 ] >>37 1. 静的メンバ関数となっているHoge2のウィンドウプロシージャから 仮想関数にしたウィンドウプロシージャを呼ぶようにして、 Hoge3でそれをオーバーライドする。 Hoge3では新たなウィンドウクラスを登録しない。 2. Hoge2のWinProcをprotectedにして、Hoge3のウィンドウプロシージャでは、 DefWindowProcの代わりにHoge2::WinProcを呼ぶようにする。 Hoge3では新たなウィンドウクラスを登録する必要がある。 俺は1をよくやる。2こそはスーパークラス化だな。 ウィンドウプロシージャの仮想関数化はここが参考になる。 techtips.belution.com/ja/vc/0009/ www.google.com/search?q=cache:http://techtips.belution.com/ja/vc/0009/
45 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:17:35 ] >>43 スタックじゃサイズ足らないって理由だけでnewすんのもSTL使うのも大差ないだろ
46 名前:37 [2007/09/28(金) 01:30:59 ] >>44 そこは何度も見てるのですが・・・。そこに書いてあるクラスは、 それを継承させると簡単にサブクラス化できたり元に戻せたりする クラスってことですよね?
47 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 02:05:57 ] >>37 >で、Hoge3クラスで不用なメッセージ処理はHoge2のウィンドウクラスに回してやりたいのですが、 >その方法がいまいちわかりません。手順・・がいまいちです。 Hoge3 クラスは Hoge2 クラスを継承してるんだから、ただ単に継承元クラスのメンバ関数を呼ぶだけでいいのでは ムダに難しいこと考えてない? Windows に登録するウィンドウクラスと C++ のクラスが一致してる必要はないよ C++ のクラスを継承してるからってウィンドウクラスをスーパークラス化したりサブクラス化したりする必要はない
48 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 07:38:08 ] インナークラスっておまいら普通に使ってる?
49 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 08:10:15 ] pimplの形でなら使ってるよ
50 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 09:32:02 ] >>45 大差なくはない。vector使え。 例外安全な上に組込配列よりずっと便利だ。
51 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 10:11:22 ] 2 4 16 256 65536 4294967296 * sizeof(double) = 8589934592b = 8192MB
52 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 10:15:48 ] そこまでいったら流石にメモリマップドファイル使う
53 名前:37 [2007/09/28(金) 10:45:46 ] >>47 「ウィンドウ作成データとして、CWinBase クラスの派生クラス CxxxWnd オブジェクトを指定することを忘れないで下さい。」 が、何を指しているのかわからないです。どこにCxxxWnd オブジェクトを指定するのでしょう?
54 名前:37 [2007/09/28(金) 10:50:39 ] WNDCLASSEXを登録するとき、サンプルではBaseWnd::WindowMapProcを指定 しろとあるけど、指定するものを自分自身のWinProcを指定してやり Attachを呼べばいいのかな?
55 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:00:24 ] >>53 それは、CreateWindowExの最後の引数。 CxxxWnd wnd; CreateWindowEx(..., &wnd); こういう感じ。CreateWindow(Ex)の引数は WM_CREATEまたはWM_NCCRAETEでCRATESTRUCTとして全て参照できる。 いつもこうしなければならないだから、 CreateWindowExもクラスのメンバにしてこの処理はしばしば隠蔽される。 そろそろスレ違いが近付いているぞ。
56 名前:37 [2007/09/28(金) 11:29:40 ] >>55 今そこ調べてました・・・ ttp://nomina.petit-archives.mydns.jp/tests/old/gecko012/nmnConsoleControl.cpp ttp://www7a.biglobe.ne.jp/~lshen/EternalWindows/WinBase/Window/Window08.html >>そろそろスレ違いが近付いているぞ。 もうすこし付き合ってください・・ その最後の引数に&wndを渡して自身のメンバ変数や関数にアクセス する場合、が微妙です。 WM_CREATEで LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam というところはOKです。ここから自分のメンバにアクセスする方法が いまいちです。
57 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:33:18 ] 死ね
58 名前:37 [2007/09/28(金) 11:33:38 ] static Hoge3* pWnd = NULL; pWnd = (Hoge3*)(((CREATESTRUCT*)lp)->lpCreateParams); こんな感じか?な?
59 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:36:24 ] CxxxWnd *wnd = (CxxxWnd*)lpcs->lpCreateParams;
60 名前:37 [2007/09/28(金) 11:37:44 ] >>55 できますた。ありがとうございます! あとは54なんですが・・・これがまた・・・orz
61 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:38:16 ] 死ね
62 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 11:42:22 ] >>60 Win32API質問箱 Build57 pc11.2ch.net/test/read.cgi/tech/1189255282/
63 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:11:35 ] >>58 そこでstaticはやめとけ。 >>60 Hoge2::WinProcに相当するのが、44の指したページで言うCWndBase::WindowMapProc。
64 名前:37 [2007/09/28(金) 12:38:27 ] class Hoge:public CWndBase public: BOOL InitInstance( HINSTANCE hInstance ); private: //オーバーライドしたWndProc static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); }; 使うとき、 Hoge hoge; hoge.InitInstance(hInstance); InitInstanceの中ではウィンドウの登録、作成をする WNDCLASSEX wcex; : wcex.lpfnWndProc = (WNDPROC)BaseWnd::WindowMapProc;//WndProc; : RegisterClassEx(&wcex); で、CreateWindowする。最後の引数はthisを渡す。 こうすると、メッセージは、まずWindowMapProcで処理されて、 BaseWndのWndProcへ飛んできます。が、オーバーライドした自分のWndProcには飛んでこない です。CreateWindow後のAttachとか呼んでみたのですが、変わらずです。 なんか、おしい気がするのですが、ぜんぜんですかね?
65 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:43:20 ] なぜ static が付いてる? それでオーバーライドになってると思ってるのか?
66 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:48:32 ] >>64 44のページを良く見ろ。 WindowMapProcはstaticで、WndProcはvirtualだ。 静的メンバ関数で多態的なオーバーライドは不可能だ。
67 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 12:49:18 ] お前らの優しさに嫉妬
68 名前:37 [2007/09/28(金) 13:29:59 ] あ、static付いてる。コールバックはstatic付けることで解決、なんての ばかり気にしてたので、普通につけちゃいました。 で、取ったらコンパイラ エラー C2555が出て、「そんなの聞いてませんが何か?」 とか思いつつ、調べること数分、どうにかメッセージを受信するとこまで できたようです。 今は、慣れてないのにいろんなことやってしまった(気でいる)ので、 これから1つ1つ整理して、ちゃんとしたものを作っていきます。 みなさまありがとうございました。
69 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:22:21 ] やれやれ ┐(´ー`)┌
70 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 14:33:43 ] でさ、なんでこの話題がC++スレで?
71 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 15:26:42 ] 相手する低脳がいるから
72 名前:デフォルトの名無しさん [2007/09/29(土) 08:31:08 ] class A{ int a[10]; public: }
73 名前:デフォルトの名無しさん [2007/09/29(土) 08:34:44 ] 途中で書いてしまいました失礼しました class A{ int a[10]; public: int *get_a(){return a;} } int main(){ int *p; p = get_a(); for(int i = 0; i < 10; i++){ p[i] = ... ... = p[i]; } return 0; } このようなコードってカプセル化を壊してますか?
74 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 08:40:45 ] >>73 うん。少し。
75 名前:73 [2007/09/29(土) 08:45:15 ] やはり配列のポインタを返すというのはまずいのでしょうか?
76 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 08:48:46 ] >>75 うん。少し。
77 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 10:23:23 ] >>78 うん。少し。
78 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 12:03:52 ] やはり>>77 さんは早漏なのでしょうか?
79 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 12:37:28 ] 早漏は経験をつめば治ります。めげずに頑張りましょう。
80 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 17:31:27 ] こんな感じにしちゃえば? int get_a( int i ){return a[i];}
81 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:08:11 ] 代入は?
82 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:12:06 ] >>81 int& get_a(int i) { return a[i]; } int get_a(int i) const { return a[i]; }
83 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:22:13 ] effective C++読めよー。
84 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 21:44:16 ] っていうか言語以前の問題だろ。 っっていうか全部ネタだろ。
85 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:56:29 ] なんで誰も内部ハンドルを返すのは云々って言ってあげないのか
86 名前:デフォルトの名無しさん mailto:sage [2007/09/29(土) 23:58:29 ] >>85 流れ嫁よ
87 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:55:39 ] hoge.hの中で class hoge { public: virtual double CalcF1(Double_t r) const throw(std::exception); } hoge.cxxの中で double hoge::CalcdF1dr(Double_t r) const throw(std::exception) { } としてるんだけど、g++でcompileしようとすると src/hoge.cxx: In member function 'virtual double hoge::CalcdF1dr(Double_t) const': src/hoge.cxx:87: error: expected primary-expression before ';' token と怒られます。どこが書き方間違ってるんでしょうか。
88 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:56:33 ] あ、ごめん。 class hoge { public: virtual double CalcdF1dr(Double_t r) const throw(std::exception); } でした。
89 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 08:57:57 ] あ、ごめん。勘違い。 スルーして下さい。
90 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 18:33:43 ] VC2003で作られた 静的なlibは、 VC2005でリンクすることは不可能なんですか?
91 名前:デフォルトの名無しさん [2007/09/30(日) 20:19:13 ] クラスの内側で定義したクラステンプレートを特殊化する、 class X { template<typename T> class Y {}; template<> class Y<int> {}; }; のようなコードは、VC++(2003/2005)ではコンパイルできますが、g++3/4では error: explicit specialization in non-namespace scope ‘class X’ というエラー になってしまいます。 Y<int>をXの中ではなく、名前空間スコープで template<> class X::Y<int> {}; と書けばg++でもVC++でも問題なく特殊化できることは知っているのですが、 なんとかg++で、特殊化されたクラスの定義をXの中に書く方法はないでしょうか? Y<T>とY<int>の定義が離れた場所にあると、コードが読みにくいと思うのです。 boost(特にmpl)の使用は歓迎です。 よろしくおねがいします。
92 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:27:59 ] >>89 クラス末尾にセミコロンがありませんでした。ごめんなさい。 とちゃんと書こうYO!
93 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:42:48 ] >>91 定義位置を近づけたいなら、両方クラス外に書けばいいんじゃね?
94 名前:91 [2007/09/30(日) 20:45:33 ] >>93 ああ、たしかにそうですね。他に案がなければそうしたいとおもいます。 ただ、Y<T>とY<int>を両方クラス内に書けると、宣言と定義の位置も離れない(定義だけになる)ので、 より読みやすいと思っています。 というわけで、引き続きお願いします。
95 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 20:54:22 ] >>91 規格ではネストされたクラス内での明示的特殊化は禁止されているけど 部分特殊化はOKなので、 class X { template <typename T, class U = void> class Y {}; template <typename T> class Y< T , typename boost::enable_if< typename boost::is_same< T, int> > > {}; }; のようにenable_ifとis_sameを使って書くといいっぽい(初心者スレから一部拝借w) VCでコンパイル可能なのはmsの独自拡張でgccの方が正しいとのこと
96 名前:91 [2007/09/30(日) 20:57:38 ] なお、メンバ関数テンプレートで同様のエラーをくらう件については (下記の2行めがエラーになる)、 class X { template<typename T> void foo(T x) {} template<> void foo<int>(int x) {} // error }; 下記方法でごまかしています。 #include <boost/type.hpp> class X { void foo_(int x, boost::type<int>) { /* specialized */ } template<typename T> void foo_(T x, ...) {} public: template<typename T> void foo(T x) { foo_(x, boost::type<T>()) ;} };
97 名前:91 mailto:sage [2007/09/30(日) 20:59:12 ] >>95 部分特殊化はOKだったんですか。気づきませんでした。 早速試してみます。どうもありがとう〜!!
98 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:00:46 ] >>91 私はC++初心者ですが、>>93 さんと同意見です。 >>95 さんの言うようにgccの方が正しい(つまり規格どおりということですよね)ならば、 なおさらそう思います。 それに、Xクラスの定義を見たいときには、むしろYは外にあった方が見やすいのではないでしょうか?
99 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:06:58 ] ちなみに関数テンプレでもこの手は使えるようだ この手法も名前があったと思うけど思い出せない 使うなら適当にローカルなメタ関数を専用の名前空間に自作して階層を浅くする工夫が必要だね 使ってればわかるけど、凄く見にくくなるから
100 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:10:12 ] あ、::type付けわすれた…
101 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 21:43:54 ] 読み易くするのが目的で読みにくくなる手法を選ぶか。 >>99 名前があるならソレをコメントに書いておけば良いかも。
102 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 22:00:44 ] >>98 >>101 読みやすいかどうかは読み手にもよるし、あまり>>91 や>>94 はよい聞きかたではなかったですね。 C++のコードを自動生成するツール(自作)の都合でX内に定義を書けると嬉しい、というのが実際の事情です。
103 名前:91 mailto:sage [2007/09/30(日) 22:32:03 ] 102は91です。 >>99 concept-controlled polymorphism ですか?
104 名前:デフォルトの名無しさん [2007/09/30(日) 23:06:47 ] >>100 > あ、::type付けわすれた… 検索エンジン経由で来るひとのために、一応訂正版貼っときますね。 #include <cstdio> #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_same.hpp> struct X { template<typename T, typename U = void> struct Y { Y() { std::printf("genecic\n"); } }; template<typename T> struct Y <T, typename boost::enable_if<boost::is_same<T, int> >::type> { Y() { std::printf("specialized for int\n"); } }; }; class Z {}; int main() { X::Y<Z> a; X::Y<int> b; X::Y<float> c; } 実行結果は、 genecic specialized for int genecic です。
105 名前:91=104 mailto:sage [2007/09/30(日) 23:31:30 ] boostが使えない場合は、VC++2003/2005/g++対応だけ考えるならこんな感じでしょうか。 #include <cstdio> namespace b00st { template <bool B, class T = void> struct enable_if_c { typedef T type; }; template <class T> struct enable_if_c<false, T> { /* NO TYPEDEF! */ }; template <class Cond, class T = void> struct enable_if : public enable_if_c<Cond::value, T> {}; template<bool b> struct bool_ { static const bool value = b; }; template<typename T, typename U> struct is_same : bool_<false> {}; template<typename T> struct is_same<T, T> : bool_<true> {}; } using namespace b00st; struct X { template<typename T, typename U = void> struct Y { Y() { std::printf("genecic\n"); } }; template<typename T> struct Y<T, typename enable_if<is_same<T, int> >::type> { Y() { std::printf("specialized for int\n"); } }; }; そろそろウザいとおもうので、これで打ち止めにします。ありがとうございました。
106 名前:デフォルトの名無しさん mailto:sage [2007/09/30(日) 23:40:10 ] このtemplate感、実に小気味良い 久しぶりにC++スレを実感した
107 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 00:01:02 ] キモ
108 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 00:04:13 ] 小気味良いのは確かだけど、言葉遣いが丁寧すぎてちょっと痒い、というのが俺の感想。 うん、俺の感想なんかどーだっていいってのは承知。
109 名前:デフォルトの名無しさん [2007/10/01(月) 02:02:08 ] >>99 enable_ifの関数テンプレへの適用で質問。ある条件で2つの関数を呼びわけたいときは、こんな感じにすればいいみたいだけど、 template<typename T> static void foo(T t, typename boost::disable_if<boost::is_same<T,int> >::type* = 0) { } template<typename T> static void foo(T t, typename boost::enable_if<boost::is_same<T,int> >::type* = 0) { // intへの特殊化版 } 3つ以上を呼びわけるにはどうすれば? たとえば、 template<int V> static void boo(typename boost::enable_if_c<V == 0>::type* = 0) { } template<int V> static void boo(typename boost::enable_if_c<V == 1>::type* = 0) { } template<int V> static void boo(typename boost::disable_if_c<V == 0 || V == 1>::type* = 0) { // default } とかだと、default caseな関数の引数が大変なことになってしまうような。 boostスレのほうがいいのかな。。
110 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 02:51:44 ] 複雑な場合はmplの出番になるんじゃないかな mpl::if_< ..., mpl::if_< ..., > >::type::call();
111 名前:109 [2007/10/01(月) 03:23:49 ] >>110 すみません、それはどこに書くコードなんでしょうか? call() とは一体。。
112 名前:109 [2007/10/01(月) 03:28:24 ] >>110 が理解できず、独自に考察を進め中。 template<int V> static void boo(typename boost::enable_if_c<V == 0>::type* = 0) {} は、 template<int V> static void boo(typename boost::enable_if< boost::is_same< boost::mpl::int_<V>, boost::mpl::int_<0> > >::type* = 0) {} であり、さらに template<int V> static void boo(typename boost::enable_if< typename boost::mpl::lambda< boost::is_same< boost::mpl::_1, boost::mpl::int_<0> > >::type::apply<boost::mpl::int_<V> >::type >::type* = 0) {} だから、この数値0-Nでlambdaしたのをmpl::listで抱えて、特殊化版はlistのat<i>したのでenable_ifして、default版はこれらをandでfoldしたのにdisable_ifすればいいと思うんだぜ? ・・・絶対方向が間違ってる。
113 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 03:37:53 ] いや、単に、mpl::if_で関数を実装したクラスを選んで呼び出す boost/smart_cast.hppが参考になるかも
114 名前:デフォルトの名無しさん [2007/10/01(月) 03:44:43 ] >>113 私は、単に boo(0); boo(1); boo(2); とだけ書くと、呼び先の関数がコンパイル時に決まるようにしたいと 思っているんですが、>>110 は、このbooを *呼ぶ側* をif_で工夫しろということ? まぁ、boo()でif_を使って、適切なboo_()を呼ぶようにしてもいいのかもしれませんが、 委譲してしまうとタグディスパッチと大差ないようにも思うし。。 なんか勘違いしてたらすんません。smart_castは早速見てみます。
115 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 04:37:09 ] どうしてもenable_ifを使いたいなら 複雑な条件を書かずに済ますことは不可能だと思う
116 名前:109 [2007/10/01(月) 05:41:56 ] >>115 enable_ifが使いたいわけでは無くて、 1.メンバ関数テンプレートの特殊化(相当のこと - オーバーロードでもいい)を行いたい 2.特殊化の定義は、クラス内に書きたい (>>91 と同じく, 見た目の問題で) 3.メンバ関数を呼ぶ側はあまり難しいことを考えたくない 4.タグディスパッチのような別関数への処理の委譲は、できれば避けたい (これも見た目の問題で) という条件で、Pという場合と!Pという場合の処理の振り分けだったら、 enable_ifを使ったオーバーロードでOKとわかった(>>109 )が、P, Q, (!P && !Q) の3関数に振り分けたい場合にこの4条件を満たすようなのないですかね? というのが質問です。ちゃんと書かずにすみません。コンパイラはgccです。
117 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 05:47:44 ] >この4条件を満たすようなのないですかね 自分で書いた>>109 が満たしてると思うんだが
118 名前:デフォルトの名無しさん [2007/10/01(月) 05:58:35 ] >>117 おっしゃる通りなんですが、>>109 は、V==0やV==1という条件が 繰り返し登場してしまい、メンテナンス性がいまいちかなと思いまして。 実際はenumとか扱いたいので。 109の繰り返しになりますけど、条件1-4をみたし、かつdefault case template<int V> static void boo(typename boost::disable_if_c<V == 0 || V == 1>::type* = 0) { /* default */ } を綺麗にかけないですかね。 template<int V> static void boo(...) { /* default */ } とかが通れば最高なのに。
119 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 06:02:23 ] struct a_condition : mpl::bool_<...> {}; としてenable_ifに渡すとか
120 名前:デフォルトの名無しさん [2007/10/01(月) 09:08:09 ] kwsk
121 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 09:54:53 ] 引数忘れた こんな感じ enable_if< my_conditionA<V> > まあディスパッチすべきだな enable_ifはこの場合必要ないから
122 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 11:56:27 ] デザパタのプロトタイプパターンを使ってみたいのですが ばらばらに clone() 関数をとりつけるよりも ひとつ Clonable クラスを作って、そのクラスから 継承したほうがよいでしょうか?
123 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 12:34:46 ] そういう継承ってどうなんだろうね。
124 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 17:41:51 ] noncopyableとかあるし、いいんじゃね?
125 名前:デフォルトの名無しさん mailto:sage [2007/10/01(月) 18:16:10 ] traitsを作れば継承はいらないと思うよ
126 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 21:42:40 ] #include <boost/numeric/ublas/vector.hpp> using namespace boost::numeric::ublas::inner_prod; VC++2005EEの環境でビルドすると、 error C2867: 'boost::numeric::ublas::inner_prod' : は名前空間ではありません。 というエラーが出ます。 エラーの原因は何ですか?
127 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 22:08:58 ] 名前空間ではないものをusing namespaceしたこと
128 名前:126 mailto:sage [2007/10/02(火) 23:00:22 ] >>127 sealsoft.jp/namespace.html このサイトの > usingを使って、ある識別子をグローバルな名前空間に持ち上げることができる。こうするとその後は大域解決演算子を使う必要がない。 > using namespace seal::foo; > // 関数fooを呼び出す > int a = foo(); ここ見てできると思ったんですけど、このサイト間違ってますか?
129 名前:デフォルトの名無しさん mailto:sage [2007/10/02(火) 23:27:47 ] usingディレクティブ (using namespace)の対象にできるのは、名前空間だけ。 代わりといってはアレだが、その他の識別子一般には、using宣言が使える。 using boost::numeric::ublas::inner_prod;
130 名前:126 mailto:sage [2007/10/02(火) 23:49:25 ] >> 129 なるほど、そうなんですか。 msdn2.microsoft.com/ja-jp/library/6f133eff (vs.80).aspx ここを勘違いして見てました。(classの中のusingとは別物なんですね) クラスの中でnamespace内の関数をusingしたい場合、 class A { using boost::numeric::ublas::inner_prod; }; エラーになってしまうのですが、クラス中でnamespace内の関数をusingするのは無理ということですか?
131 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 00:09:31 ] そういうこと。クラス定義内のusingは基底クラスの名前を指定することに特化している。 なお、型名だけはtypedefで代用できる。
132 名前:126 mailto:sage [2007/10/03(水) 00:14:05 ] ありがとうございました。
133 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 01:54:49 ] マクロ使って、行数と引数を連結させたいのですが、 #define macro( name )\ const char *x = "name##__LINE__"; とかやってもできません。 こんなことは可能ですか?
134 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:05:02 ] __LINE__は定数だからダブルクォーテーションで囲っちゃだめっしょ で、定数を文字列にするのは単純なマクロじゃ厳しいと思うけど・・・ おとなしく関数にしたほうがよさそう
135 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:07:38 ] 一応マクロでこんな感じでいかが? #define macro( buf, name ) sprintf( buf, "%s%d", "name", __LINE__);
136 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:10:53 ] #define NUM2TEXT_(n) #n #define NUM2TEXT(n) NUM2TEXT_(n) #define macro(name) \ const char *x = name ## NUM2TEXT(__LINE__)
137 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 02:43:41 ] 演算子オーバーロードって副作用完了点のことも考慮しないといけないんですか? std::cout << "test" << std::endl; で (a) "test" << std::endl; が先に評価されて、次に std::cout << (a) が評価される、という事態にはならないんですか?
138 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 03:26:56 ] 優先順位の同じ演算子の並びは左から評価じゃなかったのか
139 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 04:07:20 ] 左結合と右結合があってね・・・
140 名前:133 mailto:sage [2007/10/03(水) 05:13:05 ] ありがとうございます。 >>136 さんのは どういう原理なんでしょうか?
141 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 08:46:05 ] 7**7**7 の下一桁の数字は?
142 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 09:44:47 ] >>137 多重定義されている場合、通常の関数と同様、 呼出の直前に副作用完了点が現れるので心配は要らない。 <<は左結合だから、まずstd::cout << "test"から取り掛かる。 これは多重定義されているので、std::cout.operator <<("test")という関数呼出に相当。 関数呼出の直前には副作用完了点が来るので、ここまでにstd::coutと"test"が評価される。 と言っても、共に副作用を持たないので何も起きないが。 仮に副作用を持つ式だった場合、通常の関数呼出同様に <<の左側と右側のどっちのオペランドが先に評価されるかは決まっていない。 std::cout.operator <<("test")の戻り値をrとすると、 次にr << std::endlの評価に掛かる。以下同じ。
143 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 11:51:51 ] >>140 > 16.3.2 The # operator > 16.3.3 The ## operator
144 名前:デフォルトの名無しさん mailto:sage [2007/10/03(水) 13:50:35 ] >>133 #define XY(X,Y) X##Y #define MAKENAMEXY(FX,LINE) XY(FX,LINE) #define MAKENAME(FX) MAKENAMEXY(FX,__LINE__) というマクロで連結させている例がある。 評価順その他の関係で、間に一段置かないとならないらしい。
145 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:31:45 ] VS2008EEで>>136 が正常に動作しないんだけど・・・ コンパイラの仕様かな?
146 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:36:58 ] プリプロセッサの仕様じゃね?とかつまんない事言うね。義務として。
147 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:45:12 ] すみません。継承について質問です。 クラスBaseを基底とするクラスDerivAやクラスDerivBがあるとして、 そこからインスタンスを作成するとすると、 Base* pA = new DerivA; Base* pB = new DerivB; となると思います。 そこから、pAもしくはpBから新たなインスタンスpCを作りたいと思っているのですが、 どうしたらいいでしょうか? 単にpA(DerivA)だけであれば、DerivA *pC=*pAだけでいけるのですが、 pAとpB(最終的にはBaseを基底とするクラス全部)にも対応できるものを作りたいので、 どうか力をお貸しください。
148 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:53:05 ] class Base { public: virtual Base *NewInstance() = 0; }; class DerivA : public Base { public: virtual Base *NewInstance(){ return new DerivA; } }; class DerivB : public Base { public: virtual Base *NewInstance(){ return new DerivB; } }; Base *pA = new DerivA; Base *pB = new DerivB; Base *pC = pA->NewInstance(); Base *pD = pB->NewInstance();
149 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 00:53:41 ] Base* pA = new DerivA(); Base* pB = new DerivB();
150 名前:147 mailto:sage [2007/10/04(木) 01:02:02 ] >>148 、149 目からウロコが落ちました。 インスタンスを作成する関数を別途で作ればいいわけですね。 ありがとうございます。
151 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:04:17 ] >>148 DerivA::NewInstanceはDerivA*を返し、 DerivB::NewInstanceはDerivB*を返し、 という具合に、そこは共変にしてほしいな。
152 名前:デフォルトの名無しさん [2007/10/04(木) 01:06:08 ] 凶変を許したことでできるようになったことってなんだっけ? なんかの本にかいてあったが忘れた
153 名前:デフォルトの名無しさん [2007/10/04(木) 01:15:57 ] >>136 boostにはなんて名前で入ってたっけ
154 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 01:18:23 ] >>152 pAはDerivA*と分かっているとき、 DerivA* pA2 = static_cast<DerivA*>(pA->NewInstance()); のようなキャストを型安全性を損なうことなく排除できる。
155 名前:デフォルトの名無しさん [2007/10/04(木) 02:07:15 ] dynamic_castすれば共変なしでも安全じゃね?
156 名前:デフォルトの名無しさん mailto:age [2007/10/04(木) 02:08:25 ] videointroplayer.web.fc2.com/?ii9YN1kO-TK36%+WhqyiIrhz0F110%+Kjtps4byn7a119%+esA5NHPWRF1115%+026mGIi9Z4824%+@1@_KeyboardCrusher
157 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 02:29:39 ] >153 BOOST_PP_STRINGIZE
158 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 08:19:17 ] これじゃだめなん? Base *pC = new DerivC;
159 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 08:20:10 ] Base *pC = new DerivC(pA); Base *pC = new DerivC(pB);
160 名前:デフォルトの名無しさん mailto:sage [2007/10/04(木) 21:28:42 ] >>155 それだと余計な負荷がかかる。
161 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 01:29:04 ] 俺的c++開発環境構築メモ 目的:最終的にlinuxで動かせるようにしないといけないけどVisual Studio捨てれない winxpにvmwareいれてゲストOSとしてubuntu7を入れる ubuntuの/home/srcをsambaで共有できるようにしてホストOSのwinxpからみれるようにする /home/src = \\ubuntu\src の下にVisual Studioのプロジェクト作成 makefileはeclipse/CDTで自動生成 あとはemacsでメインのコードの編集するけど、flymakeとか使いつつ インテリセンスも使えてeclipse/cdtのリファクタリング機能も使える環境のできあがり
162 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 04:20:16 ] 俺がいる
163 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 08:18:16 ] もう遅いだろうがcoLinuxを薦めてみる
164 名前:デフォルトの名無しさん [2007/10/05(金) 12:27:41 ] coMomongaを勧めてみる
165 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 12:59:49 ] coLinuxの方が便利なの? 速度が速い以外のメリットがないなら、もう乗り換えれない
166 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 15:23:45 ] coLinuxってkernelのバージョンあがるたびに中身を全消ししないといけないって聞いたのだけど 違うの?
167 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:36:55 ] ヘッダファイルなどで記述したグローバルなstatic変数は, includeしたソースが複数ある(各ソースではincludeガードが起きずに展開される) 場合も単一の存在となるんでしょうか? それとも別々の独立した変数となるんでしょうか?
168 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:41:00 ] それをインクルードしたソースファイルごとに別々に作られることになる
169 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:02:52 ] ありがとうございます. あれ,でもクラス変数などは単一なんですよね? うーむ,基本の理解が全然出来ていない.
170 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:26:17 ] クラスの static 変数はどこかで1個だけ実体を定義する必要がある。 class A{ static int x; }; int A::x; // <-- これ 2個以上のソースファイルで定義したら、定義が重複してるってリンクエラーになる。 static でない普通のグローバル変数と同じあつかい。
171 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 20:36:51 ] #includeは単にファイルをくっつけてるものと考えれば理解しやすいかも