1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
2 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:38:18 ] ■基本■ [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 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:38:41 ] ■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/
4 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:39:05 ] ■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
5 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:39:25 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
6 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:43:29 ] 前スレ C++相談室 part60 pc11.2ch.net/test/read.cgi/tech/1200044614/
7 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:46:54 ] >>6 サンクス、連投で制限食らった
8 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:02:21 ] >>前スレ1000 とりあえず、お前が俺の言っていることを理解出来ていないことだけは分かった お薦めの本があって、それを教えることには全く反対しないが、 自分で調べたり、情報を探したりしようとしない奴は 大体どうしようもない 一応補足 前スレ984のように聞いてみること自体は別に良いと思う 本を紹介してもらわないと先に進めない、ということでなければ
9 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:05:41 ] お前のポリシーはどうでもいいよ
10 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:06:48 ] そういや、こういうヤツがいるから初心者歓迎スレが出来たんだったな
11 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:14:48 ] ポリシーじゃねぇよ・・・ 無能にレスしても無駄のようだな・・・ >>10 初心者に本だけでなく入門サイト探してみたら?って言うのは アドバイスにならないのか? 自分自身の経験から言っているんだけど ある程度理解出来てくるとcppllのアーカイブとかも参考になるし
12 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:31:24 ] おとなしく初心者歓迎スレかオススメ図書スレに誘導してやれよ 今回の様な議論が過去あったからこそそういったスレがあるんだから
13 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 20:40:52 ] 誘導済みだろ? 俺は別に質問者にレスしてるつもりないし・・・ 前スレの985のレスが気に食わない人が居るようなので、 レス返してるだけ
14 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 00:04:40 ] >>13 案外質問した人が突っ掛ってたりしてなw んなわけないか。
15 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:09:34 ] 他スレでis-a、has-aで継承やメンバを考えるみたいな話が合ったんですが、 doはどういう風に処理したらいいでしょうか アクションゲームとかでAn enemy moves.(敵は動く)とした場合、 moveメソッドはenemyオブジェクトの位置を示すメンバ変数を操作すると思います。 すると、moveはenemyオブジェクトのメンバ関数であるべきと思えるのですが、 他のオブジェクトの位置とかが影響する場合、 enemyオブジェクトをメンバにもつクラス(WorldとかGameとか)に、 全てのオブジェクトを動かすメンバ関数を用意した方が、 他のオブジェクトを参照でき適切に処理できそうです このような機能を持つメソッドを、皆さんはどの位置に配置していますか?
16 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:17:01 ] enemyのmoveメソッドはそのままで WorldやGameからすべてのenemyのmoveメソッドを呼ぶ様にすればいいんじゃね? ていうかC++関係ないな
17 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:23:43 ] >>15 もし本当にゲームのことだったら pc11.2ch.net/test/read.cgi/gamedev/1155209226/ とかで聞いた方が良さそう。 それかこの板のクラス設計とかのスレ。 俺だったら、大まかにStrategyパターン的な感じで書くかな。 enemyとかのユニット情報を持った環境(orフィールド)オブジェクトを 参照していじる敵戦略クラス・・・とか。
18 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:31:46 ] >>16 すみません、自身がCからC++に移行して、 クラス設計に右往左往しているもので、ここで聞いてしまいました >>17 あ、そんなスレがあったとは知りませんでした moveメソッドは引数にしたがってオブジェクトの変数を変えるだけ moveメソッドに渡す引数を敵戦略クラスないし、Worldクラスで決定するって方向で考えて見ます (moveメソッドの内容が二行で終わりそうだ……。他のメソッドとまとめよう) ありがとうございました
19 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:34:51 ] >>18 ちなみに、17のはゲ製板のスレね。
20 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 01:40:44 ] 飛んできたのはおそらく同じ板のシューティング製作スレだなw
21 名前:17 mailto:sage [2008/03/10(月) 02:11:11 ] ターン制で移動先選択→攻撃みたいなの想定してました/(^o^)\ 敵戦略クラスは忘れた方が良いw
22 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:05:22 ] Class().Method(); なんて書けたんだね、、、知らなかったよ(;´Д`)
23 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 03:20:08 ] 式が何を意味するかによる。Class()がインスタンスなら当然ドットを付けてメンバにアクセスできる。 一通り文法をかじったなら、今度は仕様書を読んでそれを確かなものにした方がいい。流れとしては。
24 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:21:40 ] ぁぁ、ごめん。はしょりすぎた。 class Class { public: int Method(); }; こんなので、 void F() { printf( "%d\n", Class().Method() ); } な感じ。
25 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:38:15 ] printf("%d\n", int(5)); な感じ?
26 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:47:08 ] 一時オブジェクトが近々move semanticsな感じ?
27 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:37:58 ] 異なるクラスのオブジェクトをひとつの配列(vector,list)で管理することは出来ないのでしょうか a[0]はclassA,a[1]はclassB,a[2]はclassC、……という風に classA、classBは同じpublicなメンバを持っているのですが、 メンバ関数の中身とそこで使うprivateなメンバが異なっています
28 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:49:47 ] >>27 そういうのこそ、ポリモーフィズムでしょ
29 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 23:59:11 ] >>28 関数の多重定義のことでしょうか ClassAとClassBの異なるメンバもひとつのクラスにまとめて、 使わないメンバがあっても気にしない、という方針でもいいんですが、 無駄にメモリを消費するのがイヤなもので
30 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:01:24 ] 全く関連のないクラスを1つの配列に入れるという時点でかなりおかしいと思う。 関連というか共通項があるからこそ1つの配列に入れるんだろう?
31 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:06:44 ] >>29 仮想関数ってやつだ。 class Base { public: virtual ~Base() {} virtual void func() = 0; // 共通のメンバ関数 }; class A : public Base { public: virtual void func() { /* classAの処理 */ } private: /* classAのメンバ変数 */ }; class B : public Base { public: virtual void func() { /* classBの処理 */ } private: /* classBのメンバ変数 */ }; このようにしておいて、たとえば Base* p1 = new A; Base* p2 = new B; とすれば、 p1->func(); // A::funcが呼ばれる p2->func(); // B::funcが呼ばれる となる。 あとはvector<Base*>にすれば万事解決では。
32 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:09:10 ] boost::ptr_vector だと勝手に delete してくれるから楽だよ。
33 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:43:37 ] >>30 アクションゲームで A:単純な移動しかせず体当たりでダメージを生む敵 B:主人公の位置などを頼りに複雑なアルゴリズムで動き多彩な攻撃をする敵 こんな感じでAの方が圧倒的に必要なメンバ変数が少なく、 かつAの方が数が多いので、Bに合わせてメンバ関数を増やすとメモリを食らってしまうのです >>31 >Base* p1 = new A; AがBaseを継承していると、こんな代入も可能なのですか…… ありがとうございました >>32 ググってみましたが、new演算子を使いまくるなら、便利そうですね 仕様に慣れるよう練習してみます あちがとうございました
34 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 00:44:13 ] 誤字修正 ×Bに合わせてメンバ関数を ○Bに合わせてメンバ変数を
35 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 02:31:06 ] >>33 とりあえず 継承、多態(ポリモーフィズム)、オーバーライド 等を調べるんだ AとBの共通する部分を基本クラス(やinterface)としてくくりだせ
36 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:10:02 ] エピステーメー氏の「C++言語のカラクリ」の話題出た? なめて読んでたら「自己記述の必然性」が全く理解できない。 どうにか「だから単純なC++→C」のコンバーターじゃ駄目なんだよって 一言で説明できないか?
37 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 11:49:30 ] C++をC++で記述できないとだめだということ? 何だかよく分からないな。でもあの人はたまに哲学よりのトンデモを平気で書いたりするから気にしちゃいけないよ。
38 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:02:24 ] Cだけではtrr..catch..throwが実現できなかったって話だろ。 でも話題が古いなあ。
39 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:23:12 ] 自己記述できることが○○だ(スバラシイとか完備だとか) って誰かに刷り込まれたんかな 頭悪いな
40 名前:デフォルトの名無しさん mailto:sage [2008/03/11(火) 12:26:33 ] コードジェネレータ通すとデバッグがやりにくそう
41 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 00:28:22 ] VMのスタック上で記号処理を介せば 殆どの言語は自己記述可能だが と書けばミもフタもないのか
42 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 02:44:49 ] IO機能がないんですがどうすればいいですか。
43 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 05:26:59 ] www.google.com/search?q=iostream
44 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 05:33:36 ] 42は41へのレスなんじゃなかろうか
45 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 05:48:23 ] orz
46 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 10:24:06 ] 自己記述ってどんなの?
47 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 11:16:52 ] ある言語やその処理系でその言語を実行できる処理系を書くことだお
48 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 13:28:47 ] 多分要はメタプログラミングは必要だから出てきたんだ、偶然や酔狂じゃない。 ってことを言いたいんだろ?読んでないけど。
49 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 21:59:43 ] あれ?なんかtemplateで遊んでたらメタプログラミングできちゃったぞ って感じ
50 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:01:01 ] typedef std::map<size_t,Dummy> DummyMap; DummyMap dmap; .... DummyMap::iterator it = dmap.find(index); Dummy& dummy = (it != dmap.end()) ? it->second : dmap[index]; っていうこと(イメージ)をしたいんだが、\ findして、insertすると少なくとも2回の走査が行われていて、無駄な感じがする。 どうすべきか、アドバイスをくだされ。
51 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:02:34 ] 趣旨を間違った。 これじゃ普通にdmap[index]すればいいじゃねーか。 出直してくる。
52 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 22:41:37 ] 韓国人宇宙飛行士が国際宇宙ステーションに搭乗する際の活動に関する日本韓国間の協力について www.enjoykorea.jp/tbbs/read.php?board_id=teconomy&page=3&nid=3433452&start_range=3433445&end_range=3433484 日本の大事な税金で作ったものを何で韓国人にタダでつかわせるんだ! 苦情メールを送ろう! JAXA www.jaxa.jp/pr/inquiries/index_j.html 文部科学省 www.mext.go.jp/mail/index.htm 御意見・お問い合わせ専用メールアドレス voice_atmark_mext.go.jp 全く他人事じゃないんですけど>ロシア 宇宙ステーションをただで使わせて写真とらせるとかいってますが・・ 抗議してくれ。 朝鮮人どもまじで死んでくれ。
53 名前:デフォルトの名無しさん mailto:sage [2008/03/12(水) 23:42:33 ] >>51 定型はこう、かな iterator it = map.lower_bound(key); if(it == map.end() || it->first != key) { it = map.insert(it, Dummy()); } Dummy &d = it->second;
54 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:02:54 ] > it->first != key これは問題なければ良いんだけど、正確にはlessを使えとかそういう話、無かったっけ?
55 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:24:47 ] it->first != key lower_boundの戻り値はpairじゃないよな。確かキーだよな。 ソート基準がデフォのlessならこうか。 if(it != map.end() || !(key < *it)) { //found } else { //not found }
56 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:26:26 ] ||じゃなくて&&だわ if(it != map.end() && !(key < *it)) { //found } else { //not found }
57 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:37:32 ] >>55 lower_bound()の戻り値はpairだよ。 ・・・というより、map<k, v>::value_typeがpair<k, v>だ、と説明するほうが、根本的で適切かな。 std::コンテナ::iteiratorは、std::コンテナ::value_typeのポインタ的に動作するわけだから。 >>53-54 「厳密には」こう書くべき。 if (it == map.end() || map.key_comp()(key, it->first) {
58 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:38:36 ] ごめん訂正。 - map<k, v>::value_typeがpair<k, v> + map<k, v>::value_typeがpair<const k, v>
59 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 00:46:26 ] >>57 ああ、そうだね。elementの型がpairだた。スマソ。
60 名前:デフォルトの名無しさん [2008/03/16(日) 05:51:19 ] テスト
61 名前:デフォルトの名無しさん [2008/03/16(日) 05:55:48 ] class B; class A { B b; }; class B { A a; }; と書いたところ、 エラー出ます><。 どう対処すればいいですか?
62 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 06:04:28 ] よく考えようぜ。 A の中に B がある。 その B の中に A がある。 その A の中に B が・・・ あり得ない。 とりあえず何をしたいのか整理しよう。 大抵の場合は、 1. クラス設計を変更する。 2. a と b のどちらかを参照にする。 のどちらかになる。
63 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 06:31:59 ] haskellを使う
64 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 07:41:30 ] >>61 Aの中に持ちたいのはBそのものじゃなくて、Bの参照なんじゃね?
65 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:02:01 ] >>62 循環して持ちたいのはよくあること。 やるなら>>64 のようにすればいい。 同じような質問見つけてきたんで参考にどうぞ。 www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36231&forum=7
66 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 15:45:33 ] 62にそう書いてるじゃん
67 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 03:49:28 ] くだらない質問で申し訳ないのだけど、どなたか教えてください クラスのコンストラクタで関数名の後ろにつけている初期化みたいなものの意味を教えてください hoge::test() : a(0),b(0),c(0) { ... } この場合だとa=0,b=0,c=0? だとしたらなぜ...のところに書かないのですか?
68 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 04:07:50 ] test
69 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 04:11:10 ] test()じゃエラー出ると思う hoge::hoge() : a(0),b(0),c(0) { ... } のことだよね aが変数だと問題ない?けど aがクラスの場合、aのコンストラクタに0という引数渡すということ。 class a{ public: a(int value); }; みたいなクラスの場合、aのコンストラクタに数値渡さないと作成できないし
70 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 04:29:44 ] 変数とクラス名が同じだとエラー出るや class A{ public: A(int value); }; class hoge { A a; public: hoge() : a(0) { ... } }; ってこと この場合 ...の所に a = 0; って書けない
71 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 08:54:36 ] >>67 前者は初期化で、後者は何らかの初期化、または未初期化で構築の後、代入だな。 どちらでも良い場合はあるけど、意味は明確に違う。 例えばconstが絡んだ場合とか、 class hoge{ const int a; //constなので代入できない。 }; >>69 のようにメンバの構築に引数が必要な場合とか。 未初期化な変数を嫌ったり、デフォルトコンストラクタの後に代入するような 効率の悪さを嫌ったり、色々あるからできるだけ初期化を使う。
72 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:11:47 ] CとC++の違いを徹底解説!みたいな本に Class::Method():field(0),field1(0) { } なんて書いてあってさ、 何だよコンパイラバグってんじゃねーか!とか思ったころがあった
73 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:39:23 ] >>72 本の名前晒しといてくれ。
74 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 10:40:42 ] ていうかさ、constメンバや参照メンバもそうだけど 基底クラスの初期化も、この形式じゃないと出来ないよ。 もちろん、引数なしのデフォルトコンストラクタでの初期化は可能だけど。
75 名前:72 mailto:sage [2008/03/17(月) 11:55:05 ] 「オブジェクト指向言語C++入門 Cとの違いを徹底追求」 これかな。 やっぱり古いのもあってか、<string.h>とか、 namespace、例外の話はまったくなかった。 それ意外と、多少の誤植を除けば、解り安くもなければ解りづらくもない中立的な本だった。 まぁ、今となっては読むべき本じゃないわな
76 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 13:02:50 ] 低レベルな質問は初心者スレでやれ
77 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 15:16:38 ] >>76 おまえが、↓に行け C++上級者が集まるスレ pc11.2ch.net/test/read.cgi/tech/1095113801/
78 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 16:49:26 ] 関数の戻り先アドレスがバッファオーバーランで壊されているようなんですが、どこで壊されているのかが分かりません。 a(){ b(); } b(){ // ログに戻り先アドレスを記録 /* 処理1 */ // ログに戻り先アドレスを記録 /* 処理2 */ // ログに戻り先アドレスを記録 return; } あたりをつけるために、上のように処理の区切りで関数の戻り先アドレスをログにはき出そうと思うんですが、 戻り先アドレスをどのように参照していいかが分かりません。 もし分かりましたら、参照方法を教えてください。 よろしくお願いします。
79 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:02:46 ] 環境に依存します
80 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:17:10 ] >>78 そこまで推測できているならデバッガでスタックにトリガ張ればすぐだろうし、 そうでなくてもコンパイラにスタックのチェックをするオプションがあったりしないか? そもそもバッファオーバフローだと判っているなら関数内のポインタを全部洗えばいいだけじゃん。 # 巨大関数だったらしらねw
81 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:27:32 ] >>79 失礼しました。 Windows2000 VC++6です。 >>80 それが、1ヶ月に1度位しか発生しないエラーなのでトレースが困難なんです。 各所にログを埋め込み、関数から戻ってこないのは確認できたので、戻り先アドレスが壊されているらしいと推測したんです。 次はどこで壊されるかをログに記録し、また1ヶ月待ってみようと思いましてw
82 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:30:16 ] espでも記録しておくとか
83 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 17:46:56 ] >>81 >79の時点でスレ違いだと気付こう。 >そうでなくてもコンパイラにスタックのチェックをするオプションがあったりしないか?
84 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 18:21:17 ] >>83 申し訳ありませんでした。 色々なアドバイスありがとうございました。
85 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:45:50 ] const T &なメンバをもつクラスを作ったんだが、 ひょっとして、コピーする手段がない?
86 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 21:51:54 ] クラス初期化にしかconst T &は初期化できないから まぁなんというか頑張れ
87 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:03:17 ] コピーコンストラクタならおkだが、operator=はダメだろうな
88 名前:デフォルトの名無しさん mailto:sage [2008/03/17(月) 22:47:28 ] const_ca
89 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 00:27:05 ] なんで&があるん? *だけじゃ駄目なん?
90 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:01:24 ] 駄目です
91 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:23:09 ] なんで
92 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:24:56 ] インラインアセンブラ使えばコピーできないことはないだろうが 当然おすすめはしない。
93 名前:デフォルトの名無しさん [2008/03/18(火) 01:32:09 ] 関数gがコンパイルエラーになります。なぜですか?不可解です。 class X { protected: int val; }; class Y : public X { public: void f(Y* p) { p->val = 0; } // OK void g(X* p) { p->val = 0; } // エラー };
94 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:53:29 ] X::valはYから見ればprivate Y::X::valはYから見ればpublic
95 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:55:26 ] あ、いや、privateというべきじゃなくprotectedでいいのかな。どっちだろ。 いずれにせよYからX::valは触れない。Y::X::valなら触れる。
96 名前:93 mailto:sage [2008/03/18(火) 02:05:40 ] >>95 やっぱりそうですか。なんとなく奇妙な言語仕様に思えるのですが。。。
97 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 02:21:17 ] じゃなぜこういう風に難解なルールになっているか逆に考えてみればわかる。 class Y2 : public X { void f(Y* p) { p->val = 0; } }; というXを継承した別のクラスを作ってみよう。YとY2は別のクラスなのでY2から Yのprotected属性のメンバ変数が変更出来てはまずいのに、もしこのような ルールがなかったら上の例で可能になってしまう。 モジュールの隠蔽が破られないように特別なルールが作られているわけだ。
98 名前:93 mailto:sage [2008/03/18(火) 02:33:25 ] なるほど。なんとなくですが、分かりました。
99 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:13:26 ] fseekgでstr.length()分を戻したいのですけど、 単にマイナスをつけて、-str.length()とするとイミフな数値しか出ません。 何でうまくいかないんでしょうか?
100 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 07:39:13 ] 事故解決しました。 length()が返すのはsize_typeで、 size_typeはsize_tのunsigned intみたいだからですね。
101 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 20:26:40 ] 出しかたによる。
102 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 20:37:42 ] >>100 環境依存の話すんなくそったれ
103 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 22:02:40 ] この言語機能多すぎじゃね?
104 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 22:14:29 ] 必要な部分だけ使え
105 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 22:23:31 ] >>102 少なくともsize_typeは符号無しということは標準で決まっている事柄だったと思う。
106 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 23:49:31 ] >>105 unsigned intとどこに書いてある?
107 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 00:00:40 ] お前は何を言ってるの?
108 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 00:22:24 ] >>106 それは規格のどこにも書いていないが、 例えばもし99=100が使っている実装のsize_typeが 仮にunsigned longやunsigned shortだったとしても、 99=100は同じように質問して同じように解決していたに違いない。 たまたま100の使っている実装でsize_typeがunsigned intだったこと以外は 標準C++で普遍的に成り立つ話じゃないか。
109 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 00:24:39 ] size_typeは符号なし整数。 ただしbit数は決まってない。
110 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 06:33:43 ] >>108 頭の悪い子って、「話の行きがかりで登場したディテール」と「そのディテールに依存した話」の違いが わからないから困るよね。 少なくとも、「環境依存の話すんなくそったれ」と「unsigned intとどこに書いてある?」の2レスより、 「でも規格で決まってるのはunsignedってことだけだから注意」とか書くほうが簡潔で有用。 非・馬鹿は最初からこう書く。
111 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 07:24:46 ] size_t が unsigned long のこともよくあるしな。
112 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 09:04:06 ] unsigned short だったりすると -length() しても int 型で普通に負の数になったりして。
113 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 12:28:38 ] std::cinで文字や数値を入力するとバッファに改行文字が残るようで、 その後に std::getline(std::cin, buf, '\n'); とかやらせると残った改行文字だけ読み込んでしまいます。 バッファをクリアする方法がないかと調べてみたのですが、 環境に依存せず確実にクリアする方法はない、という記述がありました。 こういう場合はそもそもstd::cinを使わないようにするのがよいのでしょうか? fgetsとかを代わりに使えば改行文字まで読み込んでくれるみたいなのですが、 std::cinの方がすっきりしたコードになるので、他に問題を回避する方法がないか探しています。
114 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 12:45:02 ] >>113 cin.ignoreを呼ぶとかcin.getを繰り返すとかで十分では?
115 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 12:49:09 ] ああ、なるほど。 この場合はバッファに残るのが改行文字一個だけと分かってるから、それで十分なんですね。 ありがとうございました。
116 名前:デフォルトの名無しさん mailto:sage [2008/03/19(水) 15:15:14 ] cinから一行読み込み+istringstreamで良くね? string line; getline(cin,line); stringstream linestream(line);
117 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:40:59 ] #define Max 1000 みたいなのを、グローバル変数を使って const int Max = 1000; とした方が良い(型指定ができるから)、と読んでる本で出てきました。 色んな所で「グローバル変数はできるだけ使うな」と言われていたのでびっくりしてしまったのですが、 こうやってconstにして#defineの代わりにするのは例外的によく使われるものなのでしょうか?
118 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:46:50 ] defineよりはマシってだけの話。
119 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:52:08 ] グローバル変数の議論とはまた別の話しだろ
120 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:56:36 ] >>117 グローバル変数がダメなだってだけ覚えてて、なぜダメなのか考えたこと無いみたいだね? 大雑把に言うとどこで変更してるか分からないから把握しづらいといったとこです const つけた場合(やろうと思えばできるけれど)変更できないので、そういう害は無い
121 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 15:58:48 ] あほすぎるw
122 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 16:53:57 ] 別の翻訳単位で参照する可能性のある“変数”ならグローバル変数を使う。 別の翻訳単位で参照する可能性のある“数値”なら#define定義のあるヘッダを各自インクルードすればいい。
123 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 17:11:37 ] >>122 なに言ってんの?w
124 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 17:12:31 ] const ついてるやつはグローバル定数と呼ぶべきもの。
125 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 17:17:00 ] >>117 グローバル変数に限らず、「○○はよくない」などと言われる物は絶対にダメという意味ではない。 ○○以外の有効な手段があればそれを選べという意味であって、○○が有効となる限られたケースでは使っていい。
126 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 17:18:31 ] 理由を理解せずに規約に従っても意味がない事の典型だな
127 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 18:31:27 ] >117 基本的にマクロは(特定の使い方以外)使わない方がいい。 マクロはプリプロセスで処理されてしまうため、コンパイルエラー時に酷い目に会う。 グローバル変数も使い方が難しいけど、コンパイラが識別できるものなのでマクロより余っ程マシ。 エラーが発生してもあくまで“変数”なので、マクロと違って識別名が普通に表示されるので トレースしやすい。 因みに言うと、グローバル変数にするかどうかは「その値がどの範囲まで影響するか/正しいか」というのを 考えて決めるべき。プログラム中で一意な定数は積極的にconstグローバル変数にすべきだわな。 ……しかし、こういう「疑問点を自ら追求する力を付ける」のがゆとり教育だったはずなんだけどね。 やっぱり失敗だったのか……
128 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 18:37:15 ] なんで勝手に117をゆとり教育を受けた人認定してるんだよ
129 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 18:41:28 ] エスパーするとC++でなく、Cの人が居ます。 「const リンケージ」でググって下さい。 >>117 C++で、それはただの定数で 変数のように書き換えることは出来ません。 グローバル変数が嫌われる主な理由は、 どこで書き換えられるか、把握し辛いことにあるため、 定数には当てはまりません。
130 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 18:56:40 ] どう見てもゆとりです、本当にありがとうございました。
131 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 20:02:06 ] 1. マクロ定数はアドレスを完全に持たない。 (const 定数はアドレスを取得しようと思えばできるが、 アドレスを取得しさえしなければデータがデータメモリ上に置かれるとは限らない) 2. const 定数は名前空間に所属できる。 (マクロには名前空間がないため、名前被りが発生する可能性が大きい) 3. 値を求めるのに何らかの処理を伴う定数を使う場合、マクロだと毎回コードが埋め込まれてしまう。 (最適化が効く範囲ならいいのだが) 4. const 定数の方がコンパイルエラーが読みやすい。 (マクロの場合、置換後のテキストを元にしてエラーが出力されてしまう) 5. マクロの場合、型を明確に指定するには明示的なキャストが必要になる場合がある。 (見た目の問題でしかないと言われればそれまでだが) 6. ローカルスコープ内であっても、マクロ定数と同名の識別子を作ることはできない。 (作れない方がいいという意見もあるのかもしれないが) 7. const 定数を使うと副作用が一切無いことが明示される。 (キャスト演算子をオーバーロードしているクラスのオブジェクトの場合は例外だが)
132 名前:デフォルトの名無しさん [2008/03/21(金) 11:21:21 ] 質問があります。 動的配列を解放するときは要素数とかバイト数を指定しなくても delete [] p; でokですが、これはポインタpが指している動的配列の先頭バイトの 前に4byteの領域が確保されていて、ここに動的配列のバイトサイズ が格納されているから、delete時にサイズを指定する必要がないと 聞いたことがあります。 しかし、動的配列の総バイト数はわかるとしても、要素のバイト数 の情報はどこに格納されているのでしょうか? int *p; なら1要素のバイト数は4、double *p; なら1要素のバイト数は 8ですが、実行時にこの情報はどこから取得するのでしょうか? ポインタpそのものは先頭1バイトのアドレス情報しか保持して ませんから、こういう疑問をもった次第です。
133 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 11:30:24 ] ポインタそのものにそのアドレスに何が格納されてるかの情報は含まれてる。 そうでなければ cout << *p << endl; とかやったときに何が表示されるか未定義になってしまうじゃないか。
134 名前:デフォルトの名無しさん [2008/03/21(金) 12:15:53 ] >ポインタそのものにそのアドレスに何が格納されてるかの情報は含まれてる。 ありがとうございます。 ポインタは、単に先頭バイトのアドレスを格納する4バイトの記憶 場所をもっているだけでなく、動的データ(または動的配列の要素) のバイト数とか、データが文字なのか、整数なのか、実数なのか、 といった情報も裏側にもっている。これらの情報はポインタが指す 動的変数や動的配列側にではなく、ポインタ側にある。 という理解でよろしいでしょうか?
135 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:21:02 ] >>134 違う。ポインタの型によって静的に決まる
136 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:21:50 ] 静的に型付けされてるからそんなものは要らない。
137 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:23:04 ] まさかvoid*をdeleteしてないよな… あとポインタが4バイトとは限らないぞ。
138 名前:デフォルトの名無しさん [2008/03/21(金) 12:30:09 ] うーん、わからなくなってきました。 文字型変数、整数型変数、実数型変数がコンパイル時に静的に 型付けされているのと同じというのは概念的にわかります。 しかし、自分が質問しているのは、その静的な型付けをどのよう なしくみで実装しているのか?ということだろうと思います。 この段階にくると、コンパイラやアセンブラが理解できないと 無理なんでしょうけど。
139 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:50:07 ] 実行時に要素のバイト数は、どこにも格納されてない。 と、考えて良い。 コンパイルする時点では、当然型が分かるので、それを使う。 この段階というか、かなり基礎。 ※RTTIは上記が理解出来た上で。
140 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 12:59:28 ] >>138 いっぺん、自作クラスにoperator newとoperator deleteを実装してみればいいんじゃないかな。 乱暴な説明だけど、C++には「確保/削除するバイト数を受け取る、new/delete一族の大ボス的存在」である ::operator new(size_t)と::operator delete(void*, size_t)があって(他にも多重定義があるけど、とりあえず今はこの2例)、 たとえば int* p = new int; なんてのは、int* p = ::operator new(sizeof(int)); みたいにコンパイル時に解釈される。 同じく、後にdelete p; が出てきたら、pがint型のポインタなのはコンパイラにはわかるから(てか俺等にだってわかる)、 こっちは ::operator delete(p, sizeof(int)); になる。
141 名前:デフォルトの名無しさん [2008/03/21(金) 13:24:09 ] >>138 >int* p = new int; なんてのは、int* p = ::operator new(sizeof(int)); int *p= new int [100]; は int *p=::operator new(sizeof(int)*100); みたいになるんでしょうけど、要素のサイズが2バイトなのか4バイト なのかの情報をコンパイル時にポインタに付加しておかないと、p[i]の アクセスがうまくいかないのではないかと思うのですが、どうでしょうか?
142 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:25:59 ] >>141 p[i]のpの型はコンパイル時に分かってるんだから
143 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:44:43 ] まあ、強いて言えば、生成されたコード内に埋め込まれているって感じなのかな。 delete[] p;するときに、各要素のデストラクタを起動しなければならないわけだけど、 要素数は p = new T[count]; のcountで、実行時に変わる可能性のあるものだから、 ポインタの前かなんかに隠しておかなければならないわけ。 ちなみに、メモリブロックを単純に解放するだけなら要素数を隠しておく必要はないよ。 free()にサイズを指定しないでしょ? メモリマネージャはメモリブロックの総バイト数をどこかに隠しておくかもしれないけど、それは別の話。 あとは、 T *p; for(size_t i = 0; i < count; i++){ p->destruct(); ++p; //←これ } これの++pがどうコンパイルされるかという、>>139 が言うようにC言語レベルの基本的な話。
144 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 13:56:21 ] >>141 > p[i]のアクセス たとえばintが4byteの環境だとすると、p[i] と書かれた箇所はネイティブコードにおいては 「pのアドレス+i*4byteのメモリアドレスへ行ってそこから先4byte分に書き込まれているビット配列を〜」 という風に、既にintが「4byte」というミもフタも無い表現に変わっているから、型情報も何も関係無いよ。
145 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 14:27:51 ] >>141 p[i]というコードはコンパイルすると、アドレスはp+4*iといった意味の命令が生成される。 4が出てくる理由はpの宣言int* pによるもの(intが4byteの環境の場合)。
146 名前:145 mailto:sage [2008/03/21(金) 14:36:28 ] すまん、144と同じ事書いてしまった。
147 名前:141 [2008/03/21(金) 17:03:54 ] 返事が遅くなってすみません。みなさん、ありがとうございます。 >>144 さんと >>145 さんの説明で 4byteという要素バイト数の情報をポインタp自体が保持して いるのではなく、p[i]にアクセスする際にコンパイラがp+4*i を計算する命令を生成しているだけ、ということがやっと理解 できました。
148 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 18:35:45 ] 配列 new の場合、アップキャストは行わないから 配列のサイズは型から静的に決まる、と。 というか、アップキャストはできない。 そこが鍵だな。
149 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 18:36:13 ] ×配列のサイズ ○要素のサイズ
150 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 18:44:36 ] C++ 的にはフォーマットの決まった string の中から数字を 読み出したりするにはどうするのがお薦めなのでしょうか? 例えば string s("# foo 30 bar 0.1 xlajkdfl;ajkds"); から 30, 0.1 を抜く場合。 int n; double x; sscanf(s.c_str(),"# foo %d bar %lf",&n,&x); としたりするのですが、もっと「本来」の方法はあるのでしょうか? どうも workaround 的な気がするので。
151 名前:デフォルトの名無しさん [2008/03/21(金) 18:48:30 ] atofで一つずつ進めて数値になる所を取り出す
152 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 18:51:36 ] それはないな
153 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 19:53:08 ] 自分で字句解析器を書く。
154 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 20:00:28 ] 各種正規表現ライブラリの後方参照を使う
155 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 20:29:16 ] >>150 そういうのが必要になる状況ってあまり無くない?
156 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 21:08:24 ] >>155 俺はソースコード解析したい時によくでる。 字句解析ライブラリもってこいって話だよな・・・
157 名前:デフォルトの名無しさん mailto:sage [2008/03/21(金) 21:51:06 ] 字句解析なら分かるんだけど、>>150 は何か違う気がしたんで・・・ そうなら、分割の話から入るだろうし。 もしかして自然言語文からの抽出とかかな?
158 名前:150 mailto:sage [2008/03/21(金) 23:35:25 ] 皆様どうもありがとうございました。私は結構こういう必要に出会います。 主にデータファイルをフォーマットし直したり、それを処理する場合です。 例えばデータフォーマットの情報などた先頭にあったりして、その情報を 元に解析したりする場合です。無視して決め打ちする事も可能な場合も多い ですが、安全性のために整合性をチェックしています。 >>154 さんの方法が私には合っていると思います。普段 Ruby とかも使って いて正規表現も使っているのに惰性で C 的にを使い続けてる自分の頭の堅さ には呆れました。基本的に以下のようなコードで対応することを考えています。 まだあまり考えていないのでもう少しエレガントに書けるだろうとは思います。 string s("# foo 30 bar 0.1 xlajkdfl;ajkds"); boost::regex r0("^# foo ([0-9.]+) bar ([0-9.]+).+"); boost::match_results<std::string::const_iterator> mr; if(boost::regex_match(s,mr,r0)){ const int n = boost::lexical_cast<int>(mr.str(1)); const double x = boost::lexical_cast<double>(mr.str(2)); cout << n<<"\t"<<x<<endl; }
159 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 00:19:27 ] >主にデータファイルをフォーマットし直したり それまさに字句解析の範疇な気がするけど・・・w まぁ正規表現で簡単に済めばそれで良いと思うけどね。
160 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 12:44:30 ] >>159 > まぁ正規表現で簡単に済めばそれで良いと思うけどね。 regex ってかなり強力だと思う。テキストから情報拾う場合 に regex では簡単に通用しない場合ってどういうケース?
161 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 13:14:39 ] >>160 ネストした括弧の対応を取るとか
162 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:07:16 ] そこでboost::xpressiveですよ
163 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:15:50 ] boost もいろいろあってわからんなぁ。xpressive だと簡単なのかな。 俺だと char ごと読み取って '(' ')' を +1, -1 でカウントするとか 低レベルな事を考えちゃうけど。
164 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 14:52:00 ] 通常の正規表現では任意のネストを表現することができない。 →xpressive ではパターンの自己再帰記述が可能。 →正規表現の枠を超える表現力を持つ(文脈自由文法)。 →xpressive だとネストの対応が可能。
165 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 15:01:28 ] boostの文字列処理ライブラリの事ならboost本のサンプルで読めたな
166 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 15:21:10 ] boost 本でお薦めってある? 本あまり出てないよね。 Karlsson の本は目を通したけど感じは判ってよいけど便利な本 という感じではない。秀和から出てる稲葉さんは本厚いし内容あるのかな。
167 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:31:22 ] inabaさんのは導入+軽いリファレンスにはいいかも おおまかな概念と使用例が載ってる boostもう使ってるよ〜という人にはあまり必要ないかも
168 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:31:23 ] 複数の派生クラスがそれぞれ値の異なるconst staticなメンバ変数をもっていて、 基底クラスへのポインタを使って読み取りたいのですが、どうすればいいでしょう 基底クラスへのポインタの配列に、いろいろな派生クラスを突っ込んでいる状態なので、 直接アクセスすることは出来ません
169 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:49:42 ] ttp://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/virtual.html
170 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:54:12 ] >>166 C++ Template Metaprogramming
171 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 17:56:20 ] >>168 普通に仮想関数で struct Base { virtual StaticMemberType GetStaticMember()=0; }; struct DerivedA : public Base { StaticMemberType GetStaticMember { return DerivedA::staticMemember; } }; あるいはRTTI使ってマルチメソッド。
172 名前:171 mailto:sage [2008/03/22(土) 17:59:13 ] ごめん引数1つのマルチメソッドはないなw
173 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 18:22:26 ] あー、関数をアクセサにすればよかったですね。何やってんだ俺 ありがとうございました
174 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 21:56:34 ] >>170 どうもありがとうございます。実はその本は持っていて次に読む予定。 しかし、これも洞察には優れているとは思うけど、便利な本では ないかも。面白そうなんで期待してるけど。
175 名前:デフォルトの名無しさん mailto:sage [2008/03/22(土) 22:03:15 ] >>174 面白くないよ。mplの単なるリファレンス。
176 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 00:53:31 ] DLLを読み込み、一部の機能のみを使った場合、 メモリの消費量はまるまるDLL分増えるのでしょうか それとも使った機能の分だけ増えるのでしょうか
177 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:03:35 ] 環境依存の話はスレチだけど、まるまる増えると思うよ。
178 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:12:30 ] 仮想メモリはまるまる 物理メモリはコードについては使った分 データはシラネ
179 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 01:30:13 ] ありがとうございました 使いたいライブラリが8MBくらいあるもので、 まるまる増えるのはちょっとアレかな、と思って質問しました 改変可なので、必要な部分だけ取り出そうと思います
180 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 03:06:24 ] Managerクラスがあり その機能は、一部のクラス(と言っても10個ぐらいある><) にしか利用できないって設計の場合 一部のクラスをfriendする以外に何か方法はありませんか?
181 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 03:13:01 ] その一部のクラス以外はmanagerクラスのインスタンスを手に入れられないようにする。
182 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 09:41:11 ] >>180 freind じゃダメな理由を書いた方が答えが得られやすいと思う。
183 名前:>>182 mailto:sage [2008/03/23(日) 09:42:51 ] ミスった... orz freind ⇒ friend
184 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 09:45:07 ] friend先に依存が出来るからじゃね? 普通、friendは最終手段だし
185 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 12:07:26 ] そんなことはない。
186 名前:>>182 mailto:sage [2008/03/23(日) 13:05:05 ] friend 先に依存って何?
187 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 13:58:48 ] 一部のクラスだけ特別扱いするというのがManagerクラスの仕様なら、 friendによる依存は妥当だと思う。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:45:51 ] 一部のクラスの基底クラスとして Manager を取得するクラスを作って、 その1つだけを friend にすれば?
189 名前:180 mailto:sage [2008/03/23(日) 14:58:22 ] friendが結構な数になってしまうんです。 下手すれば私のリアルfriendより多いぐらい それが悔しくて
190 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 14:59:16 ] 誰が上手い事を言えと
191 名前:184 mailto:sage [2008/03/23(日) 15:01:24 ] 俺は181に一票で
192 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:02:43 ] その方法を聞いてるんだろw
193 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:09:28 ] パスワード掛ければいいんじゃないですかね
194 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:14:48 ] w
195 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:25:03 ] 権限プログラミングってのも面白そうじゃないか
196 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 15:42:23 ] singletonなら簡単なのにな
197 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:01:39 ] 思い出したw ____ |← reject| boostの中の人 singleton ユーザー . ̄.|| ̄ ̄ ┗(^o^ )┳(`Д´)┳(^o^ )┛≡=- || ┏┗ ┗┗ ┏┗ ≡=-  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
198 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:06:07 ] ユーザーは欲してると思うが
199 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:34:52 ] にわかに得た知識で面白いこと考えた! Managerのインスタンスを受け取る関数の引数に関数オブジェクトを使って 内部で一定のアルゴリズムで正しい値を返すもの(パスワードの暗号化みたいな)にのみそのインスタンスを渡してやる風にすればいいんじゃね? 更にインスタンスを受け取る関数をテンプレート化してやり、欲しい権限までのクラス型インスタンスを返すようにしてやればアクセス制限も出来て完璧! とここまで考えてわざわざこんなことしてもオーバーヘッドが大きいだけなことに気づいた そもそも何の意味があるんだっけか
200 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 16:45:12 ] だから >>188 でいいだろ、別に。
201 名前:デフォルトの名無しさん [2008/03/23(日) 16:57:35 ] Managerクラスコンストラクタなどをprotectedにして、使うクラスはManagerを継承する。
202 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:02:41 ] >>188 >>199 >>201 これらの方法は、Managerクラスの許可なく好き勝手に権限のあるクラスを作れる。 そういうのを>>180 は制限したいんじゃないの?
203 名前:>>182 mailto:sage [2008/03/23(日) 17:08:28 ] >>201 そう言うのは最悪。 あとから見て、継承が本当に必要だったのか、単に特定のメソッドを 使わせるために継承しているのかがわからなくなるから。
204 名前:201 [2008/03/23(日) 17:21:39 ] >>203 意味がよく分からないけど、、、「特定にメソッドを使わせるために継承が必要かどうかがわからなくなる」ってこと? そんなこと言ってたら何もできない。 friendだったら、なぜfriendにしたか分からなくならないの? friend よりいいと思うけどな。 friend じゃprivateのメンバにアクセスできてしまう。 Managerクラスを機能を利用するんだから、継承しかないでしょ。 使う側のクラスに持たせるとなると、コンストラクタとかはpublicになってしまうし。
205 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:40:32 ] 継承すると Managerの中のstaticでない変数とか勝手に作られない?
206 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:41:03 ] >>203 Manager クラスじゃなくて単に許可コントロール用の class を作る というのは有りじゃない?そういう例をまともな本で見た記憶がある。
207 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:42:27 ] -カーズは- 2度と地球へは戻れなかった…。 鉱物と生物の中間の生命体となり 永遠に宇宙空間をさまようのだ。 そして死にたいと思っても死ねないので ―そのうちカーズは考えるのをやめた。 全部globalにすればいいじゃん
208 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:44:01 ] >>206 電波の缶詰の人のサンプルもそうだった ライブラリ的なものを 外部からいじられないようにするためだったら そんな感じでもいいんじゃまいか 村八分
209 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 17:47:19 ] Managerインスタンスを受け取るために、Managerにコールバックしてもらえばいいんじゃない? class FriendClassA; // 前方宣言 class FriendClassB; class Manager { public: class Friend { public: virtual void authorize(Manager* m) = 0; }; void getInstance(Friend* p) { if( dynamic_cast<FriendClassA*>(p) || dynamic_cast<FriendClassB*>(p) || /* 権限のあるクラスかをチェック */ ) { p->authorize(this); } } };
210 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:25:34 ] それは、インスタンス取るのに時間かかるし friendでいいじゃんって話になるも
211 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:40:51 ] 速度が重要ならtemplate部分特殊化とかで。 class Manager { public: template <class Unauthorized> static void authorizedProc(unauthorizedClass * p) { std::cout << "not authorized" << std::endl; } template <> static void authorizedProc(authorizedClassA * p) { p->Proc(m_instance); } // 以下許可するクラス分同じコード private: Manager m_instance; }; 冗長だし検証してないけど。
212 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:45:30 ] Manager を使えるクラスを作成する場合には ファクトリクラスを通すようにする。 で、そのファクトリクラスを friend にして、 そこで Manager クラスを取得して、 各クラスにそれを渡すようにする。 設定関数は各クラスの共通基底クラスに作って、 それをファクトリクラスの friend にする。
213 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:46:54 ] 先輩から聞いたのですが、extern "C" {}せずに構造体を宣言すると、 余計なクラス情報がくっつくって本当ですか?
214 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:52:41 ] そんなことは聞いた事が無いが、 特定のコンパイラでそういう事があるとかいうんだったら俺は知らない。
215 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:55:11 ] クラス情報って具体的には何なんだ?
216 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:57:34 ] >>213 マングリング名にクラス情報がくっつくって話だと思う。
217 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 18:59:55 ] >>214-216 言ってたのはシリコンバレー帰りの先輩です 純粋なCの構造体にするにはやはりextern "C"が必要なのですね。 ありがとうございました。
218 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:00:36 ] >>217 どこからそういう判断をしたんだ?w
219 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:01:52 ] 構造体にextern "C"は関係無いだろ
220 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:02:10 ] >>216 構造体名って C でそもそも何らかのマングリングされるの?
221 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:07:59 ] C++なら名前空間やらなんやらくっつくだろ。
222 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 19:10:41 ] C で付かないなら 純粋な C の構造体かどうかなんて どう区別するんだろうか。
223 名前:>>182 mailto:sage [2008/03/23(日) 19:46:38 ] >>204 まじめな話、もう一度継承についてちゃんと勉強した方がいいと思う。 (>>205 の内容を理解できてる?) 継承はアクセス制限のためにあるものじゃない。 極端な話、全てが public であったとしても、継承は有用。 これに対して、friend は純粋にアクセス制限を回避するもので、かつ アクセス制限を回避する以外の機能は無いから、なぜ friend にしたか がわからなくなることはない。 (もちろん、なせアクセス制限を回避する必要があるかはどっかに書いて おく必要があるだろうけど。) >>206 それならアリだと思う。
224 名前:201 [2008/03/23(日) 19:54:02 ] >>223 >>205 作られるけど。外から参照されたくないものはpublicにしなけらばいいじゃん
225 名前:201 [2008/03/23(日) 20:00:37 ] >>223 >継承はアクセス制限のためにあるものじゃない。 >極端な話、全てが public であったとしても、継承は有用。 だから、継承が駄目なんですか? 継承は色んな意味で使えて「わかりにくい」から駄目ってこと?
226 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 20:00:37 ] 何かもう駄目だなここって思ったの俺だけだろうか
227 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 20:02:29 ] Manager 使ってる部分を別プロジェクトにする。 あとは各クラスのオブジェクト生成を外部から隠せばいい。
228 名前:>>182 mailto:sage [2008/03/23(日) 21:01:54 ] >>224 > 作られるけど。外から参照されたくないものはpublicにしなけらばいいじゃん おいおい、ほんとにもう少し勉強してからこいよ。 引っ込みつかなくなってるだけならいいけど、マジでそう思ってるとしたら ちょっとまずいよ。 まずい理由の一つは、private でもその変数が見えなくなるわけじゃない、 アクセスできなくなるだけだから。 この違いわかってる? >>225 > 継承は色んな意味で使えて「わかりにくい」から駄目ってこと? >>203 に書いたのはそう言うこと。 それしか方法が無いならしょうがないけど、friend と言うもっといい方法があ るのにわざわざ使わないのは、別の意図があるようにとられる危険性が高い。
229 名前:201 [2008/03/23(日) 21:17:23 ] >>228 >マジでそう思ってるとしたらちょっとまずいよ。 Managerを継承していないクラスから参照されたくない場合はpublicにすれば良いって事だよ? >まずい理由の一つは、private でもその変数が見えなくなるわけじゃない、 >アクセスできなくなるだけだから。 「見える」→メンバ変数の値が取得できる。(getter) 「アクセス」→メンバ変数の値が書きかえれる。(setter) って意味で言ってるのなら getter、setter定義してやれば、当然見えるしアクセスも可能。
230 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 21:42:53 ] もしかして201氏は、 Managerは1つのクライアント(Managerを使うクラスオブジェクト)の管理のみ引き受けるもので、 クライアントと同数のManagerオブジェクトが必要と考えているのではないだろうか。
231 名前:>>182 mailto:sage [2008/03/23(日) 22:07:14 ] >>229 > 「見える」→メンバ変数の値が取得できる。(getter) > 「アクセス」→メンバ変数の値が書きかえれる。(setter) ほら、全然理解できてない。 簡単な例でいうと、 int a, b; class X { private: int a; }; class Y: public X { int foo(){ return a; } int bar(){ return b; } }; ってやると、foo() の中で X::a をアクセスしようとするからエラーになるよね。 もし、C++ の private が変数を「見えなくする」なら bar() の b と同じように、 foo() は ::a を返すはずだろ? これが、「見えなくなること」と「アクセスできなくなること」の違いなわけ。 これによる、影響は自分で調べてみてね。 >>230 まあ、それはそれでそれこそもっとよく考えろとしか言えないわけだが...
232 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 22:11:42 ] 何でこんな残念なスレになってしまったんだ。
233 名前:デフォルトの名無しさん [2008/03/23(日) 22:12:43 ] だって にちゃん だもの
234 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 22:56:01 ] VSyncの話したらひどいことになりそう
235 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 22:57:56 ] >>231 初心者スレでやれ ウザイ
236 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:03:27 ] 結局>>182 って文句言ってるだけで答えて無いじゃん
237 名前:>>182 mailto:sage [2008/03/23(日) 23:14:58 ] 答えは >>188 で既にでてるだろ。 まあ、10個ぐらいなら全部 friend 宣言してもいいと思うけど。 もしかして君も >>201 みたいに理解できてないやつなの? (w
238 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:32:29 ] >>188 だとManager::getInstanceみたいなので取得するのと大差無いと思うが・・・ まぁ、それはともかく、>>180 にfriendなどを使ってまで 制限する必要性があるのか、疑問だな。 クラスごと使わせなくするとこにfriendを使用している時点でおかしいと思う。 無名名前空間やdetails名前空間で十分なんじゃないか?
239 名前:201 [2008/03/23(日) 23:44:18 ] >>231 >foo() の中で X::a をアクセスしようとするからエラーになるよね。 アクセッサをManagerの方に定義することを考えていたんだけどな。 「見える」「見えない」の話じゃんくてprivateだからだろ。 >もし、C++ の private が変数を「見えなくする」なら bar() の b と同じように、 foo() は ::a を返すはずだろ? グローバル変数よりメンバ変数を参照しにいくのは知ってます。 Managerの方に「一部のクラス」に使わせたい機能だけ、protected または public にして 一部のクラスがManagerを継承すればいい。 Manager のprivateのメンバには「一部のクラス」も参照できない。 「一部のクラス」以外にManagerクラスのインスタンスを作られるのが困る場合は コンストラクタなどをprotectedにすればいいんでは? 「一部のクラス」に対してManagerは一つらしいので、また違ってきますが・・・・
240 名前:デフォルトの名無しさん mailto:sage [2008/03/23(日) 23:58:52 ] これで friend いらない -- friends.cpp #include "A.h" #include "B.h" namespace { class Manager {}; Manger& manager(); } void A::f() { manager().a(); } void B::g() { manager().b(); }
241 名前:>>182 mailto:sage [2008/03/24(月) 00:06:26 ] >>238 > まぁ、それはともかく、>>180 にfriendなどを使ってまで > 制限する必要性があるのか、疑問だな。 それは、>>180 に聞いてもらわないとダメだけど、そう言う状況はありえると思うよ。 例えば、デバッグのためにマネージャの状態を直接見たりいじったりするクラスとか。 ただ 10個もあるのは、ちょっと多すぎるような気はするけどね。 >>239 頼むから、もう少し勉強してからレスしてくれ。 全然俺の言ってることが理解できてないよ。
242 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 00:08:40 ] で、アホなのはどっちなの?初心者なのでよく分かりません
243 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 00:51:50 ] >>242 やり方は色々ある。って話に落ち着けていいんじゃないのw メイヤーズもそんなことeffective c++に書いてたでしょ。
244 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 05:56:56 ] >>242 「そいつの中にあるもの」の質はともかく、 「そいつの中にあるものを説明する能力」はどっこいどっこいです。
245 名前:デフォルトの名無しさん [2008/03/24(月) 17:47:39 ] 仮想関数を持たないクラスXとクラスYがあります。 YはXを継承しています。これらのクラスに対応する インターフェイスのクラスIXとIYを以下のように定義しました。 しかし、コンパイルエラーでした。クラスYは抽象クラス とみなされたようです。でも、クラスYはf()の定義も g()の定義も持っているので抽象クラスではないように思えます。 XとYのインターフェイスを作る方法を教えて下さい。 class IX { virtual void f() = 0; }; class X : public IX { void f() {} }; class IY : public IX { virtual void g() = 0; }; class Y : public X, public IY { void g() {} }; int main() { Y y; // エラー(抽象クラスあるいは構造体のオブジェクトが宣言されています) return 0; }
246 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 17:54:22 ] IX IX ↑ ↑ X IY ↑↑ Y という継承木になっている。 X::IX::f は定義されているが、 IY::IX::f は定義されていない。 インタフェースクラスを作るなら、IX を仮想継承する必要がある。 ただ、それでも Y で f を定義する必要がある。 あと、インタフェースクラスに限らず、基底クラスには 必ず仮想デストラクタを定義するのを忘れないように。
247 名前:デフォルトの名無しさん [2008/03/24(月) 18:14:09 ] >>246 ありがとうございます。 以下のように変更したらエラーが警告になりました。 この警告は無視していいような気がします。 >あと、インタフェースクラスに限らず、基底クラスには >必ず仮想デストラクタを定義するのを忘れないように。 OKです。 class IX { virtual void f() = 0; }; class X : virtual public IX { void f() {} }; class IY : virtual public IX { virtual void g() = 0; }; class Y : public X, public IY { void g() {} }; int main() { Y y; // 警告('Y' : 2 つ以上のメンバが同じ名前を持っています。'X::f' から継承します。) return 0; }
248 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 18:50:40 ] Y::f では X::f と IY::f のどっちの実装を使えばいいのか分からないというもの。 まあ、今回の場合は IY::f に実装がないから X::f を使いますよという警告だけど、 Y に void f() { X::f(); } と書いておくのが無難。
249 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:06:35 ] class T { T( int ); } を T *T_array = new T [100]; は出来ないじゃん? #placement new使えってのはなしで。 std::vectorはどうやってこういうコンストラクタが引数を持ってるクラスを受け入れてるの?
250 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:07:20 ] placement newで
251 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:11:33 ] >>248 上の例では void f() 1個だけですが、実際のIXは純粋仮想関数を 22個もっています。Yに22個の関数をわざわざ定義するのはなんだか 無駄な気がするのですが。。。
252 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:18:29 ] >>251 まあ、面倒なら今のところは無視してもいいかもしれない。 コメントでも書いとこう。
253 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:26:44 ] >>241 頼むから、もう少しまともな説明してくれ。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:31:33 ] >>252 わかりました。ありがとうございました。
255 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:31:46 ] friend 使うと「一部のクラス」が増えるとManagerも弄らないと駄目だな。
256 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 19:34:11 ] 拡張性を敢えて犠牲にするなら、個別に friend するしかない。 拡張性もある程度考慮するなら基底クラス作ってそれだけ friend 。 あとは本人がどうしたいか、だな。
257 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 20:12:41 ] >>253 非常に初歩的な内容だし、あの説明で理解できないなら、 もうあきらめた方がいいぞ。
258 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 22:58:50 ] IDすら出ない板で煽り煽られ大変ですな
259 名前:180 mailto:sage [2008/03/24(月) 23:04:33 ] 私の為に喧嘩しないで><。
260 名前:デフォルトの名無しさん mailto:sage [2008/03/24(月) 23:59:31 ] struct B{ struct P{ B *temp; } B( P p ){ swap( *this, *(p.temp) ); } operator P (){ P p; p.temp = this; return p; } }; B Return(){ return B(); } void Accept( B &b ){}; ------------ Accept( Return() ); //Error 俺、何間違えてるの?
261 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 00:06:50 ] 設計?
262 名前:デフォルトの名無しさん [2008/03/25(火) 00:07:13 ] エラーメッセージはキチンと書く
263 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 00:09:50 ] ;
264 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 00:11:00 ] 質問の仕方
265 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 00:11:54 ] >>263
266 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 00:11:55 ] Bにデフォルトコンストラクタないからとか?
267 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 01:12:43 ] Humanクラスを基底クラスとするTanakaやAsouやIshikawaクラスがあるとします Humanは抽象クラスとして用いるつもりです このときHumanにあるstaticメソッドを一回だけ呼び出したいときってどうすればいいでしょうか? Humanのコンストラクタで呼び出したとすると、TanakaやAsouのコンストラクタでも呼び出されますよね static bool initのような変数をフラグとして使う方法は思いついたのですが、 もっとスマートな方法はないのでしょうか?
268 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 01:16:38 ] シングルトンやそれに関わるC++の実装は非常に面倒くさくて 自分で一からやろうと思うとどうしても乱雑になる。 マルチスレッドが入ってくるともっと面倒くさくなる。
269 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 01:25:21 ] >>260 人生、かな?
270 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 01:49:26 ] >>267 そのメソッドを呼び出したいのは、Human派生のオブジェクトを生成したタイミングなの?
271 名前:267 mailto:sage [2008/03/25(火) 02:13:35 ] >>270 そうですね Human派生のオブジェクトを生成する前に呼び出しても構わないのですが
272 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 02:30:23 ] >>271 であれば、全てが始まる前に自分で一度だけ呼ぶのが良いと思うな。
273 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 02:31:52 ] >>272 それはstaticな変数をフラグにするよりダメじゃねぇかw
274 名前:267 mailto:sage [2008/03/25(火) 02:39:11 ] >>272 あぁそうか、そもそもstaticなメソッドなわけだから int main(){ Human::onlyOnceCalled() みたいなかんじで 最初の方で適当に呼んでおくってのもありかもしれませんね 一回だけしか呼ばないって保証がないような気もしますが
275 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 02:49:38 ] >>274 必ず最初に読んでしまってよいなら、クラスにスタティックなメンバを定義して それの初期化の中で実行させてみては? // human.h class Human() { // 中略 class Initializer { Initializer() { onlyOnceCalled(); } }; static Initializer init; }; // human.cpp Human::Initializer Human::init; 文法間違ってたらすまん
276 名前:275 mailto:sage [2008/03/25(火) 02:51:47 ] Human::Initializerのコンストラクタがpublicになってないとか、いろいろダメだorz そこは適当におぎなって
277 名前:267 mailto:sage [2008/03/25(火) 03:01:51 ] >>275 なるほど。こういう方法もあるんですね 勉強になりました ありがとうございました
278 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 03:05:20 ] 保証が欲しかったのか。失礼。 initialization orderを気にするならこんな感じかな。 class Human() { class Initializer { Initializer() { onlyOnceCalled(); } public: static void Initialize() { static Initializer instance; } }; }; これで、Initializer::Initializeを呼んだタイミングで一度だけ初期化されるようになるよ。ただしこの場合は複数スレッドとかが動き出す前に呼んでね。
279 名前:260 mailto:sage [2008/03/25(火) 09:32:50 ] ぇ?コンパイル通る? gccだと通らないんだけど・・・
280 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 09:53:30 ] >>279 どこを見てそう思うんだよ・・・ 指摘してくれてるだろ >>263 >>266 あとAcceptがReturnの返す一時オブジェクトを参照してるから何とかしよう
281 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 11:14:49 ] >>279 まずは省略や手抜きをせずに、Bの定義を全部書け。 そして何をしたいのかはっきりさせろ。
282 名前:260 mailto:sage [2008/03/25(火) 16:02:29 ] いや、やりたいことは下のやつを知りたかっただけ。 ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E6%89%80%E6%9C%89%E6%A8%A9%E7%A7%BB%E5%8B%95%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF (Move_Constructor) に書いてあることってnon-const referenceを受けるべきとろこに一時オブジェクトを渡せるって話だと思って、 渡してみたらコンパイラ通らないどーん。な状況。
283 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 16:44:42 ] >>282 これで通った struct B{ struct P{ B *temp; }; B(){} B(P p){ swap( *this, *(p.temp) ); } operator P () { P p; p.temp = this; return p; } }; B Return(){ return B(); } void Accept( B b ){}; int main(){ Accept( Return() ); }
284 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:14:20 ] 参照渡しから値渡しに変更した理由が分からん
285 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:18:44 ] 抽象クラスのメソッドの定義で質問があります 抽象クラスにおいて、自分自身のクラスへのポインタの引数を取るメソッドは不可能なのでしょうか? たとえばこういうコードです class Human { void foo(Human *human) = 0; }; コンパイルエラーになってしまいますが、なぜそうなるのか分かりません 抽象クラスだから、インスタンスを作れないので void (Human human); のようなメソッドはだめですよね、でもポインタならいけると思うのですが
286 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:20:52 ] B::operator P()の戻り値から構築されるBの一時オブジェクトは非const参照のAccept(B&)では受け取れないんじゃ?
287 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:23:26 ] その発送は無かったわ、thisポインタというものが(ry virtual書いてみたらどうかな?
288 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:27:02 ] 一時変数を値渡しする理由は?const参照にしない理由が分からない。
289 名前:285 mailto:sage [2008/03/25(火) 17:32:20 ] >>287 すいません元のコードではvirtualをつけてました thisポインタは分かるのですが、この抽象クラスを継承したクラスの間でやりとりしたいことがあるのです 不勉強なので間違ってるかもしれませんが、「関連」というのをやりたいのです。 >>285 の例でやるなら、一般的にはHumanクラスにHuman *hoge;みたいなポインタをメンバに持たせて関連付けするそうですが 関数の引数でやれないかと思いまして
290 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:35:09 ] >>288 const参照でもいいかもしれないけど、それ以上所有権を動かせなくならない?
291 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:45:20 ] Acceptに入ってからも譲渡するなら、 void Accept(B& b) {} B b = Return(); Accept(b); の方が良くないかな、それ以前に何のためのPなんだ?
292 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:47:47 ] >>285 どういう一般的例なのかちょっと分からないけど、 処理と情報を分ける実装の方が個人的にはスッキリするかな んで、そのプログラムvirtualつけてエラーが出る理由が分からないんだけど…
293 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 17:49:24 ] あぁ、失礼した、operator Pはconst守るようにしてるのね ごめん、俺が悪かった
294 名前:292 mailto:sage [2008/03/25(火) 18:06:34 ] >>292 すいませんすごく単純なクラスを作り直し、実験してみると、エラーはでませんでした。 「抽象クラスをインスタンス化することができません」というエラーメッセージだったので、 質問させていただいたのですが、おそらく他のところにエラー.の原因があると思うのでもう一度見直してみます
295 名前:294 mailto:sage [2008/03/25(火) 18:09:51 ] >>294 の名前欄は>>285 の間違いです
296 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 19:45:31 ] auto_ptrはauto_ptr_refクラスを介して対処している。 もう知っているかもしれないけど、 C++0xでは非const参照でも一時オブジェクトを受けられるようになる(右辺値参照)。
297 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:07:18 ] move semantics と rvalue reference &&
298 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:23:46 ] 右辺値参照は何度もこのスレでも話されてるけど理解できん。
299 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:33:41 ] エラー出る出る言うなら、同じエラーが出る小さいプログラムを示せよ。 BやらPやらの例も、そもそもswapがないでコンパイル止まるしな。
300 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:34:02 ] 右辺値及び左辺値(この二つは組)、参照の理解を固めてから見直すとよろし
301 名前:デフォルトの名無しさん mailto:sage [2008/03/25(火) 22:45:08 ] >>298 簡単に言うと「swapでおk」ってこと。
302 名前:260 mailto:sage [2008/03/25(火) 23:08:35 ] おなにーでさーせん。swapとかごめん。あと別に必要なかったかも。 コンパイル通った。 >>283 と一緒かな? class D { public: struct Proxy { Proxy( D *d ):d_( d ){}; D *d_; }; operator struct Proxy () { return Proxy( this ); }; D( struct Proxy p ) {}; void operator = ( struct Proxy p ){}; D(){}; D( D &rhs ){}; void operator = ( D &rhs ){}; }; D Return() { return D(); } int main( int, char** ){ D d = R(); return 0; } Accept( D &d );ってのは間違ってたかも。 ようは、 D( const D &rhs )だと、オーナーシップの移譲とかでrhsに変更加えられない。で、 D( D &rhs )だと、右辺値を渡せない。 だから、Proxyを返して、ごにょごにょする。って話なのか。
303 名前:デフォルトの名無しさん [2008/03/27(木) 00:31:14 ] Cの関数ポインタにC++のClassの実体化した関数ていれられますか? ビルドエラーが出るんですけど、そもそもそんなの出来ない?
304 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 00:54:49 ] >>303 できない。 関数ポインタとメンバ関数ポインタは別物。
305 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 01:38:47 ] >>303 Windowsのコールバック関数みたいに こっちから引数を渡せれば、どうにでもできる。
306 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 01:54:41 ] >>303 sizeofを使ってポインタサイズを調べてみると、あれびっくりサイズがデカイって分るよ。 どうやっても入りません、キャストしたら情報ロストします。
307 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:00:59 ] >>306 いろいろ勘違いしてるような。
308 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:24:05 ] >>307 どこを? 具体的にどうぞ。
309 名前:デフォルトの名無しさん [2008/03/27(木) 02:29:53 ] >>304-306 のうち確実に間違っているのは >>305 です、要注意。
310 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:49:53 ] 面倒だからboost::functionを調べてみ >303
311 名前:デフォルトの名無しさん [2008/03/27(木) 02:56:20 ] 詳しく説明した方がいいかと 要するに、メンバ関数ポインタがさす関数はvirtualである事もあって インスタンスに仕込まれた仮想テーブルを参照して、関数テーブルのうちどの位置にあるものかを取得する必要がある。 また、関数はvirtualでないケースもある、この場合仮想テーブルには関数のアドレス情報はないので、関数メンバポインタ内に情報がなければならない。 関数メンバポインタはこれら複合情報で構成された構造体となっている。
312 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 03:03:53 ] どこが詳しいのか
313 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 06:03:12 ] それなりに詳しいと思うけど、 であるがゆえに「要するに」から始まっているのは間違いだと思う。
314 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:26:14 ] >>303 関数ポインタには入れられないが、 実体とメンバ関数ポインタの対を構造体にしたものを引数に取る ラッパ関数を通して呼ぶことはできる。 もちろん、C 側ではその構造体を直接扱うことはできないから、 void * を通すなり不完全型を利用してポインタで扱うなりする必要はあるけど。
315 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:39:53 ] >>309 >>305 はCのライブラリのコールバック使うときとかの対処法の話じゃね? 大抵はvoid*のパラメータ持ってるし。
316 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 07:46:12 ] virtual関係無いよね。
317 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 08:15:45 ] そもそも、C++のclassの実体化した関数って何?実体化って何を言ってるんだ インスタンス増えたら関数も増えるとか思ってるのだろうか、理解に苦しむ www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
318 名前:303 [2008/03/27(木) 08:50:26 ] やりたいのは複数newしたクラスからCの関数叩くんですけどその時の引数にコールバック用のCの関数ポインタがあるんです そしてその時呼んだ実体に関数ポインタによって帰ってくるようにしたいんです
319 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:03:26 ] 引数を加えて、static関数で良いんじゃ?
320 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 09:20:50 ] >>317 非staticメンバ関数/インスタンスメソッドの事だとみんな理解してるよ。 >>318 コールバック関数のパラメタを汎用ポインタとかで指定できるなら、そこにオブジェクトのアドレスを入れて、コールバック関数内でキャストしてメンバ関数を呼ぶ。 パラメタを指定できないなら、コールバック関数から見えるスコープの変数にオブジェクトのアドレスを入れておき、コールバック関数からメンバ関数を呼ぶ。
321 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 10:10:15 ] クラスの関数ポインタはthisが略されてるようなもんじゃね
322 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 10:31:11 ] >>317 往生際が悪い、素直に自分の知識不足でしたと認めろ
323 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 11:13:55 ] >>317 そのあたりは処理系依存だろ
324 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:09:21 ] static メンバ関数を C のコールバックに登録するのってよく見るし実際に やったこともあるんだけど、ほんとは extern "C" と extern "C++" の違いで 型が遭わないはずなんだよね。 だからって対応策がわかんないし、使ったことのあるコンパイラでは全部通るから そのまま使っちゃうんだけどさ。
325 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:35:22 ] >extern "C" と extern "C++" "C" とかの修飾は、識別子を外部にどういう規則で公開するかという点についての指定であって、スタックフレームの作り方の指定ではない。 機種依存なので、そっちにいけと事になるが、cdeclとpascalが違えば "C" を付加しても動作しない。 C型のスタックフレームを持つ関数として登録可能な関数なら、C型のコールバックに登録する事ができるという事。 そうでないなら、コンパイルが通ったとしてもうまくいかない。
326 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:52:21 ] >>325 スタックフレームとか実装に立ち入った話はしてない。言語概念上の型が違うんだよ。
327 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:53:59 ] >>326 力いっぱいデタラメぶちかまさない
328 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 13:58:42 ] 知識不足は許容できるが嘘吐きになってはイカンぜよ
329 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:03:56 ] >>327-328 気持ちはわかる。きっとみんなこれらは同じものとして使ってるだろうし、 動作も問題ないだろうさ。 でも規格ではエラーにならないとダメなんだよ。はっきり書いてあるから。 7.5 "Linkage specifications" p1 より > ... Two function types with different language linkages are distinct types even > if they are otherwise identical. gcc でもバグ扱いだ。 gcc.gnu.org/bugzilla/show_bug.cgi?id=2316
330 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:06:37 ] >>329 自分を嘘と虚栄で塗り固めるような真似はやめた方がいい、どこに突っ込み入っているのかすら理解できていないだろ。
331 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:10:44 ] 静的メンバ関数はextern "C++"ではない
332 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:11:10 ] 328は327に宛てたもんだと俺は思った、どうでもいいけど。
333 名前:329 mailto:sage [2008/03/27(木) 14:11:40 ] >>330 ごめん。どこに突っ込み入っているのかすら理解できてない。 どこが嘘になってるの?
334 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 14:16:32 ] >>331 何を根拠にそんなこと言うのか知らないけど、じゃぁ静的メンバ関数の language linkage は "C++" 以外の何になるのさ?
335 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 16:56:26 ] 虚言癖というか妄想癖というか・・・なんかもう病気だね(汗
336 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:04:34 ] >>334 静的メンバ関数のリンケージは内部リンケージで その根拠は外部に公開されないから 逆にextern "C++"と同じという根拠は?
337 名前:デフォルトの名無しさん [2008/03/27(木) 17:05:02 ] もうv(^・^)vの人はいないの?
338 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 17:20:53 ] ちゃんと勉強しろ、そんな高度な話題じゃねぇよ
339 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 18:55:41 ] コンストラクタの中で 配列宣言しているオブジェクトの コンストラクタ引数を設定するにはどうしたらいいですか?
340 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 19:03:37 ] class Test{ Test0 objects[10]; ... }; Test::Test() :objects[0]( 10 ) ,objects[1]( 8 ) ... { } こんなかんじをやりたいのです。 もちろん、これではエラーです
341 名前:デフォルトの名無しさん [2008/03/27(木) 20:36:48 ] >>339 できないよ。
342 名前:デフォルトの名無しさん [2008/03/27(木) 20:51:07 ] 解答を待っているのかもしれないが、本当にできないから。 www.geocities.jp/ky_webid/cpp/language/012.html
343 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 20:57:51 ] どうしてもそれっぽいことがやりたいなら vector<Test>にひとつひとつpush_back()するか ポインタの配列にしてひとつひとつnewすればいいんでないの
344 名前:デフォルトの名無しさん [2008/03/27(木) 21:55:56 ] VC++6で for(int i=0; i<10; i++){ ... } for(int i=0; i<10; i++){ ... } って書いたら iの再定義っておこられた 拡張子cppになってるのに
345 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:57:25 ] 仕様です
346 名前:デフォルトの名無しさん [2008/03/27(木) 21:58:46 ] 1998年発売のソフトやもん。
347 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 21:59:23 ] >>344 びっくりするくらいみんな知ってる。 規格準拠していないんだから何も問題ない。
348 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:35 ] >>344 #define for if(0); else for 魔法のおまじない
349 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:01:59 ] 当時は準拠してたんだよ
350 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:03:21 ] まだ規格もなかったのに何に準拠してたというのか。
351 名前:デフォルトの名無しさん [2008/03/27(木) 22:04:00 ] 常識。
352 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:29:04 ] >324,329 だいたい、「関数ポインタ型」それ自体にはリンケージなんか無いだろ。 それともこーゆーコードが通るコンパイラでもあるのかっつーの。 typedef static void (*hoge)(); typedef extern void (*foo)(); typedef extern "C" void (*var)();
353 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:23 ] typedef void (*__stdcall type)(); こういうのならたまにやる。
354 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:36:46 ] それはリンケージじゃなくて呼び出し規約
355 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:48:31 ] >>350 ARM、ISOのドラフト
356 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:49:53 ] >>355 >>344 なていたらくでか
357 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:58:27 ] >>356 forの中で定義した変数の有効範囲が 直後のループ本体に限られるようになったのは 結構遅かったのでは?D&Eでも軽く触れられていたし。 それに加え過去の互換性のためVC6はあれがデフォルトになったんだと思う。
358 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:27:37 ] 昔の人が考えた仕様には、頭おかしいだろうってのがそれなりに有るからね。
359 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 23:47:27 ] 初期のコンパイラの実装の都合もあったんじゃないかな? 最近のコンパイラで、forの変数の有効範囲が限られるようになってるのに最近気づいて思わずGJと叫んだ。
360 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:10:34 ] >>357 まあ 1998 年と言えば規格が出る年だしな。 開発期間とか考えると多少前の仕様に準じようとしてたと考えるのが妥当だけど、 その時期ならドラフトとはいえかなりな部分まで練られてると思うんだけどな。 まあ、想像でしかないので本当にギリギリになって入れられた仕様なのかもしんないけど。 VC6 はテンプレートまわりがバグ持ちすぎてかなり酷いが、 テンプレートも遅くに入った仕様だからな・・・。 new がデフォで bad_alloc 投げないとか、とにかく色々と酷い上に、 しばらく次のコンパイラが出なかったという・・・。
361 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:18:58 ] 未だに古いライブラリとかで使わないといけないことが結構あるからねぇ VS2005から入った俺としては結構苦痛 まあでもテンプレートさえなければインテリセンス反映が早いのはよい
362 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:36:24 ] VC++6.0は当時の状況を考えればしょうがないと思う 問題なのは次のコンパイラがさっさと出なかった事 お陰で変に普及しちまって、このスレでもVC++6.0でコンパイルできません的な質問が絶えない
363 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:38:12 ] 全てはMSが次期製品を確実に買ってくれる為に図った陰謀。
364 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:53:13 ] MSの事情的にはむしろ逆のような? 過去のシステムヘッダに, for で宣言した変数が その後も生きることに依存したコードがあったっていう……
365 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:56:00 ] #define for if(0) else for のおまじないと使ったあとでATLをincludeすると 怒られるちゅーか
366 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:14:53 ] >>363 そして満を持して登場した 2002 が糞だったという罠。 そして 2003 で大きく改善されるという二重の罠。 アカデミックだと無料アップグレードできないという三重の罠。
367 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:16:50 ] #define for if(0); else for は色々やった後にやるとよろし。
368 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 01:55:57 ] ってかincludeする前にundefするだろ・・・
369 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 02:11:01 ] >>336 ,352 ややこしくて嫌になるが、内部とか外部とかがある「リンケージ」と "C" とか "C++" とかがある「言語リンケージ」("language linkage") とは 別物。 >324,329 が言ってるのは言語リンケージのほうなんで、話がまるで かみ合ってない。
370 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:12:43 ] 自信満々な>>336 が可哀想に見えてきちゃったよw 逆にextern "C++"と同じという根拠は?ってのが哀愁をソソル
371 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:26:11 ] >>336 素の「リンケージ」の話だとしてもおかしい。静的メンバ関数のリンケージは ほとんど外部リンケージになる。例外は関数内のクラスのメンバの場合とかね。
372 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 03:29:08 ] 静的メンバ関数が「外部に公開されない」ってのもおかしいな。 クラスの宣言されたスコープや、クラス内での private なり public なりに 従うだろ、常考。
373 名前:デフォルトの名無しさん [2008/03/28(金) 03:50:38 ] びやーんはもうC++なんか使っていないらしい。
374 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 05:40:45 ] ソースは?
375 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 07:19:26 ] 2ch
376 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:03:31 ] >>372 public, privateと内部リンケージ, 外部リンケージはまた別の話だ
377 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 08:07:53 ] もう何がなんだかわからないよママン
378 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:26:26 ] >>359 もともとがCへのトランスレータだった事を考えれば自然に合点が行くね。 for( int i = 0 ; .... ) { ... } 変換後 { int i ; for( i = 0 ; .... ) { ... } }
379 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:47:14 ] >>377 C++の仕様書を見ればいいと思うお
380 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 09:57:02 ] >>372 リンカなどの外部に公開され得るのはクラスであって内部リンケージであるメンバが同様に公開されているように見えるのは処理系の都合
381 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 11:33:58 ] >>380 クラスが外部リンケージを持つときに、メンバ関数が外部リンケージを持つかどうか は処理系依存だと言っているのならそれは違うよ
382 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 03:01:24 ] >>377 >329,324
383 名前:デフォルトの名無しさん [2008/03/30(日) 01:04:01 ] テンプレートをつかうと一気にコンパイル時間が10倍に?!
384 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 01:07:31 ] >>383 >>5
385 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:11:26 ] template使っても 型が1個と100個じゃ大違いだろ
386 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:17:08 ] このテンプレいつの間にか一つのレスにまとめられてたのかw
387 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:27:00 ] template <typename Questioner> int IsCompileTimeBecomeLongerByUsingTemplate() { return ENVIRONMENT_DEPENDENT; }
388 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:25:46 ] テンプレート無意味過ぎる
389 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:28:21 ] >>388 質問者に応じて別の回答をするように特殊化するんだよ。
390 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:36:16 ] template<> int IsCompileTimeBecomeLongerByUsingTemplate<教えて君>() { throw spoon(); }
391 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:59:30 ] 匙は投げられた。
392 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:30:09 ] the biggest news of the meeting was that we voted lambda functions and closures into C++0x. // Writing a collection to cout, in C++0x: for_each( w.begin(), w.end(), []( const Widget& w ) { cout << w << " "; } );
393 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:59:38 ] スレ違い
394 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:28:23 ] LRESULT CALLBACKの関数をCLASSに所属させるにはどうすればできますか?
395 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 01:37:29 ] static
396 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 02:07:44 ] >>394 web.archive.org/web/20070810174250/http://techtips.belution.com/ja/vc/0009/
397 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 05:36:51 ] RTTIについて質問です。 RTTIありでオブジェクトファイルを生成したいが 外部libなどがRTTIを含んでいない場合は 自分側もそれにあわせてRTTIなしで組まなければ成らないのでしょうか?
398 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 10:26:48 ] コンパイラオプションでRTTIを使うかどうかの設定の話なら、ケースバイケース。 自分が知るVC++では、外部のオブジェクトに対してtypeidやdynamic_castをしなければ、 自プログラムがRTTI有効でも、問題なくリンクして実行できる。 逆にそうでない処理系も世の中あるかもしれない。
399 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 12:28:13 ] >>397 リンクでエラーが出たらオプション変えればいいんじゃないか?
400 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:21:40 BE:1614463687-2BP(200)] www.borland.co.jp/cppbuilder/freecompiler/ が切れていてBorland C++ Compilerがダウンロードできないんだけど
401 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 17:25:43 ] >>400 普通にアクセスできるしスレ違いですさようなら
402 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 02:25:47 ] test
403 名前:397 mailto:sage [2008/04/01(火) 02:34:57 ] >>398 環境依存てことですかね〜。 >>399 vcとのクロス開発あたりだとエラーがでてしまうのです;; 根本的になにをやりたいかというと、 シリアライズ機能を自前で実装しようと考えていまして 実装の際にRTTIのtypeidを利用して組むとらくそうなのですが・・・ ない場合はMFCやwxWidgetのようなクラス毎にマクロを仕組んで 独自の機構を作るしかないのかなって悩んでしまって・・ ※boostのシリアライズという選択肢もありますが、boostが対応していない環境も考慮しました。
404 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:49:14 ] というか、例外・RTTI・CRTは、何も考えずに DLL超えとか、コンパイラ/オプションの違うlibを混ぜるとか するとハマるよ?
405 名前:デフォルトの名無しさん mailto:sage [2008/04/01(火) 06:58:03 ] >>403 libのクラスをもう一度派生させたのを使ってみてはどうかな? 念のために聞くけど、そのlibをコンパイルしたコンパイラと使ってるコンパイラの種類とバージョンはあってる?
406 名前:397 mailto:sage [2008/04/02(水) 04:43:48 ] >404 こちらはそこを懸念してるんですが、出来上がったものを使うのは私ではないのでなんとも・・・ >405 バージョンのほうはあってますが、こちらでつくったモジュールがどのようなケースで使用されるか をすべて網羅するわけにはいかないので・・ 派生というかstubのようなものをproxyとして使用する感じでしょうか? なんというか、それなりの状況でも使用に耐えうるもの、となると 結局RTTIははずさなければならないのかな、と思いました。
407 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 05:08:21 ] これはひどい builder.japan.zdnet.com/sp/c-programming-language/story/0%2C3800083430%2C20370255%2C00.htm
408 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:12:08 ] アクセスできるすべての識別子をリストアップするようなツールはないでしょうか。 class X { int i; public: int j; void f() {} }; というような場合に、 X X::j X::f() みたいに出力できるとうれしいのですが……。自分で字句解析するしかないかな。
409 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 06:47:39 ] doxygenいろいろ設定すれば出来るんじゃね?知らないけど。
410 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 08:45:55 ] >>407 他で散々話題になっているんだからここでまで張らなくていいよ。
411 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:16:30 ] >>408 doxygenで可能。privateは出てこない(設定で変えられるかも)
412 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 13:46:16 ] extern "C"しないで作られたshared libをcから呼ぶ方法ないでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:19:43 ] マングリング名がCの識別子として使えるならいけるかもね
414 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 14:49:22 ] C++ で C 用のラッパ関数作るといい。
415 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 16:47:51 ] >>412 .defファイルをがんがって作る
416 名前:デフォルトの名無しさん mailto:sage [2008/04/05(土) 20:14:21 ] ふつーにdlopenするとか。呼び出し規約が同じとは限らないけどw
417 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 17:03:38 ] gccxmlを使った他言語(pythonなど)への インターフェース自動生成ツールが最近でてきてるけど ちょっと複雑なコードだと自動生成に失敗するみたいだ まだ発展途上のツールだから仕方ないのか gccxmlに渡すオプションを考えればうまくいくのか どうなんでしょうか?
418 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:28:21 ] Exceptional C++ を読んでて、疑問点が出てきましたので質問します。 P173〜181 にかけての auto_ptr についての説明中に、 T* pt( new T(1) ); auto_ptr<T> pt( new T ); auto_ptr<T> a( source() ); ↑どう見ても関数呼び出しに見えるのですが、 初期化子と解釈しないとどうも前後の説明から辻褄が合いません。 ですが、手元にある数冊の参考書を調べてもググってみても 以上のような構文は「コンストラクタ初期化リスト」以外には見あたりませんでした。 これは関数呼び出しなのでしょうか?それとも初期化子なのでしょうか? もし、初期化子だとしたら、このような構文が出てきたときに どのようにして見分けたら良いのでしょうか? また、関数呼び出しのように見える初期化子の使い方についても よろしくご教示願います。
419 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:34:16 ] まさか<T>の部分を聞いてるのか?
420 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 20:43:27 ] int i = 0; int i(0); 上のふたつは等価、という話なのかな? typename identifier(typename, typename, ...); // プロトタイプ宣言 typename identifier(arg1, arg2, ...); // 初期化 identifier(arg1, arg2, ...); // 関数呼び出し ただし、C++では、関数宣言として解析できるものは関数宣言と見なすので、 list<int> data(istream_iterator<int>(cin), istream_iterator<int>()); は(cinの内容で初期化したlistの宣言ではなく)関数宣言になる。
421 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:26:48 ] typedef typelist< char, 1, 2, 3, bool > LIST; なんてことは出来ないですかね?
422 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 21:32:31 ] boost::mpl, boost::tuple, boost::fusion辺り?
423 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:43:42 ] >>418 読むだけじゃなくていろいろ試してみたら?
424 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ] classメンバを外部からリードオンリーに出来ませんか? 全部のメンバにゲッタを設定するのも面倒ですし
425 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 23:49:20 ] >>418 その本持ってるが、その部分に間違いはない。 auto_ptrのメンバ関数のインターフェース見れば疑問は無くなるはず。
426 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:19:52 ] >>424 面倒でも書く。
427 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:32:34 ] >>424 class A{ public: int aho; }; const A baka; //全部リードオンリーなクラス
428 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:46:55 ] >>424 必要になるまでゲッタなんて書かなきゃいい。
429 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 00:59:50 ] >>424 constは?
430 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:07:46 ] constなんてダサい。時代はreadonly。
431 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:08:06 ] extern "C" { struct B : public A {}; } ができた. class AのデータだけにはCからアクセスできるのかも methodは無理か?
432 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 01:25:03 ] extern "C" は変数と関数にしか意味がないからな。
433 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 08:03:03 ] >>424 class A { int member_prv; public: const int & member; A() : member(member_prv) {} } まあ何だ、C++にはReadOnlyなプロパティを書く構文的な補助がないから、素直にgetter書いとけ。
434 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 12:05:30 ] 漏れはこんなマクロを書いた。 #define readonly(TYPE, ID)\ public: TYPE ID() const { return _##ID; }\ private: TYPE _##ID class C { readonly(int, priv); readonly(unsigned int, b1) : 16; readonly(unsigned int, b2) : 16; public: C() {} };
435 名前:デフォルトの名無しさん [2008/04/08(火) 17:57:59 ] キーワードtypenameの意味が分かりません。テンプレートを定義するときに よく使われるようですが、なくても良いような気がします。例えば、 プログラミング言語C++のp.599にある bind2nd の定義のtypenameを取って コンパイルしてみましたが、コンパイルが通って、テストコードがきちんと 動きました。typenameの存在意義を教えていただけないでしょうか。 こういう場合にtypenameがなければ困るという分かりやすい例が欲しいです。 // ----- プログラミング言語C++(p.599)より ----- template <class BinOp> class my_binder2nd : public unary_function<BinOp::first_argument_type, BinOp::result_type> { // my_を付けて実験 protected: BinOp op; typename BinOp::second_argument_type arg2; // このtypenameを取ってみた。 public: my_binder2nd(const BinOp& x, const typename BinOp::second_argument_type& v) // このtypenameも取った。 : op(x), arg2(v) {} result_type operator()(const argument_type& x) const { return op(x, arg2); } }; template<class BinOp, class T> my_binder2nd<BinOp> my_bind2nd(const BinOp& op, const T& v) { return my_binder2nd<BinOp>(op, v);
436 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 18:30:35 ] >>435 www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html
437 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 18:33:46 ] C++FAQにありそうなネタだな
438 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 22:18:03 ] コンパイラの迷いを断ち切るためにあります
439 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 04:22:44 ] >>436 なるほど、理解できました。でもコンパイラが十分賢ければtypenameは不要だと 言えそうですね。コンパイラはテンプレートの解析時においては typename を付けていない T::something が型かどうか分かりませんが、実際にコードを 生成するときには分かるので、本質的には曖昧さの問題はないように思えます。
440 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 08:02:13 ] 移植性を考慮するなら付けておけばいい。
441 名前:デフォルトの名無しさん [2008/04/09(水) 15:23:39 ] 別のファイルで定義した変数を使うにはどうしたらいいんでしょう? プログラムの改変を行っているのですが、前任者が作業ごとにファイルをわけています。 AAA.cppみたいなのがいっぱいあります。ヘッダファイルも同じ名前でたくさんあります。
442 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 16:03:35 ] ググって一番上に来たサイト。 7ujm.net/C++/extern.html 内容は見てない。
443 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:11:09 ] VC++ってもうやばくないですか? 今やVBC#でもms単位で計測しないと実行速度違いがわからないぐらいですし 出来ないこともないですよね
444 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:34:02 ] >>443 場合によりけり あと、その話題はこのスレ向きじゃない
445 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 18:54:39 ] >>443 んな事ないよ OpenGL Viewerが前回のバージョンから恐らくC#になったんだと 思うが、やはり動作がもさもさする。
446 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:32:09 ] >>443 ゲームとかms単位が命取り ms以下単位だったら考えてやる
447 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:34:04 ] μに縮まったとしてもまだでかいだろ。
448 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:42:54 ] 数値計算とかやったことないんだろうなあ。
449 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:48:47 ] >>441 そういうファイル構成はC++では一般的。 その同名のヘッダーを読み込みば、十分アクセスできるはず。その前任者のソースをよく読んでC++を勉強すること。 C++はexternを滅多に使わないからね。
450 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:55:45 ] XBOX360のゲームは全部C#で書かれてるだろ
451 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 19:57:04 ] >>443 全然やばくない。世界はもっと広い。
452 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:26:56 ] >>439 T::something が型でも値でもコンパイルできてしまう場合は困るでしょう? 多分どちらかは間違っているんだから
453 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:06:55 ] >>450 んなわけないだろ プロがXNAで開発してるとでも思ってるのか?
454 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 21:56:02 ] 思ったw
455 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:26:41 ] .netフレームワークを要求する商用アプリで動きが機敏なアプリをいまだかつて見たことないな。
456 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:32:25 ] 多言語からc++を呼ぶインターフェイスで std::cout がおかしくなる原因になってるらしくなんとかしたい #define __streambuf なにか にできればいいのだけど voidに置き換えるとコンパイルとおらない 何か適当なクラスでもないでしょうか?
457 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 23:38:17 ] ios::sync_with_stdio で解決されるような問題じゃなくて?
458 名前:456 mailto:sage [2008/04/10(木) 00:12:16 ] 他言語の処理系がstdcoutをすでにリンクしているのに さらにその処理系から呼び出すcのプログラム中でもリンクしてるのが 問題なってる可能性があるような気がしています なので #define __streambuf Hoge できると多分うまくいくのではないかと
459 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:17:47 ] XNAなめんな
460 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:22:13 ] >>456 多言語から呼び出すってっ、もしかすると他言語からDLL呼び出しすることってことかな? だったらライブラリの初期化がうまく言ってないんじゃないか?dllmainはこねこねした?
461 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 00:23:42 ] あと、DLLはマルチスレッドライブラリでコンパイルだよ。
462 名前:456 mailto:sage [2008/04/10(木) 00:24:19 ] >>460 正確にはlibhoge.soを呼んでます libhoge.soがstd::stream関係をリンクしてます
463 名前:460 mailto:sage [2008/04/10(木) 00:27:49 ] linuxでしたか。>>460 はwinの場合の注意事項でした。
464 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 07:50:43 ] >>461 MTでコンパイルしないといけない決まりでもあるの?
465 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 08:21:08 ] >>464 ある。 DLLをコンパイルするときはMTでする必要がある。プロジェクトの作成でDLLを選択すると自動的にマルチスレッドランタイムライブラリが選択される。 呼ぶ側はどっちでもいい。
466 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:49:02 ] >>465 何の処理系の話か知らないがVisualC++なら シングルスレッドのランタイムの静的ライブラリをリンクしたシングルスレッド専用のDLLを普通に作れる
467 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 11:57:21 ] 端で見てて想像した通りの食い違い方w
468 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 12:10:14 ] 初歩的な質問で申し訳ないんだが、他言語から C++ の ライブラリを使って問題無いはず、という保証はあるんだろうか? あと、普通に C++ で呼び出すとかなぜしないのだろうか。 (これは状況がわからんとなんとも言えないけど)
469 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 14:18:03 ] operator==() の定義はクラスの中とクラスの外に置けますがどのように 使い分けるのでしょうか? std::type_info はクラスの中でその他はクラスの外が多いのですが。
470 名前:デフォルトの名無しさん [2008/04/10(木) 15:34:04 ] 別にoperator==()に限らずメンバ関数は中にも外にも置けるけど。
471 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:04:36 ] ププ
472 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:05:09 ] ペペ
473 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:30:44 ] == どうするかは状況によるんでは。無理無く member にしないで いいならそうすればいいような気がするが。中身の情報が必要な 場合に member にしてるんじゃないの?普通に生じる状況だと思うけど。
474 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:43:05 ] メンバに出来るものは中に書く。 メンバに出来ないものは外に書く。 以上。
475 名前:デフォルトの名無しさん [2008/04/10(木) 18:05:52 ] c++のエラー出力の文字コードがutf-8になっているのですが、 euc-jpにする方法ありますか? Linuxのeuc-jp環境でプログラミング行っており、 gcc version 4.1.2 です。
476 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:18:07 ] iconv
477 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 18:40:50 ] ロケール切り替えろとしか
478 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 19:06:32 ] public 関数だけで実装できる場合は非メンバーにする。 friend を使って非メンバーにすることもある。
479 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:50:36 ] 式の対称性が必要なら非メンバー
480 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 20:59:53 ] 自身への参照を返すことが期待されるか、自身を変更する場合は、メンバーにすることが漏れは多いな。 operator=, +=等はメンバに。operator==, <<, +等は非メンバ(場合によってはfriend)にしてる。
481 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:08:54 ] op == あたりの話はeffective C++に書いてなかった? もう忘れちゃったけど。 グローバルにop ==を置くことでカプセル化が上がるとか その話とはまた別?
482 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 21:20:10 ] friend はできれば避けた方が良いというの無かったっけ?
483 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:12:02 ] C++ Coding Standards の 44 には 「できるだけ非メンバーかつ非 friend の関数を書くようにしよう」 というのがありました。
484 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:19:02 ] C++の本質はやっぱプリプロセッサとテンプレートだろ・・・ オブジェクト指向なんてうんこ
485 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:00:41 ] プリプロセッサはちょっと違うだろ・・・ 現実的にメタプログラミングするのには必要だけど。 個人的にはデストラクタを推すね。 2行目は同意。
486 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:08:04 ] デストラクタとはいいところをつくね。 RAII 万歳!
487 名前:デフォルトの名無しさん [2008/04/10(木) 23:25:35 ] friendかな
488 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 23:58:56 ] >>485 == >>486 ??
489 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:01:31 ] デストラクタの価値が分からないうちは プログラマの資格なしだぜ
490 名前:485 mailto:sage [2008/04/11(金) 00:03:01 ] >>488 ID出ない板だからどうしようも無いけど、 違うとだけ。
491 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:14:49 ] デストラクタはクリティカルセクション解除するのに使ってる。 メモリリークどころの騒ぎじゃない
492 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:17:31 ] Javaとかどーやってんだ? デストラクタ
493 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:20:23 ] Javaはcloseとかdisposeとかメソッド作って 呼び出さないといけないんじゃなかったっけ?
494 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:25:56 ] Javaはデストラクタ勝手に作ってくれるから。 DB接続とかファイルハンドルにクリティカルセクションだの なんでも閉じてくれる。
495 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:28:48 ] 前スレから pc11.2ch.net/test/read.cgi/tech/1200044614/496- 496 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:44:30 つまるところc++ではデストラクタに頼るべき。 497 :デフォルトの名無しさん [sage] :2008/02/15(金) 14:54:04 C++はつまるところデストラクタのことだからな closeさせといてガベージコレクタがあるとか抜かす言語は笑えるな intは回収できるが巨大なファイルリソースはリークするわけだ 498 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:06:22 日本語でおk 499 :デフォルトの名無しさん [sage] :2008/02/15(金) 15:08:34 >closeさせといてガベージコレクタがあるとか 禿げあがる程同意。 C#はusing(o1,o2,...){}があるから多少マシだけど、 forみたいにusing用のスコープ作るから スコープ違いが混じるとネストして見辛くなる。 どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。 javaのtry-finally-closeに至っては論外。 しかもcloseで例外出たらfinally内で潰さないと try内で発生したより重要な例外が消されるし・・・。 500 :デフォルトの名無しさん [sage] :2008/02/15(金) 16:33:04 >どう考えてもc++みたいに対象の変数のスコープでDisposeした方が良いと思う。 そして言語はC++/CLIへと進化するのであった、まる
496 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:34:08 ] Javaをはじめ、メジャーな言語のGCはメモリ不足しか認識しないから、 明示的にcloseしない場合、メモリに余裕があればfinalizeは呼ばれず、 DB接続も閉じられない そしてコネクションプールのタイムアウトで死に始める業務アプリ 鳴り始めるサポートデスクの電話機達
497 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:39:21 ] まぁJavaなんてマーケット戦略で広まっただけのうんこ言語だからな・・・ プログラマと名乗るくらいならC++くらいできる頭を持って欲しい・・
498 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 00:59:54 ] finalize()でリソース解放なんて保険でしかないからな
499 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:32 ] リソース管理で似た話を読んだことある気がしてたけど思い出せた ttp://mag.autumn.org/Content.modf?id=20050506023118
500 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:00:40 ] でもね、C++は巨大で複雑怪奇だからね。Cを引きずってる面もあるし。 無駄を削ぎ落として細部を明確にした言語が望まれるというのもわかるよ。 それとGCの有用性とは別の話だが。
501 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:03:52 ] 実はVBなんかも リソース周りは優秀だったりする
502 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:11 ] continuationを明示的に扱えない言語はうんこ
503 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:26:35 ] scheme習いたてですか?
504 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 01:55:30 ] >>503 C++習いたてです。
505 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 07:46:34 ] C#のusingの使いづらさは異常 scopedとでもして識別子が入ってるブロックの最後でdisposeしてくれたほうがよかった
506 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:50:00 ] 素朴な疑問です。 #include <iostream> struct S { virtual void hoge() = 0; // 純粋仮想のみ }; struct S1 : public S { void hoge() { std::cout << "S1" << std::endl; }}; struct S2 : public S { void hoge() { std::cout << "S2" << std::endl; }}; int main() { S1 s1; S2 s2; S& r1 = s1; S& r2 = s2; r1.hoge(); r2.hoge(); r1 = r2; // 基本クラスの参照を代入 r1.hoge(); r2.hoge(); return 0; } VC8で上記のコードを実行すると S1 S2 S1 S2 と表示されました。 r1 = r2;はS::operator=を呼ぶだけなので何も変わらない、と理解したのですが、 これはC++的に正しい挙動なのでしょうか? それとも未定義でたまたまこうなっているだけなのでしょうか?
507 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:55:40 ] あ、改行を削ったらコメントをミスりました。 > struct S { virtual void hoge() = 0; // 純粋仮想のみ }; は > struct S { virtual void hoge() = 0; /* 純粋仮想のみ */ }; です。
508 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:56:43 ] 単純に、自動生成されたoperator=(S, S)で仮想関数テーブルが書き換わらないようになってるだけ。
509 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 08:57:18 ] s1, s2のうちSの部分だけがコピーされた、と解釈すればわからんでもない
510 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 09:00:15 ] とりあえず解決するには自分でS2 operator=(S, S)を定義すればいいように思えるが、 それはS = Sの一般的な代入に関して考えるとかなり狂っているから諦めろって言う話でっていう
511 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 12:27:47 ] >>498 同意。finalizeって呼ばれるとは限らないとか。ほんとに気休め程度だね。
512 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 13:29:20 ] >>506 代入や他オブジェクトでの初期化でvptrは変更されない。
513 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 15:56:17 ] class A { friend class B; int x; }; class B { class C {}; }; VC8.0 では class C から class A の x が参照できますがこれは C++ の仕様ですか?
514 名前:デフォルトの名無しさん mailto:sage [2008/04/11(金) 19:00:01 ] Cのreadableなプログラムを自動生成するメタ言語みたいなの ないでしょうか? readableじゃないのならあるのですが、読めないと意味ないのです
515 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:01:17 ] 具体例を。
516 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:08:22 ] まともなCソースも >>514 には、readable じゃなさそうだ...。
517 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:17:27 ] vector<int>で何個か反復子を進めたあと、 それが今何番目の要素なのかを知る関数はないですか?
518 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:20:51 ] >>517 std::distance
519 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:21:19 ] i - v.begin();
520 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 23:55:08 ] できました、ありがとうございます。
521 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:34:09 ] mag.autumn.org/Content.modf?id=20050506145337 ここ読むとC++よりもJAVAのほうがリソース管理に関して 優れているように思えるんだけど
522 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:42:17 ] だから何だよ
523 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:46:30 ] 優れているというかパフォーマンスを犠牲にしてリソース管理の安全性を高めたという方が近いかな。 そんな事いったらC++も保守性を犠牲にパフォーマンスを高める余地のある言語と言えるけど。 ただJavaの場合は“余地”どころかプログラマに選択をさせない完全な“切捨て”であるけどね。 だからプログラマが手段を選択できる余地の残っているC++の方が優れている。終了。
524 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:49:22 ] 手段を選択する必要のある場面においては、だけどな。
525 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:15:33 ] javaってfinallyの書き方間違えると死ねるしなあ という話が >>495 にあるよ jdbcでoracle使ったことがある人は知ってると思うけど、 closeし損ねるとリークしてそのうち動かなくなるんだよね これを注意深く追ってると、「なんだかCでやってんのと変わらんなあ」 と思うぜ、実際。
526 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:27:32 ] だってメモリしか管理してくれないもの
527 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:08:37 ] >521 「RAIIが発明されるまでのC++」については、Javaのほうが リソース管理が優れていた、と云わざるを得ない、けどねぇ。
528 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 07:25:04 ] 他のリソースも管理してくれればいいのになあ。 ファイルハンドルが足りない時には ファイルクラスのインスタンスへのガベコレを 優先的にやってくれるとか。
529 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 10:47:50 ] >>527 > 「RAIIが発明されるまでのC++」 って具体的に何を指すの? RAII ってプログラミング ポリシーだと思うんだけど。「発明」されたっていまいちピンと来ない。
530 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 11:04:02 ] RAII が浸透してない C++ って感じのことを言いたいんじゃないか? 未だに RAII を取り入れない C++ があるとは信じられないのかもしれないが。
531 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:21:55 ] >>528 デストラクタを活用するべき
532 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:25:18 ] javaの話だろ
533 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 12:50:09 ] >>527 C with class の話ですか? C++は初期のARMがかかれた頃から散々言われていますけど。
534 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:05:47 ] >>529 強いて言えば、テンプレートがなかった頃には、 auto_ptrや(削除子付きの)boost::shared_ptrのような 汎用的なものは作りづらかったと思う。 それでも、fstreamみたいに個別に作っていく手があったはずだけど。
535 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:38:58 ] なんでそこで糞設計のstreamを持ち出すかなー
536 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:33:50 ] とりあえずデストラクタでcloseしてくれるからいいだろ。 今は糞設計かどうかなんて関係ない。
537 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:13:37 ] 自分のクラスにiteratorをアタッチ するにはどうすればよいの?
538 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:45:20 ] >>537 クラスって新しい container 作ってんの? 普通に vector とかにオブジェクト入れて iterator 使うとかいう話 じゃないんだよね?
539 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 02:36:34 ] >>537 アタッチの意味がわからん。
540 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 07:56:33 ] Rubyみたいにアタッチしたいんだけど なんでできないの?
541 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 08:59:06 ] だからアタッチって何だよ
542 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 09:20:53 ] ウラララララーって叫ぶやつじゃね?
543 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:55:57 ] それは、アパッチ
544 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 16:56:46 ] >>543 叫ぶやつはジェロニモだ
545 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 17:24:27 ] だってオラは人間だから
546 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:52:48 ] テンプレートクラスとクラステンプレートの違いを教えてエロい人!!
547 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 21:58:18 ] クラステンプレートを使って作られたクラスがテンプレートクラス
548 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:09:23 ] 何か詳しく書かれたサイトがあれば貼っていただきたいです。
549 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:14:51 ] お前誰だよ
550 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:20:43 ] つーか言葉にこだわってどーすんの テンプレート勉強すりゃわかることだろうに
551 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:32:59 ] ヒントがあれば十分だろ。 自分で考えて解決する楽しさを知らないやつは(ry
552 名前:551 mailto:sage [2008/04/15(火) 22:33:53 ] >>551 誤爆しました。ごめんなさい、
553 名前:デフォルトの名無しさん [2008/04/15(火) 22:36:31 ] 輪講で必要なんです。 わかりにくかったので聞いてみました。
554 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:43:22 ] >>552 流れとしてはわりと的を射ている気がするw
555 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:01:58 ] テンプレートクラスはただの間違いだと思う クラステンプレートが正しい。だってあれはテンプレートだから クラステンプレートをテンプレートクラスというのは 鉄パイプをパイプ鉄というようなもの
556 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:16:18 ] >>555 さん わかりやすい表現ありがとうございます。 教科書には クラステンプレートはテンプレートクラスから導出できる。 クラステンプレートは非テンプレートクラスから導出できる。 テンプレートクラスはクラステンプレートから導出できる。 非テンプレートクラスはクラステンプレートから導出できる。 と書いてあるのですが・・・
557 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:24:08 ] まずは本の名前を晒してみれ。
558 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:25:34 ] なんの哲学書だよw
559 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:26:56 ] こんにゃくゼリーに使うこんにゃくをゼリーこんにゃくって呼んでる類だろ。
560 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 23:26:59 ] ぐぐってでてきた。これは比較的納得できるかんじ >www.ed.kuki.tus.ac.jp/cgi-bin/vahwebx.exe/Ja_JP/cforaix/Extract/0/glossary/czgt.htm クラス・テンプレート(class template) 暗黙的にまたは明示的にインスタンスを生成されるか、または特殊化されると、クラス型を作成するテンプレート。 テンプレート・クラス(template class) クラス・テンプレート(class template)によって生成されるクラス・インスタンス。
561 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:01:31 ] ソースで出てくる順がtemplate classだから間違えやすいな
562 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:03:46 ] typename
563 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:49:24 ] STLに boost::any相当のものってないよね? 困った困った
564 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:41:23 ] 普通にboost::any使ったら?
565 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 01:51:09 ] vectorにデータを追加した時にメモリ確保に失敗した場合、検出する方法ってありませんか? newでいうbad_allocの例外をキャッチするような感じ。
566 名前:565 mailto:sage [2008/04/16(水) 02:26:50 ] 解決しました。orz bad_alloc使えた...
567 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:21:12 ] >>563 無いなら作れば? 大したもんでもないっしょ。
568 名前:デフォルトの名無しさん [2008/04/16(水) 13:24:51 ] あるアクションゲームをCとC++両方で作りました。 プレイする上で、まったく同じ動作をするものです。 Cでは主に構造体で、C++ではVectorで管理していました。 C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、 そんなもんでしょうか?
569 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:41:18 ] そんなもん 完全に同一ソースでもバイナリレベルでは例外処理が入ったり、実行時型判定が入ったりする
570 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:42:03 ] >>568 Vector は std::vector のこと? そうなると構造体と std::vector とでは役割が違うので、置き換えれるわけ無いんだけど。 ・・・もしかして struct S { int a, b, c } s; s.a = s.b + s.c; これを std::vector<int> s(3); s[0] = s[1] + s[2]; にしたってこと? まぁプログラムが違うんならメモリ消費量が違うのはあたりまえなんで、 あんまり気にしてもしょうがないと思う。同じになるはずっていう根拠でもなければ。
571 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 13:49:57 ] 配列のことを構造体といい間違えたのではないか。
572 名前:568 mailto:sage [2008/04/16(水) 14:33:50 ] 配列ですね、すみません。 消費メモリが数十MByte単位で変わってくると、さすがに気になったので質問しました。 C++の設計に改善点がまだあるような気もします。
573 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 16:51:23 ] 数十MBって、それってC/C++以前にプログラムの構造がおかしいだろ常考
574 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 17:15:02 ] > C++で作ったほうがプログラム実行時のメモリ消費量が多いのですが、 これだけ読んだら、普通はもうちょっとささやかな差を想像するよね。 その想像をベースにして皆が一般的なことを回答したところで、いきなり > 消費メモリが数十MByte単位で変わってくると、 っていう、量に関する新情報を出すっていうのは、広義の「情報小出し質問」だと思うよ。 自分だけが知っている状況を他人に説明するときは、発信する前に 「相手はこの説明に触れて、真っ先にどんなものを想像するだろうか?」 っていう思考を巡らせるべき。 で回答だけど、「構造体とvector」以外に両者のソースがどう違ってるかがわからないと、何とも言えない。 質問文に登場した要素だけで考えるなら、STLの使い方をどこかで根本的に間違えているんじゃないか って気がするけども。
575 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 18:22:21 ] 前方反復子のクラスはデフォルトコンストラクタが必要ですけど、 デフォルトコンストラクタで生成した反復子やそれを代入した 反復子に対する操作の結果は定義されているでしょうか?
576 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:42:11 ] ttp://www.asahi-net.or.jp/~yf8k-kbys/newcpp18.html このサイトを見ながらC++の基礎を勉強しているのですが、このページのデストラクタのサンプルプログラムを VC++2008EEに打ち込んでも「消滅しました」のメッセージが出ないのですが、 これはVC++側の処理の問題でしょうか?
577 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:44:49 ] 詳しく読んでないからわからんが、派生クラスで基底クラスのデストラクタが呼び出されないとかなら virtualが抜けてるからとかそんなんじゃね?
578 名前:デフォルトの名無しさん [2008/04/16(水) 20:51:17 ] まだ始めたばかりの初心者です。。 あまりを出さなくてよい、簡単な割り勘のようなのを作っているのですが、 - #include<stdio.h> int main(void) { int a,b,c; /*計算の入力 金額*/ printf("金額を入力してください"); scanf("d%",&a); /*人数*/ printf("人数を入力してください"); scanf("%d",&b); /*計算と結果の表示*/ c=a/b; printf("%d/%d=\t%d\n",a,b,c); return 0; } - これを実行させると、金額を入力してEnterキーを押した時点で変な数字が出てきてしまいます… なにか足りない気がしますが、何処がおかしいのでしょうか…? ご教授よろしくお願いします。
579 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:51:27 ] どのコードを書いて、どういうメッセージは出たのか、 情報が足りなさ過ぎる。
580 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:52:05 ] >>579 は >>576 へ
581 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:53:09 ] >>578 d%
582 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:53:29 ] scanf("d%",&a); 打ち間違い?
583 名前:576 mailto:sage [2008/04/16(水) 21:15:39 ] >>580 スミマセン。。。 //dest_sample.cppのコードをまるっきりそのまま書いて実行したところ、 実行結果例の下2行の「消滅しました」のつく文だけ表示されません。 問題なくコンパイルできますし、上4行の「生成されました」と「呼び出されました」 の付く文は正常に表示されます。 試しに、筆者が書いたものをコピー&ペーストして実行してみましたが、 やはり「消滅しました」のつく、下2行の文が表示されません。 ~Nanika(){ cout << "Nanikaのインスタンス" << datum << "が消滅しました。" << endl; が完全に無視されているような状態です。 宜しくお願いします。
584 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:29:48 ] コンパイラは何?
585 名前:デフォルトの名無しさん [2008/04/16(水) 21:39:59 ] namespaceにはまっています。 あるソースファイルのnamespaceで囲まれた関数を別のソースファイルでexternしたいのですが、 どうすればいいかわかりません。コンパイルエラーになります。 名前空間名を付けて呼び出してもだめで・・・。 aaa.cpp----------------------------------- #include <stdio.h> namespace hoge { void Func() { printf("HELLO\n"); return 0; } } bbb.cpp------------------------------------ extern void hoge::Func(); ←コンパイルエラー void main() { hoge::Func() ← コンパイルエラー Func(); ← コンパイルエラー return; } ----------------------------------------- bbb.cppからaaa.cppの名前空間が見えてないっぽいんですがこんな場合どうしたらいいのかわかりません。 ネットでも検索したのですが、複数ファイルに分ける事ができる記述はあっても やり方が乗ってないので困ってます。どなたかお願いします。
586 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:05 ] namespace hoge{ extereeeen void Func(); }
587 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:41:27 ] namespace hoge { void Func(); } int main() { hoge::Func(); }
588 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:45:14 ] ああ、コンパイラはVC++2008EEか。
589 名前:デフォルトの名無しさん [2008/04/16(水) 22:00:46 ] >>586 bbb.cppでexternする場合はコレもnamespaceで囲んであげないといけないと言うことでしょうか!? やってみたのですがVC++6.0なせいか hogeがシンタックスエラーを起こしてます。 VC++対応していない?明日会社でやってみます。 >>587 586さんと似てるのですが、externしなくてもよいと言うことでしょうか? これまたVC++6.0ではhogeがシンタックエラーを起こしています。 明日やってみます。
590 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:56:43 ] VC6 でも問題はないはずなんだが・・・
591 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:57:30 ] 関数プロトタイプはデフォルトで extern ってのは常識だろ?
592 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 22:59:45 ] >>583 VC++2008でやってみたけど、ちゃんと表示されたよ。
593 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 23:09:05 ] ひょっとしてNanikaのインスタンスを グローバルで生成したというオチではないだろうなw
594 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 23:12:02 ] 外部ライブラリのデストラクタの方が後に走るから グローバル変数にしても cout に問題はないと思う。 というか、グローバルにしても表示された。
595 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 01:48:09 ] #include <boost/regex.hpp> template<typename TChar> class TCHoge { public: typedef boost::basic_regex<TChar> regex_type; static int Func(regex_type reg){ return 0; }//ok //static int Func(regex_type::flag_type flag){ return 0; } // NG1 //static int Func(boost::basic_regex<TChar>::flag_type flag){ return 0; } // NG2 static int Func2(boost::basic_regex<char>::flag_type flag){ return 0; } //OK }; Window2000 Visual C++ 2005 express edition boost 1.34.1 NG1 のように記述したいのですが,以下のようなエラーとなってしまいます. warning C4346: 'boost::basic_regex<charT>::flag_type' : 依存名は型ではありません。 error C2061: 構文エラー : 識別子 'flag_type' VC6.0 では問題なかったのですが,どのように記述すれば良いでしょうか?
596 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 02:07:22 ] ×boost::basic_regex<TChar>::flag_type ○typename boost::basic_regex<TChar>::flag_type だっけ?あまり自信ないや
597 名前:595 mailto:sage [2008/04/17(木) 03:25:08 ] >>596 さん,有難う御座います.教えていただいた方法でうまくいきました. これから typename をつけまくる作業に戻ります… それでは.
598 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 03:48:20 ] >>575 基本的には全部未定義。唯一、デフォルトコンストラクタで初期化したイテレータに、 そうではない値を代入することができる、ってことになるみたい。 24.1p5 の "Iterators can also have singular values ..." あたりにそんなことが 書いてあって、デフォルトコンストラクタで作った Forward iterator は singular value を 持つ(ことがある)とされている。 要するに未初期化のポインタやヌルポインタと同じ扱いってことね。
599 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:27:26 ] >>597 VC6 だと逆にエラーになるから もし VC6 でもコンパイルしたいということになりそうなら 後で切り替えられるようにマクロにしといた方がいい。
600 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:28:19 ] VC6を窓から捨てるのが正解かと boostでもVC6は切ってるし
601 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:52:55 ] >>589 プロトタイプ宣言したヘッダファイルを作れ。 つーか、チミのやりかたではnamespaceつくらなくてもアウチなんだけど
602 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:52:38 ] stlやboostを使っていると、typedefを書く場所に悩みます。 class ClassA { HogePtr pHoge_; }; class ClassB { HogePtr pHoge_; }; この時、typedef boost::shared_ptr<Hoge> HogePtr;はどこに書くのが理にかなっているのでしょうか? Hoge.h?それともClassA.hとClassB.h?
603 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:56:08 ] >>602 typedef しないという選択肢は無いのかね? ほんとに HogePtr に意味があるなら Hoge.h だろうね。
604 名前:602 mailto:sage [2008/04/17(木) 13:00:36 ] >>603 すみませんtypedefしない選択肢もありました。 Hoge.hでtypedefするか、typedefしないかの2択ですね。 ありがとうございました。
605 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 21:40:19 ] class Hoge { public: typedef boost::shared_ptr<Hoge> ptr_t; }; というのはどうですか?
606 名前:デフォルトの名無しさん [2008/04/17(木) 23:27:03 ] ClassA や ClassB の実装部分を HogePtr の実体から分離するために typedef 名をつかうってんなら、いっそ template class <T> class ClassAImpl { typedef boost::shared_ptr<T> Ptr; ... }; で、 typedef ClassAImpl<Hoge> ClassA; あたりまでやっちゃうのも悪くないと思うよ。
607 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:14:56 ] inline std::string Reverse( const std::string & src ){ return std::string( src.rbegin( ), std::rend( ) ); } これくらいシンプルな感じで実装する方法ないですか?
608 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:21:01 ] ごめん誰か>>607 を翻訳して
609 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:29:32 ] ようするに逆順でイテレーションしたいんだろうさ
610 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:32:28 ] 実装する手間を惜しんでシンプルな設計を考えることは良いことだが、 人に説明する手間を惜しむのは(・A・)イクナイ!!
611 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:40:34 ] >>608 すいません。>>609 ってことです。しかもstd::rend( )って何だよ・・・orz 当然できんだろ、って思ってたらコンパイルエラーになるんすね。 やっぱcopy使うのが一番まともでしょうか?
612 名前:602 mailto:sage [2008/04/18(金) 01:45:35 ] >>605 なるほど、それもありましたか。 >>606 ClassAとHogeの分離は考えてなかったです。 考えていたのは、 1、クラステンプレート実体化のコードが長くなるので、stlやboostはtypedefして使うものだと思っていた。 2、shared_ptrを使うという事は、2つ以上のクラス(スコープ)で型を使う事になるので、typedefを1箇所(Hoge.h)にだけ書いて、参照したほうがいいのではないか? 3、しかし、shared_ptrに入れて使うかどうかは、Hoge.hをインクルードして使う側の選択肢であって、使う側の可能性をHoge.hに書いてしまうのはどうか? といったことで悩んでいました。
613 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:14:07 ] >>611 よくわからんが std::reverse でも使っとけ
614 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 02:24:36 ] 世の中にはある程度の割り切りが必要な時だってあるのさ・・・
615 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 11:03:18 ] >>611 make_reverse_range(src) // boost::range_ex src|reversed // pstade::oven 非標準のライブラリ使ってもいいならこんな感じで簡単に書ける >>612 HogePtrをtemplateにして template template parameterでboost::shared_ptr等を与える // hoge.h struct Hoge { ... }; template< template<typename T> class Pointer > struct HogePtr { typedef Pointer<Hoge> type; }; // client code #include "hoge.h" template< typename T > struct raw_pointer { typedef T *type; }; HogePtr<raw_ptr> raw; #include <boost/shared_ptr.hpp> HogePtr<boost::shared_ptr> shared; これならhoge.hppで#includeしなくてもよくなる筈
616 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 13:57:34 ] >>615 ×HogePtr<raw_ptr> raw; ○HogePtr<raw_ptr>::type::type raw; ×HogePtr<boost::shared_ptr> shared; ○HogePtr<boost::shared_ptr>::type shared; ではなくて? そもそもhoge.hppでshared_ptr.hppの#includeを避けるなら // client code Hoge* raw; boost::shared_ptr<Hoge> shared; でいいじゃん?
617 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 22:57:32 ] >>581 >>582 返信遅くなってしまいました… そんな単純なミスだったんですね… ありがとうございました。
618 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:15:17 ] ベースメンバ初期化で"this"を使用すると警告がでますが、 コンストラクタ内で"this"を使っても警告も何も出ないけど大丈夫なんですか? 警告が出てるのはインスタンスが生成されていることが保証されて無い状態で そのポインタを読んでいることが原因になっていると考えているのですが、 だとすると、コンストラクタ内で使っても同じことですよね。 警告が出ないのは、そのポインタの先を使用しなければおkって事なんですかね・・。
619 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 15:20:45 ] コンストラクタ内ではメンバの実体は既に生成されているから問題ない どんな値がはいってるかは知らないけどね
620 名前:618 mailto:sage [2008/04/19(土) 15:58:08 ] >>619 >>コンストラクタ内ではメンバの実体は既に生成されているから問題ない なのに >>どんな値がはいってるかは知らないけどね とは? 実体は生成されているけど、thisが指しているのはどこか分からないよ ってことですか? それとも、実体の中身に何が入っているか分からないよってことですか?
621 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:00:42 ] ポインタの先を使用しなけりゃ大丈夫。
622 名前:618 mailto:sage [2008/04/19(土) 16:12:46 ] >>621 ってことは、コンストラクタでメンバ関数のアドレスを引き渡すのも危ないってことですよね。
623 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:14:00 ] コンストラクタ内でそのメンバ関数のアドレスを使わなければ大丈夫。
624 名前:618 mailto:sage [2008/04/19(土) 16:18:31 ] >>623 なるほど。理解しました。 どうもありがとうございました。
625 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:18:41 ] 実体は生成される途中にある。 だから、this は存在する。 存在するが、その実体は完全に生成されていないので、 その実体を操作しようとすると色々な不具合が生じる。 1. メンバ変数が全て生成されている保証は無い。 → メンバ変数に触る関数を呼ぶとヤバい。 2. 仮想関数の呼び出しが正常に働かない。 → class B : public A { B() : c(this) { } void hoge(); C c; }; とした時、B のコンストラクタ内から仮想関数 hoge を呼ぶと どんな状況であろうが B::hoge が呼ばれるが、 C のコンストラクタ内から渡されたポインタを使って仮想関数 hoge を呼ぼうとすると どんな状況であろうが A::hoge が呼ばれる。 B の基本的な初期化が済んでないので、B::hoge を呼ぶ事は非常に危険ということでそうなるのだが、 もちろん A::hoge が呼ばれてしまう事も危険っちゃ危険だ。
626 名前:618 mailto:sage [2008/04/19(土) 16:37:18 ] ん...また混乱.. >>1 . メンバ変数が全て生成されている保証は無い。 >> → メンバ変数に触る関数を呼ぶとヤバい。 これだと、例えば, class AAA { public: // 危険? AAA(){ this->value = 5; }; // こちらにしなくてはならない? AAA():value( 5 ){ }; void test(){ cout<<value<<endl; }; private: int value; } ということ?
627 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 16:55:31 ] ここで言っているのは、コンストラクタ以外のメンバ関数のことでしょ。 普通、メンバ関数は、コンストラクタによって適切に初期化済みであることを 前提にして書かれているから、 コンストラクタの途中で呼び出すのは、一般的には危険ということ。
628 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 17:18:51 ] GCC でやってみたら C::C 内でも B::hoge が呼ばれた。未定義なのかな? ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6276.txt
629 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:02:59 ] vptrは初期化リストに先立って初期化されてるはずだから、 実装的には値が不定なだけだと思うけど、 未定義ではあると思うよ。
630 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:04:28 ] 補足。this->nとかの値が不定って意味ね。
631 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:08:30 ] 前に VC6 でやった時は仮想関数テーブルの初期化は最後だったけど、 どっちの仮想関数が呼ばれるかって仕様で決まってんのか?
632 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:15:06 ] え〜うそ〜!? 基底のコンストラクタから、 派生の仮想関数が呼ばれない、とかの話と勘違いしてない?
633 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:17:17 ] 基底に this は流石に渡さんぜよ。
634 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 18:32:06 ] >>631 VC++だと__declspec(novtable)を付けたクラスでは vtblの初期化が行われないなんて独自拡張がある。 (最派生クラスだけnovtable無しにして使う) これ使っていないか?
635 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 19:41:56 ] novtableいいよねー コード縮むし
636 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 20:55:37 ] |┃三 |┃ |┃ ≡ _、_ ____.|ミ\___( <_,` ) |┃=___ \ |┃ ≡ )ATL 人 \ ガラッ
637 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 21:20:55 ] class Derived : Base {...} void f(){ Derived v; } this->vptr = &Base::vtbl → Base::メンバ初期化 → Base::ctor → this->vptr = &Derived::vtbl → Derived::メンバ初期化(定義順にctor) → Derived::ctor Derived::dtor → Derived::メンバ破棄(定義逆順にdtor) → this->vptr = &Base::vtbl → Base::dtor → Base::メンバ破棄(定義逆順にdtor) → this->vptr = 不定値 こういう流れになるはず。VC6も。
638 名前:637 mailto:sage [2008/04/19(土) 21:28:41 ] 表現がおかしかったので訂正。 × Base::メンバ初期化 ○ Base::定義順にメンバ初期化 × Derived::メンバ初期化(定義順にctor) ○ Derived::定義順にメンバ初期化 ctorは「メンバの暗黙の初期化・初期化リストによる初期化」を含まないコンストラクタの中身。 dtorは「メンバのデストラクタ呼び出し」を含まないデストラクタの中身。
639 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:10:47 ] VCの実装を見る限りcinやcoutはextern修飾されてるみたいですが、 宣言のみの必要な定義のいらないこれらの様なものを自分でも書くとき、 一般的にどのコンパイラでも単にexternを付けておけば良いんでしょうか?
640 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:21:00 ] externが、必要がでるまでどこかで定義された実体を探す事がないという保証があるかどうか?
641 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 23:25:46 ] 日h(ry
642 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:26:08 ] template<class T> struct A { struct B {}; }; template<class T> void f( typename A<T>::B ) {} と定義して f( A<int>::B() ); とすると 'void f(A<T>::B)' : テンプレート 引数を 'T' に対して減少できませんでした というエラーが出るのですが、入れ子クラスではテンプレートの引数を推測でき ないのでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 15:49:31 ] f( A<int>::B() ); を f<int>( A<int>::B() ); と推測できないかってこと? それは無理がありすぎるな。
644 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 17:09:44 ] 逆にboost::implicit_castがこれを使っていて、 推論を抑えるため、引数の型をtypename mpl::identity<T>::typeにしている。
645 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 19:09:03 ] BがAのテンプレートパラメータTの値をtypedefの形で保持してそれをf側で参照するようにしてやれば可能になりそうだけど そうするとfを関数オブジェクトにしないといけなくなってC++の暗黒面に突入する…と 本当にunk言語だな
646 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:10:39 ] 何で std::auto_ptr<char> x( new int ); はコンパイルエラーにならないんですか?
647 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:19:09 ] おまえがどんなコンパイラと、どんなSTLの実装使っているのか非常に気になる。
648 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 17:23:34 ] コンパイラは VC8 SP1 で STL はコンパイラ付属です。
649 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:11:04 ] VC8って2005だっけ? 2008ではエラーになったぞ。
650 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:38:29 ] 8は2005
651 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 09:47:20 ] VC++2005Expressではエラーになった
652 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 12:12:58 ] VC7.1 だとエラーになりました。 Microsoft Visual Studio 2005 Version 8.0.50727.762 (SP.050727-7600) だとなぜかエラーになりません。 もしかして C++ コンパイラはエラーを出す義務はないのかな?
653 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 13:26:29 ] 多分それはない。 コンパイラのバグか、誰かがヘッダ書き換えちゃったとか。
654 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:07:19 ] デバッガで追いかけたら new int が一旦 std::auto_ptr_ref<char> に 変換されてから std::auto_ptr<char> に変換されていました。 std::auto_ptr_ref<T> は void* 型でポインタを記憶しているので int 型は消えていました。 memory ヘッダーを確かめると確かにエラーが出ないはずです。 この動作は std::auto_ptr の仕様でしょうか?
655 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:34:39 ] これと同じみたいだね ttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
656 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:45:29 ] いまだに信じられんな。もうすでにVC8なんて使っていないんだが、 それほど悪いコンパイラとSTLじゃなかったはずだが。 とりあえず>>654 の話から想像すると、 rvalueとlvalueの境を越えるための、あまり汎用的に使い道のない、 汚いトリックを使ってauto_ptrを実装しているが(オーバーロードとtemplate argument deductionのわずかな違いを利用するやつ) 普通に使う際にも、そのトリックが働いてしまうって事かな。 STLの実装の問題っぽいかなぁ。 ふつうauto_ptr_refのメンバをvoid *にしなければならない理由はないよな。
657 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 15:48:53 ] >>655 あ、>>656 に加えて、auto_ptr_refのコンストラクタがexplicitじゃないのか。 だめじゃん、P.J. Plaugerさん。
658 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:51:53 ] 失礼 リソースの 切り離し / 復元 を実行するメソッドの命名に困っているのですが この意味に近くて使いやすい単語のペアはありませんかね? 機能的に必ず対になるものです。 候補としては [Detach / Restore] Detach の対義語は Attach だしな [Detach / Attach] Attach は「復元」では無い気がする [Destruction / Resotre] Destが長い [Destroy / Restore] Destory は Create のペアとして使ってきたので控えたい ですが、どうも腑に落ちません。
659 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:58:10 ] 日本語の「切り離し」と「復元」はそもそも対義語じゃないよね・・・ 切り離しとその反対なら、Detach / Attach だろうし、 復元とその反対なら、Save / Restore だろう。 Destruction なんて破壊しちゃうわけでさ、英語以前に日本語の 「切り離し」「復元」ってのがそもそも違うんじゃないか?
660 名前:658 mailto:sage [2008/04/24(木) 20:08:51 ] >> 659 > 英語以前に日本語の「切り離し」「復元」ってのがそもそも違うんじゃないか? うーむ・・仰るとおりですね 切り離しを実行すると 消失 という状態になる処理だったので それを元に戻す意味で 復元 と考えていたのですが もう少し考え直してみます。 ありがとうございました
661 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 20:12:44 ] 漏れはホンちゃんの処理の準備のためのナニにはPrepareXXXを結構使うな。 オフスクリーンビットマップやら何やらの準備とか。
662 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:22:36 ] release / acquire
663 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:20:14 ] >>660 Disconnect / ReConnect とか、Detach / ReAttach とかは?
664 名前:658 mailto:sage [2008/04/24(木) 22:43:04 ] >>661 Prepare 今回は使いそうに無いけど、ひとつ賢くなりました >>662 そういえば DirectInput に Acquire / UnAcquire (だったかな)ってのがありますね これ良いかも >>663 Disconnect / ReConnect 接続とはちょっと違うんですわ ありがとうございました スマートに命名出来るように、もうすこし設計から見直すことにします
665 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:50:04 ] template <template<class> class T> このようなテンプレートテンプレートパラメータが なぜこんな書き方ができるのか今一理解できません。 誰か上手いこと説明してください
666 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:59:29 ] なぜ出来るのかって、そりゃ出来るように言語仕様を改定して コンパイラが対応したからだろ・・・
667 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:34:09 ] class X を渡せる奴は template <class X> と書くんだから template <class A> class T を渡せる奴は template <template <class A> class T> と書けるようにするのが自然だろう。 むしろ他にどんな書き方があるのかと問いたい。
668 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:54:08 ] >>667 あぁ納得。 <template <class A> 最初の例だとAの部分が無かったので混乱してました
669 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 20:13:29 ] std::exception のメソッドの例外指定はいつの間にかなくなってしまったんですか? ttp://msdn2.microsoft.com/ja-jp/library/c4ts6d5a(VS.80).aspx を見るのすべてのメソッドに例外指定がないんですけど。 今まで std::exception が例外を投げないことを前提にプログラムを作ってきたんですが。
670 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:47:18 ] 現行規格でも次期規格の最新のドラフトでも throw() ついてるから。
671 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 02:01:34 ] だから聞いてるんじゃね
672 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 10:46:10 ] throw() は例外を投げない事を保証するが、 unexpected() が呼ばれて落ちる事もあるので 「throw() がついてないからどんな例外が呼ばれるか分からないから 落ちる可能性があるかもしれないのか不安だよ!」 ってのは意外とナンセンスな悩み。
673 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:32:34 ] >>672 ナンセンスな私的だな。例外安全性について勉強し直せば。
674 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:35:43 ] 例外指定にない例外を投げたらunexpected()呼ばれるんじゃなかったっけ つまり例外指定はあんま意味ナス
675 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:40:29 ] throw()は意味あるよ。関数の実装者がユーザに対して例外を投げない事を保証するものだから。 ユーザはthrow()を見て、例外不送出であることを期待してコードを書く事ができる。 unexpected()が呼ばれる事で、その関数の例外指定に問題があるか、実装に問題がある事をユーザ/実装者が知る事ができる。
676 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 11:58:31 ] VCは例外指定無視する(そして"実装されてないお"と警告をだす)のでVC付属のライブラリからも外しちゃったんじゃない?
677 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:02:46 ] throwをつけると、おき得る例外を特定できるから、それを期待してプログラムを書ける。 なのにそれ以外の例外が投げられるという例外中の例外がunexpectedなのだな。例外にも階層があるんだね。
678 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:16:40 ] >>676 空のthrow()だけ対応していなかったっけ?
679 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:31:32 ] >>678 なんかそんな気もする 帰ったら確認してみるよ
680 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 12:38:39 ] >>678 そだよ。 書いても警告が出るだけだから。
681 名前:676, 679 mailto:sage [2008/04/26(土) 20:00:39 ] vc9で確認してみた Debugビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。 実行時はthrow()指定無視 Releaseビルドだと、throw()指定がついた関数内に直接throw文を書くとコンパイル時に警告C4297が出る。 実行時はthrow文のところでterminateによりabort のようだ
682 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 20:22:06 ] VC9は何かバグバグだな 早くSP1出して欲しい でも年末とか言ってたような希ガス・・・・orz
683 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 21:26:34 ] >>669 例外指定があろうとなかろうと、 投げてくる(こない)例外の種類は、規格通りだから安心して使っていいよ。
684 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:13:35 ] void f( T a ) {} f の呼び出しで a を生成するときに起きる例外は f の中で発生する 例外ですか,それとも外で発生する例外ですか?
685 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:16:42 ] 外
686 名前:なにがだ mailto:sage [2008/04/26(土) 22:30:18 ] >>684 f()に入れる前に出ちゃってるんだから大丈夫。
687 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 22:31:58 ] もう、出しちゃったの?
688 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:46:33 ] Winsock2.0で非同期通信について教えてくれ connectメソッド使ってサーバに接続要求して サーバ側でACCEPTメッセージちゃんと受け取って 接続できてるのに戻り値が0にならないのは何で?
689 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 17:58:54 ] とりあえずWSAGetLastErrorでエラー内容調べてみたら?
690 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:06:54 ] >>689 やってんだけどわかんないんだ 非同期通信の場合WSAEWOULDBLOCKが返されるのは正常 という記事は見つけたんだけど、鯖立ててない状態で接続しても WSAEWOULDBLOCKしか返らないからエラー処理出来なくて困ったちゃん
691 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 18:16:49 ] msdn2.microsoft.com/en-us/library/ms887913.aspx >With a nonblocking socket, the connection attempt cannot be completed immediately. >In this case, this function will return SOCKET_ERROR and WSAGetLastError will >return WSAEWOULDBLOCK.
692 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 20:46:47 ] C++のnamespaceとオブジェクトに関連した質問させて下さい。 namespace Aにあるクラスまたは構造体のオブジェクトを、 namespace Bのクラスに引数として渡したいのですが、どのように 記述すればいいのでしょう?出来ればnamespace AとBは別々に、 それがダメならnamespace Aの中にBがいるように出来ればと 思っています。 C++を触りはじめたばかりでわかっていないことが多いのですが、 よろしくお願いします。
693 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 21:26:36 ] namespace AのclassXなら「A::X」
694 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 15:26:11 ] std::vector::size_type 型のオブジェクトは std::size_t 型の オブジェクトに変換できるでしょうか?
695 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:28:10 ] >>694 符号なし整数で、difference_typeの全ての非負数を表す事ができる。 としか書かれてないから、実装依存じゃないかな。
696 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:38:32 ] 教えてください。 Visual Studio 2005をつかっています。 クラスのコンストラクタ内で動的に2次元配列を生成し、 ファイルから値を入力したいのですが、 デバッグ(ローカル,this,vec_x内)で確認すると、2次元配列にはなっているのですが、 行数、列数で共に1となってしまっています。 int **vec_x; int **vec_y; と宣言し、コンストラクタ内で、 vec_x = new int * [ size_y ]; vec_y = new int * [ size_y ]; for(i = 0; i<size_y; i++){ vec_x[i] = new int[size_x]; vec_y[i] = new int[size_x]; } size_y,size_xは初回のnewの次点ですでに、 300,200となっていることは確認済みです。
697 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:43:38 ] >>696 何を根拠に行数、列数が1と判断したのか詳しく。 つーか、vector<vector< int> >使ったら?
698 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:48:51 ] >>696 デバッガでは配列の要素数は型情報として存在しない限り 表示されないというか new [hoge] で取ったサイズは表示されないというか、 要するにただのポインタなので要素は1つしか表示されないというか、 まぁそんな感じ。
699 名前:696 mailto:sage [2008/04/28(月) 16:51:46 ] >>697 デバッグで、ローカル変数タブからです。 this以下、vec_x(int **)を見ると、 (int *)に対応するところが1段しかありませんでした。 さらに、その下(?)の階層にも要素はひとつしかありませんでした。 >>698 その要素に値を入力したとき、 うまく領域が確保できていればどう表示されるんでしょうか。
700 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 16:59:05 ] >>699 詳細は>698の通り。そのデバッガは(newで確保した)可変長配列に対応していないのだろう。 確保できていたかどうかを知る手段はない。 確保に失敗したかどうかは例外が送出されるので受け取ればいい。 つーか、>697の最終行。
701 名前:696 mailto:sage [2008/04/28(月) 17:13:14 ] むしろ、その後の値の入力に問題があるのかもしれません。 ifstream ifs("FILE_NAME"); ifs >> size_x >> size_y; for( i = 0;i<size_y;i++){ for( j = 0;j < size_x; j++){ ifs >> vec_x[i][j] >> vec_y[i][j]; } } としています。 入力ファイルの中身は、 整数(半角スペース)整数 整数(半角スペース)整数 ... となっており、最初にsize_x,size_yを入力しています。 size_x,size_y,vec_x[0][0]は正しく入力されたのですが、 vex_y[0][0]には正しい値は入っていません。 その後のvex_x,vec_yの各要素の値に関しても同様に正しい値は入力されませんでした。 >>697 STLはややこしくて全く手をつけていません。 お恥ずかしい限りですが…。
702 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 17:30:54 ] >>701 g++ で一応試したけど、配列は >>696 で問題無いよ。 俺も STL 使った方がいろいろと簡単だとは思うけど。
703 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 17:40:17 ] STLに限らず、まとまった規模の情報は何でもそうだけど、遠目に見ているうちは 頻繁に使うものと滅多に使わないものが「同じ大きさ」に見えるんで、 無駄に全容を眺めてしまって、「難しそうだなぁ」という気持ちばかり膨らんでいく。 実際には「STLを使う」ってのは、その殆どがつまり「コンテナを使う」ってことで、 これ自体はめちゃくちゃ簡単な話だよ。
704 名前:696 mailto:sage [2008/04/28(月) 18:00:02 ] ありがとうございます。 STLを勉強してみたいと思います。 今回は(x,y)のようなベクトルによって構成された、 2次元配列を二つ作ることを考えています。 vector<vector< int> > vect1(size_y,vector<int>(size_x)); として、vect1[y][x]として要素にアクセスすればいいのでしょうか。 ttp://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=162 この場合のコンストラクタの動作が理解できません。 第二引数のvector<int>(size_x)でvect1を初期化するのでしょうか。
705 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 18:57:24 ] >>704 それで使い方はいいよ。 違うよ。2個目の引数は vect1 の各要素を初期化というか instantiate してる。 constructor は 2 つ引数あるときは個数と各要素。
706 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 21:50:55 ] >>705 下の文に引用が無いから > それで使い方はいいよ。 > 違うよ。 が繋がった感じで、なんかワロタ
707 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:42:23 ] クラスAからpublic派生したクラスBで、クラスA分のメンバ関数をprivateにしたいんですが Virtual付いてると宣言だけじゃ駄目なんでしょうか? 環境はBCB5+XPです class a { public: void Test1() {}; virtual void Test2() {}; }; class b : public a { private: void Test1(); //OK virtual void Test2(); //リンカエラーが出る };
708 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:56:01 ] virtualは関数の実体を定義しないとエラーになるよ。
709 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 13:58:16 ] それが許されたとして、aの中でよんでいるTest2はどうなるのか興味浦々
710 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 14:13:48 ] う〜んそうだったんだ。 a.Test2()で実体があるから、問題ないんじゃないかと思ってたけど 違うのか。 すごく勉強になったよ。ありがとう〜
711 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 15:04:23 ] class b : public a { private: using a::Test1; using a::Test2; }; やりたいのはこういうことか?
712 名前:デフォルトの名無しさん mailto:sage [2008/05/01(木) 17:43:05 ] >>711 この書き方は知らなかった。 usingについて調べてみます。
713 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 23:24:42 ] じぇねれーてぃぶこーどって本 買ったけどC++のソース部分読めない たじゅけて
714 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 00:30:03 ] 出版社に送って新しいのと取り替えてもらえ
715 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 00:47:17 ] 無限ループになる悪寒
716 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 07:55:38 ] >>714 当社では、「落丁・乱丁」の場合のみお取替えをさせていただいております。 大変申し訳ありませんが、「ソースコードが理解できない」お客様につきましては、 対応いたしかねますので、ご了承いただけますよう重ねてお願いいたします。
717 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 13:45:51 ] >>713 何がそんなに難しいの? template とかの勉強が必要なのかな?
718 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:30:53 ] じぇねれーてぃぶこーどなんて本あったっけ?
719 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 00:38:16 ] 日本語ではなかった気がする
720 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 10:14:01 ] これかぉ? www.seshop.com/detail.asp?pid=9025
721 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 11:32:55 ] hoge
722 名前:デフォルトの名無しさん [2008/05/06(火) 11:39:15 ] int main () { static int i (0); struct Local { static void increment () { ++ i; } }; Local::increment (); } 関数内のクラスのstaticメンバ関数(Local::increment)から 関数内の変数(i)を触れるのは規格に合ってる? g++.real (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) では触れるのだけど.
723 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 14:12:30 ] スタティックなメンバ関数からスタティックなメンバ変数が見えるのはいいんでないかい? 別に矛盾はないと思うし。 スタティックなメンバ変数ってのは、スコープ限定のグローバル変数みたいなもんだしね。
724 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 15:28:06 ] >>723 そういう事なんだろうね。俺も >>722 さんの code 見てちょっと えっ?て思ったけど、気分悪いがはっきりと間違っているとも言えない。 実際 compile してみると走るし(g++ 4.1.1)。どちらの static でも 外せば compile しない。
725 名前:722 mailto:sage [2008/05/06(火) 15:42:33 ] >>723 ,724 規格に合っているみたい. 9.8.1に 722ほぼそのまんまの例が載ってました.
726 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:05:22 ] int* array[10]; ってnewでやる場合どう書けばいいですか?
727 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:07:39 ] array[0] = new int[931];
728 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:26:29 ] >>726 もっと分かるように質問しろお( ^ω^)
729 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:31:01 ] int** array = new int*[10];でしょjk
730 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:32:22 ] C++のソースコードをアセンブラのコードに変換する方法があるって聞いたんですが どうやればいいか教えてください コンパイラはVCです
731 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:34:11 ] コンパイラオプションで「アセンブリコードを出力する」に設定する
732 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 23:36:49 ] 730です ありがとうございます
733 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:02:34 ] void F( vecotr<int> &vec ) { struct T { void operator()( int i ){ printf( "%d\n", i ); } }; for_each( vec.begin(), vec.end(), T() ); } こういう奴で、struct TをFのスコープ外にすると通るんだけど、 スコープ内だと通らない。 なんで? なんで?って考えちゃダメ?
734 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:04:20 ] >>733 関数ないクラス、構造体はtemplateクラスやtemplate関数にtemplate引数として渡せないと仕様で決まっている。
735 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:05:23 ] 誤字修正 x 関数ないクラス o C++仕様もまともに知らない奴は死ね
736 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:07:32 ] x 関数ない o 関数内 こういうことだろ
737 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:18:35 ] x こういうことだろ o べ、別にあんたの為に修正してやってるんじゃないんだからねっ!
738 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:35:33 ] >733 C++STDの14.3.1.2で不可になってますな。 コンパイル時に特定する必要があるので、外部リンケージの無い要素を指定できないんですな。 そういう意味で文字列リテラルも不可。 #文字列リテラルを実引数にできると色々と面白いんだけど、しようがないか……
739 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:49:27 ] 外部リンケージ?
740 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 18:10:55 ] ケータイ小説・千の風になっての評価 評価者:ミカ 評価:★★★★★ ミカと同じ名前で同じ歳の子がこんなひどい人生を送るなんて!! 信じられない!! 一晩中泣きました!! 評価者:サナエ 評価:★★★★☆ これがあたしたちのリアル。 評価者:ち†ょ⊃ 評価:★★★★★ 寝ゐ前|ニ言売ゐ女台め†ニяа止маω†ょ<τ 冫欠σ日シ立L≠†ょカヽ〃яа学木交|ニ彳テL≠маU†ニ
741 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 19:53:49 ] ちなつ 寝る前に読み始めたら止まんなくて 次の日泣きながら学校に行きました 同じ文字を複数の文字にあてたり、いきなりローマ字とか出てくるとワケワカメになるね。
742 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 20:39:31 ] ドストエフスキー小説・罪と罰の評価 評価者:ラスコーリニコフ 評価:★★★★★ 僕と同じ名前で同じ歳の人がこんなひどい人生を送るなんて!! 信じられない!! 一晩中泣きました!! 評価者:ドストエフスキー 評価:★★★★☆ これがあたしたちのリアル。 評価者:ポルフィーリィ 評価:★★★★★ 予審前に読み始めたら止まんなくて 次の日泣きながら仕事に行きました
743 名前:デフォルトの名無しさん mailto:sage [2008/05/08(木) 00:57:43 ] おい 自演してる奴がいるぞ しかも評価は控えめw
744 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 16:17:28 ] 1 2 3 4 . __ __ _ ,i,_,i_ ,-,_ ,-i,_,l 、 :.. :. ≡=-i'__l, | `i /'-' `i //l l iコ==ラ`'i ti | lヽi li, → | lヽl li → l i,,l l | → ./ /l/ | l-'l |,l | | // l `"|iコ='' / / . 'Fヲ|,H E三l_l_A | .i .| / / ,i_| .| | | || | i' /l .l, -'‐' | || |_ l l .ヽ,ヽ, ‐' ' `‐' -'-' -'-' 脱ぐ たたむ プログラムを src と dest を つくる まちがえる。
745 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:02:05 ] >>742 >評価者:ポルフィーリィ 評価:★★★★★ >予審前に読み始めたら止まんなくて >次の日泣きながら仕事に行きました あんたが言うせりふやない。
746 名前:デフォルトの名無しさん mailto:sage [2008/05/09(金) 19:23:43 ] >>744 ワロタ
747 名前:デフォルトの名無しさん [2008/05/10(土) 15:18:13 ] 重複しない複数の座標値、x,y,zという3つのキーを用いて、 そのキー(座標)の要素に値を代入、変更する処理を行おうと思っています。 現在、 class XYZ { int x; int y; int z; int value; }; としてXYZの配列を計算したい領域分だけ確保しているのですが 任意のx,y,zで値の変更があった場合,そのキーの要素を検索して参照、代入する方法として 何かよい方法はありませんでしょうか? よろしくお願いいたします。
748 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:20:47 ] 管理が冗長すぎるだろ
749 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:30:18 ] std::map<int, std::map<int, std::map<int, int> > > m; m[x][y][z] = value;
750 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:45:35 ] m[x][y][z]って・・・
751 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 15:56:35 ] 志村XYZのDVDって出てたっけ?
752 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:33:03 ] >>747 言いたいことがよくわからない。 キーが与えられたら要素を返す method と代入する method (というか メンバ関数)を作るってことじゃないの?変更がどうあるのかもよくわからん。
753 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:47:52 ] XYZにoperator< を定義してsetに突っ込む
754 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:52:37 ] >>747 3次元座標値ってどんな領域なのよ? まず問題の概要を説明しやがれ このスカポンタン
755 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 17:55:46 ] >>754 そこは重要じゃないだろ
756 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 18:01:09 ] これでいいだろ #include<map> class XYZ { int x, y, z; public: XYZ(int x, int y, int z) : x(x), y(y), z(z) {} bool operator<(const XYZ& rhs) const { return x < rhs.x || (x == rhs.x && (y < rhs.y || (y == rhs.y && z < rhs.z))); } }; int main() { std::map<XYZ,int> m; m[XYZ(0,1,2)] = 100; }
757 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 05:35:20 ] #include <new> としているコードを見かけますが、 わざわざ<new>をインクルードするのなぜなのでしょうか? インクルードしなくてもnewは普通に使えますよね?
758 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:02:53 ] いらないと思うんだった、コメントアウトして再コンパイルしてみればいいんじゃね? 単に習慣でインクルードしてるだけかもしれないし。
759 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:14:42 ] placement new, std::nothrow, std::bad_alloc を利用する際にインクルードするヘッダファイルであって、 普通の new を使うためにインクルードするヘッダファイルではない。
760 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:23:57 ] >>757 precement newやnew演算子のオーバーロードをするときに使う。
761 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:28:16 ] オーバーロードする際に必要だっけ?
762 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:28:52 ] そんな事はない
763 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 11:29:54 ] だよねー
764 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 12:34:18 ] かわいい女の子が寝る前に 1分間枕元に立ってくれるための おまじないだと、先輩から聞いたことがる。
765 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 15:51:39 ] 映画版呪怨ですね。わかります。
766 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:39:48 ] struct xstring_traits{ bool is_w() const {...} ... }; struct vstring_ref { // デフォルトコピーコンストラクタ使用 const xstring_traits* tr_; const char* begin_; const char* end_; const wchar_t* wbegin(){return tr_->is_w() ? reinterpret_cast<const wchar_t*>(begin_) : NULL;} ... }; struct vstring_buffer { const xstring_traits* tr_; char* begin_; char* end_; ... }; struct vstring {...}; // コピーでメモリ再確保
767 名前:766 mailto:sage [2008/05/12(月) 00:40:35 ] (続き) やっぱ引数がconst std::stringだと std::string以外から受け取る場合のコストが気持ち悪いし、 const char* でことあるごとにstrlenとかするのも無駄だし、 WindowsだとTCHARとかの場合もあるけど、 WinAPIに関係無い部分にまで<tchar.h>入れるの嫌だし。 で、ただでさえ多い文字列クラスをさらに増やすのかと 葛藤しつつも自作文字列クラスを・・・。 皆はやっぱり普通にstd::string? Windowsの場合は、 typedef std::basic_string<TCHAR>する人もいるよね。
768 名前:766 mailto:sage [2008/05/12(月) 00:41:33 ] ×引数がconst std::string ○引数がconst std::string&
769 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 00:55:18 ] 俺は、普段はconst std::string&で済ます。 std::basic_string<TCHAR>のtypedefもWindowsプログラムならよく使う。 767も言うコストが気になるならRangeを引数に取るテンプレートにする。
770 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:29:45 ] スレチだけど俺は TCHAR でちゃんと動くコード(mbcsをちゃんと処理するコード)を 書く気はさらさらないので、欺瞞的なTCHARの使用はなるべく避けてWCHARにしてる。
771 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 01:44:18 ] 俺も全部 TCHAR で書いてるけど、string::find とか平気で使ってるわ。 mbcs じゃほとんど動かんコードになってる。
772 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 07:10:43 ] >>767 文字数が必要ならこうする手も。 void hoge(const char* str, size_t len) { } inline void hoge(const std::string& str) { hoge(str.c_str(), str.length()); }
773 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:28:40 ] なんで、private継承、protected継承すると、アップキャストができなくなるのだ?
774 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:44:30 ] 外からprivateなメンバにアクセスできないのと同じ 外からprivateな基本クラスにはアクセスできない
775 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 13:48:23 ] >>773 外からできなくなるだけで、中からならアップキャストできるよ。
776 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:32:36 ] private継承するboost::operatorsがなんで動作するのかも良くわかんないな。
777 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:41:24 ] 分かんない事ばかりなのに使わなければならないC++って、怖くね?
778 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:47:31 ] >>776 friend関数はクラスのメンバではないから・・・かな? class A { private: friend void foo() { ... } // メンバのように見えるけど実はグローバル関数なのでアクセス制御は効かない }; int main() { foo(); }
779 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:48:13 ] C++以外の言語も使いますが分からないことだらけです。
780 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 19:36:07 ] 何が分からないか判っていれば解ったも同然だ
781 名前:デフォルトの名無しさん [2008/05/13(火) 19:54:24 ] friend関数、VC2005からtemplate<class T>を頭につけないと コンパイルが通らなくなったんですね。C++0xはまだなのに こういう仕様変更はひそかにやってるんですか? それとも、もともと規格書にはこう決められていてやっと Vc++2005で対応できた、ということですか?
782 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:31:33 ] >>777 わかんない部分は無理して使う必要はないし。 でも、わかった後それを使うと今までだらだら長く書いていたコードがすっかりコンパクトにまとまってショックを受けることが多々ある。
783 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:43:20 ] >>781 それは後者 でも前者みたいなひそかな変更もVC++はよくやる。 いや、きちんと文書化されているけどね。 例えばtype traits支援とかC99の%a書式とか。
784 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:41:47 ] もう C++ なんて好きでもないし使いもしない理由。 ttp://www.hyuki.com/yukiwiki/wiki.cgi?WhyINoLongerLikeOrUseCPlusPlus 悔しいけど納得した。
785 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 13:24:39 ] 確かにめんどくさいし手間が掛かる…
786 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:04:26 ] C++ Programming Languageを端から端まで二度読める知能があれば右辺値参照ごときにどうして瞼が落ちるのか。
787 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:14:04 ] 落ち着かない仕様 時間の掛かる修正 度重なる保守
788 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:15:27 ] C++は仕事に向かない言語とういのには同意だな
789 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:30:05 ] C++ Programming Languageを二度読むのに必要なのは知能ではなくて忍耐力だからな
790 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 14:57:10 ] 性能に取り憑かれているのは自分でも気づいているがどうしてもやめられない。
791 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:08:56 ] Java も使うけど、C++ の方が楽に感じる事多いな。 気を付けないと保守が大変というのはわかる。 ただ、どの言語でも保守の問題はあるし、気を付ければ そんなに問題ないと思ってるけど。まぁ、5年後になんて 言っているかはわからんが。
792 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:57:49 ] C++の全機能を使わなければならない、という規約でもあったのだろうか? 演算子オーバロードは危険だと思ったなら、単にその機能を使わなければよい。 参照は不要でポインタがあれば十分だと思ったなら、単にその機能を使わなければよい。 添え字が範囲の中にあるかテストしてほしいと思ったなら、at()メンバ関数を使えばよい。 なぜ、C++の全機能 vs Cの比較なんだろう? C+α(Better C) vs Cの比較をしないのはなぜだ? 要するに、マヌケだってことだ。
793 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:00:18 ] >>784 のリンク先 C++に過剰に複雑なところがあるのは同意なので、 その人(翻訳者でなく)がC++嫌ですって言うこと自体に批判は特に無いけど、 ちょっとツッコミ書くてst。 >C の方を使いたくなる 別に複雑な機能を使わなくても、 ・#defineマクロ(MAXなど)の代わり程度のtemplate ・fopen,fcloseみたいなのをRAIIに扱うための極薄ラッパー などの簡単で便利なものだけ「better C+おまけ」程度に使えば良いと思う。 巧みで知識もあると言う割には、要領が悪い気がしないでもない。 >Java や Groovy に そこでGroovyは無いと思う・・・ 俺もjava好きだから良いんだけど、 もうちょっと他の言語も挙げれば良いのに・・・
794 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:17:12 ] >そこでGroovyは無いと思う・・・ ググったら実質両方Javaでワロタw
795 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 16:22:57 ] >>792 > C+α(Better C) vs Cの比較をしないのはなぜだ? 自分一人で遊んでいるときしか、そういう使い方がうまくいかないからでは。
796 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 20:19:22 ] なぜ今更そのネタを
797 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:02:02 ] >>792 > C++の全機能を使わなければならない、という規約でもあったのだろうか? あるとしたら逆だろう。○○しか使ってはいけない、という規約が無くてカオス化する。 あるいは、そういう規約がちゃんと機能して、自分の仕事がうまくいっているとしても、 「ここまでの規約が無ければ収拾つかなくなるC++って・・・」という虚しさは感じることになる。 「C++に文句を言う奴は、C++を使い切れないマヌケだけ」 というのは、C++信者の反撃としては割とお約束だし、部分的には当たっている。 実際、「一人でちょっとしたものを作ることさえできない」人間の八つ当たりも結構見られるし。 ただ、C++の難点というのは、主に「個人の能力ではどうにもならないところ」に表れるものであって、 この話を個人の能力に全部収めて着地させようというのは、わかっててやってるなら いかにも姑息な「問題のすり替え」ではある。
798 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:14:38 ] > 個人の能力ではどうにもならないところ ってどこだろう
799 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:19:29 ] 他人の脳味噌は自分の脳味噌ではない、という事実とか、 そういう風にして複数の脳味噌によって構築された「すんげえ規模」とか。
800 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:21:47 ] 名前マングリングとかABIとかじゃね
801 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:37:50 ] C++最高!とまでは言わないが、ハードと離れた言語は使う気しないな
802 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:39:21 ] >>799 それはC++に限った話じゃないな CでもJavaでもPHPでもよくある話だ >>800 ABIが規定されていてうまく機能している言語ってあります? ちなみに、自分はC++信者なわけではない 素直な感想と疑問
803 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:46:45 ] >>797 どの言語でも仕事で coding する時は文法的に正しければなんでも良い なんてことは無いはずだが。規約を全く無くせば収拾つかなくなると思うが。 規約を決めるのを C++ に限ったことではない。 元の記事はむしろ binary の compatibility を問題にしてるんじゃないかな。
804 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:05:02 ] >>802-803 「有るか無いかでいったら、どの言語にだってあるぞ」 というのは確かにその通りだけど、この場合はC++の「度合いのひどさ」を問題にしているわけで、 ゼロじゃないからどの言語もみんな仲間! ってのは、話の持って行き方としてちょっと違うと思う。
805 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:15:56 ] >>804 でもJavaぐらいだと>>799 の問題は似たようなものな気がするけど だんだん複雑になってきてるし ある程度表現力が高い言語になると普遍的な問題じゃないかな C++だとまともに書けない人でもJavaなら書けるのだろうか そんな人がPythonならまともに書けるのか?
806 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:39:39 ] 規模の問題はちょっと違うだろうね。 名前マングリングに関しては確かにC++のは委員会とかの人も 普通に「どうにかしたい」って思ってそうだけど、 実質、ABIがさえ合えば問題無し、って程簡単じゃないから 再コンパイルした方が良い。 UNIX、Linux系ではオプションの変更程度で再makeすることも多いし。 それに完全にバイナリで使うなら.soとか.dllで考え方が良い。
807 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:46:07 ] 例外とか this ポインタの実装手段の違いとかも問題になるんじゃね。
808 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 00:27:21 ] >>797 で言っている問題で、何でも使うか使わないかは、 compile し直そうが残る問題が多いけど。特に保守性考えると。 件の ABI の問題は compile し直せばいい問題じゃないの? (だから問題になりえないと言っているわけではないが) ちょっと違うことを問題にしていて議論が混ざってる気がする。
809 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 21:20:35 ] 質問があります 代入演算子をprotectedないしprivateにしたいんですが、 実装はデフォルトで生成されるものそのままでいいんです class Hoge { // さまざまなメンバ変数(代入演算子があったりなかったりする) Hage hage; Fuga fuga; int hensuu; protected: Hoge& operator=(const Hoge&); }; ってやったらリンクエラーになるんですがどうすればいいでしょう イチイチ中身書くのも面倒で・・・
810 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 22:07:43 ] イチイチ中身書くしかない
811 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:25:47 ] C++0x では default キーワードでデフォルト実装を作ってくれるそうです。
812 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:26:25 ] handle-bodyイディオムで書いて、handleの代入演算子をprotectedなりにすればどう?
813 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:09:30 ] バイナリとしての0x00をchar配列に格納したいんですが、終端文字として認識されてしまいます。 こういう時ってどうすればいいのでしょうか?? ご教示いただけると幸いです。
814 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:16:56 ] もしかしてstrcpyとか使ってるのか?
815 名前:デフォルトの名無しさん [2008/05/17(土) 01:21:39 ] レスどもです。 いえ、const char [] 型に0x00を含む文字列を格納して、cout とかで出力しようとすると0x00以降が出力されないんです。
816 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:22:37 ] 考えるだけでも恐ろしい
817 名前:デフォルトの名無しさん [2008/05/17(土) 01:22:59 ] それは当たり前 仕様 0は文末というのが原則です。
818 名前:デフォルトの名無しさん [2008/05/17(土) 01:24:21 ] 出力させたいんだったら、string使えば出来るはず。 こっちはサイズまではちゃんと出力したと思う。 たとえばstr.resize(10000,'\0'); cout<<str;とする。
819 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:24:53 ] とすると、バイナリとしての0x00を途中に含むchar文字列を作りたいんですが、無理なんでしょうか??
820 名前:デフォルトの名無しさん [2008/05/17(土) 01:25:58 ] 0を含むchar配列はできるよ でもstrlenとかは間違える 自分で長さを管理すればよい。
821 名前:デフォルトの名無しさん [2008/05/17(土) 01:27:56 ] たとええばchar配列で0を含まないならstrcpy、strcmpなどを使い、 0を含むなら長さを自分で指定するmemcpyやmemcmpを使う。
822 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:28:55 ] いや作れるよ char配列の内容がNTCSであることを仮定している関数・APIに NTCSでないchar配列を突っ込んでいることが間違いなだけ
823 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:47:42 ] なるほど! 0x00を入れると格納はされているけど出力できていなかったということですね。 長さを指定したら出力できました。 レス下さった方々ありがとうございましたm(_ _)m