1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ class C++相談室lt;part56gt; pc11.2ch.net/test/read.cgi/tech/1170343752/l50
2 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:38:05 ] ■基本■ [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/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60 [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 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:38:43 ] ■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 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:39:54 ] ■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 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:40:39 ] ■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 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:41:15 ] STLつかうと一気に実行ファイルサイズが10倍に?!
7 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:41:50 ] 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない
8 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:42:25 ] すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
9 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:42:55 ] C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
10 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:46:14 ] #include <stdafx.h> 後死ね。
11 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:46:44 ] 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
12 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:49:27 ] 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/
13 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:52:22 ] 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 今気付いた。このスレ57だね_| ̄|○
14 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 00:54:59 ] ■関連スレ■ 多すぎ。とりあえずスレタイ 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
15 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 01:37:45 ] BOOTSを語れゴラァ part2 pc11.2ch.net/test/read.cgi/tech/1139266461/
16 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 05:49:15 ] >>1 ぬるぽ乙
17 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 10:42:40 ] >>1 乙 >>15 靴は関係ねぇだろ、靴は! また↓みたいなことにしたいのか? pc11.2ch.net/test/read.cgi/tech/1139266461/58-76
18 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:23:15 ] 注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
19 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 18:27:49 ] けちがついたことだし、改めて57立てるかね。
20 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 20:43:14 ] 君2ちゃん初心者?
21 名前:デフォルトの名無しさん mailto:sage [2007/07/26(木) 23:59:54 ] 潔癖症だな 俺は資源は再利用する派だな
22 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 06:17:22 ] テンプレじゃなかったのか。
23 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 09:43:25 ] ブーツを脱いで朝食を
24 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:12:47 ] STLのmapのキーにstringとかって指定できないんですか? map<string, CHoge *> みたいにして、文字列で検索をかけたりしたいのですがどうすればいいのでしょうか?
25 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:19:25 ] できるだろ。
26 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:20:11 ] とりあえずやってみれ。
27 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:20:57 ] 前スレをぬるぽで埋めてきました。
28 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 18:27:36 ] うむ、ごくろうであった。 ☆ ガッ ヽ■━⊂(・∀・ ) (´・ω・`)
29 名前:24 mailto:sage [2007/07/27(金) 18:27:51 ] >>25-26 すいません。できました。 *.insert(pair<string, CHoge *>()) のCHogeの名前(ホントは違う名前)が間違ってましたww ご迷惑おかけしました。
30 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:05:41 ] だからstd::make_pairを使えと
31 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 19:58:51 ] >>30 はいw
32 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:19:52 ] 関数の引数を参照にしても内部的にはポインタと同じになるの?
33 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:23:49 ] ならん。
34 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:46:07 ] なるかどうかは実装次第
35 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 01:21:06 ] 参照は単にコンパイル時に一意に決まるインスタンスへの別名ということ? ポインタとは違う実装というのは具体的にどんなものがあるの?
36 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:50:55 ] ポインタで書くよりも参照で書いた方が最適化が利き易い。 最適化の結果、(関数のインライン化などで)差がつくこともしばしば。
37 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:23:56 ] STLのvectorに関して質問があります。 main() { vector<int> vec; int v[3] = {0, 1, 2}; vec.resize(3); // コピー } 上のソースで、v[3]のデータをvecに入れたい、 (勿論、vec[0] : 0 vec[1] : 1 vec[2] : 2のように) のですが、一発で入れる方法無いですか? やはり、for等でvec[loop] = v[loop]にするか、イテレータ使うしかないのでしょうか? よろしくお願いします。
38 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:30:41 ] >>37 int v[] = {0, 1, 2,}; std::vector<int> vec(v, v + sizeof(v) / sizeof(* v)); じゃいかんの?
39 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:34:37 ] std::copyとか?
40 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:43:24 ] std::copy(v, v + sizeof v / sizeof *v, vec.begin());
41 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:50:19 ] >>38-40 レスありがとうございます。 書き忘れましたが、std::vector<int> vec;は別のところで宣言しているため >>38 さんのやり方では無理でした・・・すいません。 なので、copyについてググってたら答えが、、 >>40 さんありがとうございます。 sizeof vとかっていう()の無い使い方初めて見たのですが、sizeof()と同じですか?
42 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:52:37 ] sizeof はカッコ不要。 つけたければつけていいけど。
43 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:53:35 ] >>41 対象が型名でないsizeofは括弧を必要とはしていない。
44 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 10:54:42 ] >>42-43 そうだったんですか。。勉強不足でした。ありがとうございます。
45 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:04:36 ] >>37 assign()
46 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:16:34 ] >>45 vectorにassign()というのも用意されてたんですね、、 ありがとうございます。
47 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:27:52 ] こうやって参照渡しにNULLが渡せるのは規格として正しい動作なんですか? gcc4.1とvc8sp1両方ともこれが通って &str is NULLが出力されます。 #include <iostream> #include <string> void func(std::string& str) { if(&str == NULL) { std::cout << "&str is NULL" << std::endl; } } main() { std::string *str = NULL; func(*str); }
48 名前:デフォルトの名無しさん [2007/07/28(土) 11:28:13 ] >>47 未定義動作。
49 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:37:28 ] >>48 ありがとうございます。 具体的にどの部分が未定義動作になりますか? 1, *str (NULLの参照外し) 2, 参照型にNULLアドレスの実体が渡る事 3, funcのif条件で&strとして参照型のアドレスを見に行った事 1と2で合ってますか? そもそも1が未定義なので2は起こる事はあり得ないはずという認識の方がいいんでしょうか?
50 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:44:59 ] 1 は、参照先にアクセスしたり参照の初期化に使ったりしない限りは未定義じゃない。 例えば main 内で &*str がヌルポインタになるのは well-defined 。 だから、未定義なのは 2 と 3 。
51 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 11:45:49 ] 良く分かりました。ありがとうございました。
52 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:16:54 ] >>50 それって↓ここにある話だよね? www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 現行の規格では 1 も未定義動作と読めるから、ダメだと考えておいた ほうがいいんじゃない?
53 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:22:51 ] DirectX SDKに以下のクラスがあって D3DVECTOR(Cバージョン。float x,y,zのみ) D3DXVECTOR3(C++バージョン。上記にメンバ関数が付いた) 後者を引数として受け取る関数 func( D3DXVECTOR3 &v ) に前者D3DVECTORを渡そうとしているのですが、型が違うという エラーがでるので、func( (D3DXVECTOR3)v )とキャストしています。 問題なく動いているのですが、こういうキャストって文法的に問題無い のでしょうか?なんとなく違和感があって func( *((D3DXVECTOR3*)&v) ) こっちに直そうかと思っているのですが…
54 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:32:14 ] ちょっと試してみたのですが、メンバ変数が異なるクラスを func( (D3DXVECTOR3)hoge ); とするとちゃんとエラーが出ますね。ということはコンパイラが ちゃんとそこまで判断して通してくれているのでやはり合法 なのかな?
55 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:32:50 ] >>52 あら、そうだったんだ。すまん。
56 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 12:38:55 ] >>53 msdn2.microsoft.com/en-us/library/ms887536.aspx D3DXVECTOR3 は D3DVECTOR からの変換コンストラクタを持っているので (D3DXVECTOR3)v が static_cast 相当の働きになり、一時オブジェクトが作られる。 ただし標準では一時オブジェクトを非 const 参照には渡せないので、 func() の呼び出しがエラーになるはず。 VC 系は最新でも通るんだっけ? >>54 メンバ変数が同じかどうかは関係ない。
57 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:06:23 ] >>53 >>56 とりあえずVC7.1で試してみた感じだと、 「組み込み型では通らないけどユーザー定義型なら通る」っぽい。
58 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 13:55:59 ] >>56 >>57 なるほど、やぱり駄目な書き方なのですね。私も最初エラーになると 思ったのですが、動いてしまったのでむしろ驚きました。 ちなみにこちらは.NET2003です。 >メンバ変数が異なるクラスは駄目 ここら辺はVCの独自拡張なのかな? とりあえず以下の書き方に直します。 func( *((D3DXVECTOR3*)&v) );
59 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:40:05 ] どこをどうすればそこまで誤読できるんだ?
60 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 16:44:32 ] >>59 それが説明できるくらいなら誤読しないだろ。
61 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 17:33:43 ] あれ?誤読してます? 文法的に問題ないということでしょうか? func()の引数にconst付ければ問題ないということです?
62 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 20:54:10 ] 無名構造体のコンストラクタ、デストラクタはどうすればじっそうできるの
63 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 21:19:58 ] 無名をやめればいい
64 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:00:17 ] 無名でなければならない時は?
65 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:03:48 ] 適当な名前を付けろ。
66 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:17:25 ] >>64 どんなとき?
67 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:19:42 ] \ / ヽ l | / \_人从__ ヘ、 ヽ _..≧=ヽ|Y〃/∠._ / } \ ,′ \ >ヘ´ | / '⌒≦ / ノ ヽ. /// `X < く V !. \ / , / / | j{ /ヽ ) だ I !. /〃/ / / , 〃|l U \ ヽ `) さ P / {/ / / / / || |l } lヽ 丶 < い で ‐- . / { / 〃,′{ { |l jl | |ハ ヽ} ヽ ! や _ ヽ、 { ハ{ { {/´≧x x≦ヽハ\ ヽ〈 ノ、 っ  ̄ ≧‐-{;;;\ヽ{ {:::{.j {.j::} }|lヽ \ ハヽ=≦ヽ て / `八;;;;;;;;....|xx`~ _'_ `~xxjハヽ;;;;;;;;;;}ハ } -‐ァ'//´ ヽ:;;;;...{ヘ、 ( j ノ ハl|;;;;;;;ハ  ̄ ノ / -/ // , \/⌒≧ーr---ァ≦'⌒ヽノ}|};;;/ハ /⌒Y⌒ヽ{ 7/ / / 〉\ }ノ'⌒ヽ // | リノ \ { / ノ厂 {{ }'⌒ヽ⌒ヽL_ \ \! j/ / f´/ ノ>ァ‐1 j| l ) \ j ハ / W 〃/ `ーく{ |{ \ \,' ハ / / l{ / イ ー==- \\ Y ヽ \ /\ × / ノ // | \ヽ \ ヽ \ イ
68 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:27:57 ] 何故だ
69 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:29:49 ] >>66 好きなものは好きと言える気持ち抱きしめてたいとき
70 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 22:37:43 ] >>69 俺の胸に飛び込んで来い
71 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:01:58 ] まんゆうき懐かしいな
72 名前:名無しさん@そうだ選挙に行こう [2007/07/29(日) 14:36:28 ] perlだと1行でできた・・・
73 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:18:36 ] C++始めたばかり何でちょっと分からないことがあります。 class C { public: int hoge; }; class B { C *c; public: B() : c(NULL) {} virtual ~B() { if (c != NULL) { delete c; c = NULL; } } void init() { c = new C; c->hoge = 4545; } int Get() { return c->hoge; } }; class A { B b; public: B Get() { return b; } void init() { b.init(); } void print() { printf("%d\n", b.Get()); } }; int main() { A *a = new A; a->init(); B b = a->Get(); printf("%d\n", b.Get()); a->print(); delete a; return 0; } このソースなんですが、Bクラスのデストラクタが2回呼ばれてエラーを吐きます。 私的には、delete a;した時に1回だけ呼ばれてほしいのですが、どうすればいいのでしょうか? 分かる方お願いします。
74 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:35:39 ] 代入演算かコピーコンストラクタか…その辺でググレば幸せかもしれない?
75 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:43:15 ] >>73 エラーも吐かずに普通に実行できてしまった。 再現方法は?
76 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:46:38 ] B b = a->Get(); ↑これをポインタで受け取れば?
77 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:48:41 ] 返事ありがとうございます。 >>74 ちょっと調べてみます。 >>75 試しに、Releaseビルドで実行したら普通に実行できました・・・。 Debugビルドだとエラー吐きます・・・ 一応環境は、VS2005 pro です。 >>76 ポインタで受け取ってみたらエラー吐かずに実行できました。 どういう事なんでしょうか??
78 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:51:32 ] C++の初心者はnew/deleteを使わないほうがいいと思うんだ。
79 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 16:53:22 ] 問題はそっちじゃなくて、class BのCポインタが2回削除されていること。 #delete aと、B bがdeleteされるとき メンバーポインタはけっこう難しいので、最初は使わないほうがよろしいかと。 boost::shared_ptrがお勧め
80 名前:79 mailto:sage [2007/07/29(日) 16:57:41 ] あと、C++の場合は「このインスタンスの所有者は誰?」というのを常に意識すると良いよ。 あと、RAIIを調べると幸せになれるかも。
81 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:01:31 ] ここで返したいのはprivateのBだよね? B Get() {return b;} これだとここでコピーが行われて新しくメモリ作られるよ ポインタで返すようにして B* Get() { return &b; } こうやってポインタで受け取るべき B* b = a->Get();
82 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:01:59 ] >>78-80 返事ありがとうございます。 boost::shared_ptrですか、、聞いたこと無いな、、 ググってきます。 アドバイスなどありがとうございます。 参考にさせていただきます。
83 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:03:58 ] >>81 >B Get() {return b;} >これだとここでコピーが行われて新しくメモリ作られるよ あっ、そういうことですか。 難しいですね、、 ありがとうございます。
84 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:11:24 ] >>83 >難しいですね、、 だから、>78。 そもそも、なんでnew/deleteを使うのか理解している? #Javaじゃあるまいし、new/delete[]と違ってnew/deleteの必然性なんてそんなにないだろうに。
85 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:14:37 ] そんなにnew/delete使わせたくないならnew/deleteについて語れよ。
86 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:22:24 ] こういうノウハウを覚え続けないとまともに使えないのがC++
87 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:22:56 ] MS-DOSのようなコマンド入力を受け付けるようなプログラムを組んでいるのですが、 char name[20]; char *p; int j = 0; cin >> name; p = name; if(*p == 'a'){ j = 1; } p++; if(*p == 'b'){ j = 1; } if(j == 1){ cout << "成功\n"; }else{ cout << "失敗\n"; } return 0; のように書くと、コマンドの文字数や種類が増えるにつれて何行もif文に費やされることになってしまいます。 簡略化できる方法を教えてください。
88 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:24:33 ] >>73 コピーされては困るクラスでは代入演算子やコピーコンストラクタをprivateにしよう。 class B { C *c; public: 略 private: B(const B&);//禁止 const B&operator=(const B&);//禁止 }; 詳しくはEffective C++でも読んでくれ。
89 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:26:53 ] new/delete使う使わないは好き嫌いの問題でおk?
90 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:27:26 ] >>87 多重分岐→データテーブル→データファイル化
91 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:28:17 ] 修正 if(*p == 'b'){ j = 1; } ↓ if(*p != 'b'){ j = 0; }
92 名前:79 mailto:sage [2007/07/29(日) 17:29:45 ] new/deleteも便利だから、まったく使わないのはもったいない。 new/deleteで問題なのは所有者がはっきりしないことなので、そこに注意していればいい。 何だかんだ言って、boost::shared_ptr使うのが良いけどね。
93 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:31:47 ] >87 つ Commandパターン
94 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:41:24 ] shared_ptr便利そうだけど STLだけでやりたい漏れはいらないや。。
95 名前:えいいち ◆GRGSIBERIA mailto:sage [2007/07/29(日) 17:44:12 ] >>90 ,93 ありがとうございます。
96 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:50:08 ] >>94 auto_ptr 使え。
97 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 17:56:30 ] >>94 std::tr1::shared_ptr
98 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:04:17 ] >94 そうすると、auto_ptr + 生ポインタかね。 ライセンス制限ないんだから素直にboost使えばいいんじゃね?とは思うけど。
99 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:05:02 ] boostインスコめんどいよめんどいよ
100 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 18:48:13 ] shared_ptrぐらいならビルドする必要ないだろ。 インクルードパスを通しておくだけ。