1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
449 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:41:27 ] >>447 そういうこと。
450 名前:442 mailto:sage [2010/03/03(水) 04:18:56 ] >>448 >>449 ありがとうございます!
451 名前:デフォルトの名無しさん [2010/03/03(水) 07:50:18 ] ツリーのクラス構造について質問です。 現在、以下のようなクラスを考えています。 class Base{} class ParentBase : public Base { }; class Parent : public ParentBase { }; class ChildBase : public Base { }; class Child : public ChildBase { }; class ChildA : public Child {} class ChildB : public Child {} class ParentA : public Parent { public: ChildA childa; ChildB childb; }; class ParentB : public Parent { public: ParentA parenta; }; Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B) ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか? やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。 一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。 何かいい方法はないでしょうか?
452 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:04:37 ] ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある
453 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:15:38 ] >>451 コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、 いろいろあるだろ。何が気に入らないんだ?
454 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:27:28 ] struct hoge: public unary_function<int,int> { int operator(int); }; 的な関数オブジェクトを g++ -Weffc++ hoge.cpp でコンパイルした場合、 warning: base class struct std::unary_function<int, int> has a non-virtual destructor というエラーがどうしても出るのですが、 ライブラリの責任であってユーザ側からは対応しようがない、 というので正しいでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:41:08 ] protected継承
456 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:43:09 ] >>454 ja.lmgtfy.com/?q=%22warning%3A+base+class%22+std%3A%3Aunary_function+%22has+a+non-virtual+destructor%22
457 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:35:06 ] >>456 要するにGCCがそうだと言ってるからそうだ、ということですね。 これに対するライブラリ実装者の答えが欲しいのですが・・・。
458 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:38:09 ] >>457 どうしてそうなったw
459 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:42:54 ] >>457 >456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、 その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?
460 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:46:39 ] そう読むのか。 コメントのほうを読んで誤解してしまいました・・・。 ありがとうございます。
461 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 16:09:59 ] >>454 が何を問題だと言っているのか判らない。 もしかして、Effective C++ 読まずに問題視してる?
462 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:27:54 ] 調子に乗って struct を class みたいに使うのが悪いんじゃね?
463 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:37:41 ] どうせポリモルに扱わないんだからほっとけよ
464 名前:デフォルトの名無しさん [2010/03/03(水) 22:37:41 ] >>454 どこに「エラー」って書いてあるんだよ もしかしてエラーと警告を混同してるか?
465 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:00:41 ] C++のキャストって長ったらしくてあまり使わないんですが, 実際C++のキャストで助かった&Cのキャストではまった 経験をお持ちの方っていますか?
466 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:08:51 ] C++スタイルはデバッグで見つけやすい
467 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:18:38 ] >>465 キャストは奨励できないからC++のキャストは長い。 キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。 あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。
468 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:20:00 ] long longな値をstd::fstreamに<<すると三桁区切りにcommaが入ってPCが爆発するんだけど 書式設定だとか弄ってcomma入れないような設定できなかったっけ?
469 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:50:17 ] >>465 意図しない、または、意図した以上のキャストをコンパイル時に発見できる
470 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:59:55 ] >>468 localeとfacet thousands_sep()が返す値を確認するとよい
471 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:28:37 ] C++スタイルのキャストでコンパイルエラーがでる度に助かっているわけだ
472 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:44:21 ] >465 検索が簡単。
473 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 05:25:49 ] 分かってても、警告がうざい&タイプが面倒だから、使ってしまう(int)キャスト
474 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 06:50:49 ] >>473 しね
475 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 07:30:55 ] dynamic_castの機能はCスタイルのキャストでは実現できない
476 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 08:12:19 ] キャストの多さは設計の不十分さを示す良い指標
477 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 10:50:11 ] dynamic_castはゆとり const_castはバグ
478 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 12:20:32 ] stdの特殊化が許されてるのはswapだけですか?
479 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:28:12 ] ていうかstatic_castも暗黙的な変換ができないポインタ変換に対して使えちゃうだろ。 static_castは甘え
480 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:33:06 ] dynamic_castを使う設計てどっかミスってるはず ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ
481 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:35:39 ] いやdynamic_castでいいだろw
482 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:37:38 ] >>481 アップキャストした後にダウンキャストとかポリモーですらないじゃん
483 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:40:39 ] クロスキャストなんてboostにそれ専用のがあるだろ?
484 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:43:24 ] >>483 うるせーテーブル作らせろ いやまじでダウンキャストとか使う場面なくね? 面倒だからやっちゃえとかならわかるんだが
485 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:54:06 ] 同意 内部でdynamic_cast使ってるboostとか糞だよな
486 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:14:02 ] RTTI嫌ってるやつって厨二病みたいなもんだろ?
487 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:32:25 ] RTTIは遅くなるっていうけど、実際影響がどんなもんか分からん
488 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:39:26 ] RTTIで起きる速度低下の影響は自前で仮想関数テーブルを用意する場合と同じ。
489 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:41:41 ] 見栄の問題なのか?w
490 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 15:06:56 ] >>489 見栄だよ 型名保持してポインタを型変換するだけだし でも使ってない
491 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:48:51 ] C++ってゲームプログラミングに使える?
492 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:56:09 ] >>491 DirectX使えば、いろいろ綺麗に作れるぞ。
493 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 18:18:44 ] >>492 取り合えず勉強してみます ありがとう!
494 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:14:40 ] キャストは結局のところ「正しくないかもしれないけど見逃してくれ」とコンパイラに指示している。 キャストが正しいことをプログラマーが保証しなければならない。 dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。 どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。 暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。 わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。
495 名前:デフォルトの名無しさん [2010/03/04(木) 20:22:37 ] プログラムが正しいかどうかをコンパイラに丸投げする考えのほうがよっぽど危険だよ 第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは できることとしていいことの分別がつく人しか C++ を使うべきではないということだ
496 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:31:50 ] キャストは影響を局所化してさらに見えないように包めばいいじゃない
497 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:35:09 ] >>487 1万回ループさせて0.1秒差とかそんなもん >>494 NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん そんなの参照と例外に狂ってるやつくらいだろ
498 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:50 ] 暗黙の型変換でプログラムが堅牢になると聞いて
499 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:59 ] たった10000回で100msも差がでるのか。 100000000回で10msくらいでもまだ遅いのに
500 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:42:30 ] >>499 そんな見栄を張るなよw
501 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:43:44 ] >>478 swap以外もすべて明示的特殊化してよい。
502 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:32 ] 暗黙の型変換で堅牢 ハハッ
503 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:45 ] >>500 ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。 もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。
504 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:04:38 ] >>503 自衛隊がお断りだ
505 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:19:52 ] >>504 もうニート生活はやだよ・・・
506 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:01:18 ] 普通にstatic_castしか使わない = Cのキャストでおk static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
507 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:06:17 ] >>506 > static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ いや、わからない人用にあるわけじゃないんだけど。
508 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:09:06 ] >>506 どんなに経験積んだって人間は間違えるから予防が必要なんだよ
509 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:14:27 ] 構文が悪い static_cast<int>(var)と(int)varじゃ 後者を使いたくなるのもわかる
510 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:15:31 ] >>506 よくないよ。 static_cast 継承関係に無い型をキャストしようとエラーになる Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。
511 名前:デフォルトの名無しさん [2010/03/05(金) 00:31:20 ] インディアン 嘘つかない
512 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 00:46:24 ] Cスタイルのキャストを残したビャーネが悪い
513 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:00:33 ] 残すも何も互換性だから
514 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:04:56 ] じゃあ完全互換じゃなくしたビャーネはもっと悪い
515 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:07:44 ] CとC++って完全互換じゃないの? extern C/C++ とかでなんとかなると思ってたんだけど だれか反例教えちくり
516 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:13:04 ] 100%の互換となることを目標としたことは一度もない、とプログラミング言語C++に書かれているよ
517 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:26:17 ] そうなのか,買って呼んでみるよ
518 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:28:12 ] >>515 www.google.co.jp/search?q=C+C%2B%2B+%E4%BA%92%E6%8F%9B%E6%80%A7 www.google.co.jp/search?q=C+C%2B%2B+compatibility
519 名前:デフォルトの名無しさん [2010/03/05(金) 01:30:15 ] int class; この時点から 100% じゃないしな
520 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:10 ] >>515 変数名に new とか関数名に delete とか、余裕で死ねる。
521 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:25 ] C89 でもちょこちょこ違うのに、C99 で決定的になったからな<非互換性。 ああ、すべての言語に複合リテラルがあればいいのに。
522 名前:デフォルトの名無しさん [2010/03/05(金) 01:47:46 ] >>521 残念ながら C++ は C89 ではなく K&R C から派生した言語なので C++ が C89 に対して互換性がないのではなく、 C89 が C++ に対して互換性がないんだよ C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で extern "C" などの後付け設定がこの原則の例外
523 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:50:13 ] >>522 > 残念ながら C++ は C89 ではなく K&R C から派生した言語なので はつみみです ソースある?
524 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:51:49 ] D&Eでございます。
525 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:05:31 ] それ、禿一人で作ってたころのはなしじゃねーの? 少なくとも ISO C++ が参照してる C は ISO C だし。
526 名前:デフォルトの名無しさん [2010/03/05(金) 02:07:38 ] どのクラスからも呼び出すことの出来る変数はどのように宣言するのでしょうか? staticやexternがあるみたいですが いかんせんエラーが出ます。どうか教えてください
527 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:00 ] >>522 C++ の設計が K&R C から始まったとして、どうしてそれが 標準 C++ と標準 C との互換性の主従に関係するの?
528 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:44 ] >>526 ソースとエラーメッセージうp 長いなら >>6 へ
529 名前:デフォルトの名無しさん [2010/03/05(金) 02:15:54 ] >>528 長いんで省略した形で記述します。 たとえば ================================== //○×.h class Cabc : public ** { 省略 public: //ここでグローバル変数を記述したい static CString str; //省略 } ///////////////////////////////////// ○X.cpp //省略 str = _T("a"); //省略 ///////////////////////////////////// このstrの値を他のクラスで使いたい場合 CString buf; buf = Cabc::str ; のようにしてもダメなんでしょうか? わかりにくくてごめんなさい なにぶん初心者ですのでよろしくおねがいします
530 名前:デフォルトの名無しさん [2010/03/05(金) 02:17:13 ] >>527 公式に「主従」なんかないだろう 俺は事の経緯から導かれる道義的な関係を指摘したまで
531 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:22:40 ] >>515 extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。 構文の解釈が変わるなどといったことは起こらない。 互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。
532 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:31:53 ] >>530 いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。 C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。
533 名前:デフォルトの名無しさん [2010/03/05(金) 02:36:39 ] >>532 C89 の目玉が C++ からの逆輸入という事実もあるわな 当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ どっちが合わせるべき立場にあったかは明確であろう
534 名前:デフォルトの名無しさん [2010/03/05(金) 02:37:24 ] 今日は寝落ち
535 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:45:27 ] >>533 合わせるべき立場とか、無いから。それ、妄想だから。 その調子で「C++0x は C# に合わせるべき立場にいる」とか 「C++0x は D に合わせるべき立場にいる」言い出すやつが いたとしたらどう思うよ? あんたが C++ 大好きなのはわかったが、これはさすがに 言いすぎだろ。
536 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:58:29 ] 先発のものが後発に合わせるわけにはいかないってだけのことだろ C#がC++0xに対して互換性が無いのと一緒
537 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:00:29 ] long longや可変個引数マクロ、数学関数などC99からC++0xへ持ち込まれるものだってある。 初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。 CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。
538 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:04:36 ] 内部クラスではtemplateが使えないのでしょうか? 以下のようなコードとコンパイルエラーが出ます。 gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) test0.cpp: In function ‘void func()’: test0.cpp:14: error: expected primary-expression before ‘template’ test0.cpp:14: error: expected ‘;’ before ‘template’ test0.cpp:30: error: expected ‘}’ at end of input 12: void func() 13: { 14: template<class T> 15: class Hoge{ 16: public: 17: static void foo( const T& val ){ 18: cout << val << endl; 19: } 20: }; 21: 22: Hoge::foo(); 23: }
539 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:24:35 ] 使えない。
540 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:03:48 ] >>529 > わかりにくくてごめんなさい わかりにくいのは、エラーが何なのかをキミが隠しているからだ。 人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて 送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。
541 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:57:39 ] >>529 .cppのstrって何者?
542 名前:デフォルトの名無しさん [2010/03/05(金) 07:37:28 ] >>540 えっと、、そこまで難しいことではないんです ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ でそういうのはどうするのか?という質問なんです。
543 名前:デフォルトの名無しさん [2010/03/05(金) 07:39:41 ] >>541 ヘッダで宣言したCStringのつもりです。 このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか? とても困っています よろしくお願いします
544 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:42:25 ] ここまで頑としてエラーを書かないのは何でだろうね。 クイズの出題者気取り?
545 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:44:23 ] 静的メンバ変数でググれ
546 名前:デフォルトの名無しさん [2010/03/05(金) 07:50:13 ] >>544 エラーは LicenselistViewerList.obj : error LNK2001: 外部シンボル ""public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > > CLicenselistViewerList::strrr" (?strrr@CLicenselistViewerList@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)" は未解決です。 です。 俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです 本当に困っています
547 名前:デフォルトの名無しさん [2010/03/05(金) 07:51:54 ] >>545 ググって解決できないから頼んでます。 静的メンバ変数だとこのやりかたで宣言したstrは Cabc::strで外の変数を使えるとあります。 使えません どうしてでしょうか?
548 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:03:30 ] 宣言はあってる 定義の仕方が悪い
549 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:08:19 ] >>546 エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ class名::str; を.cppの先頭付近にでも書いとけ