C++相談室 part85
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/09(土) 20:22:35ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0552デフォルトの名無しさん
2010/10/27(水) 21:17:41言語仕様的に必要性がない
0554デフォルトの名無しさん
2010/10/27(水) 21:25:22普通は入れ子のクラスは親のクラスのプライベート領域にもアクセス出来るんだけど
古いコンパイラだと対応してないらしい
そういう時はProxyをfriendにして誤魔化してくれ
0555デフォルトの名無しさん
2010/10/27(水) 22:23:26方法を教えてください
0556デフォルトの名無しさん
2010/10/27(水) 22:24:010557555
2010/10/27(水) 22:31:280558デフォルトの名無しさん
2010/10/27(水) 22:40:530559デフォルトの名無しさん
2010/10/27(水) 22:42:340560デフォルトの名無しさん
2010/10/27(水) 22:47:11じゃあ最初からなければいいのに、なんであるの?
0561デフォルトの名無しさん
2010/10/27(水) 22:49:25typeid と dynamic_cast さえ使わなければ RTTI は使ってないとか思ってるだろ
0562デフォルトの名無しさん
2010/10/27(水) 22:51:040563デフォルトの名無しさん
2010/10/27(水) 22:53:480564デフォルトの名無しさん
2010/10/27(水) 22:54:210565デフォルトの名無しさん
2010/10/27(水) 22:59:420566デフォルトの名無しさん
2010/10/27(水) 23:00:560567555
2010/10/27(水) 23:02:30ありがとうよ
ただ単に少しテストしてみたい事があっただけ
大きいプログラムを作るつもりはない
0568デフォルトの名無しさん
2010/10/27(水) 23:07:560569デフォルトの名無しさん
2010/10/27(水) 23:13:330570デフォルトの名無しさん
2010/10/27(水) 23:16:200571デフォルトの名無しさん
2010/10/27(水) 23:26:040572デフォルトの名無しさん
2010/10/28(木) 00:07:44こういうこと言う人、まだ居るんだ。根深い迷信だな。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html
0573デフォルトの名無しさん
2010/10/28(木) 00:09:18virtual 使ったら RTTI 使ってることになるの?なんで?
0574デフォルトの名無しさん
2010/10/28(木) 00:13:59RTTI って本質的に何だと思う?
ちなみに禿は virtual の新設に始めは懐疑的だったらしいよ
0575デフォルトの名無しさん
2010/10/28(木) 00:14:530576デフォルトの名無しさん
2010/10/28(木) 00:16:150577デフォルトの名無しさん
2010/10/28(木) 00:18:12設計ミスかどうかを論じている
0578デフォルトの名無しさん
2010/10/28(木) 00:22:240579デフォルトの名無しさん
2010/10/28(木) 00:25:55どーでもいいことを干渉しにくる頭を製造ミスされた奴がいるな
0580デフォルトの名無しさん
2010/10/28(木) 00:26:540581デフォルトの名無しさん
2010/10/28(木) 00:29:19じゃ>>560-561あたりの反論は、ふかく考えずに勢いで言っただけでぜんぜん成り立たないってことですね。
0582デフォルトの名無しさん
2010/10/28(木) 00:31:17もういいよ
0583デフォルトの名無しさん
2010/10/28(木) 00:31:220584デフォルトの名無しさん
2010/10/28(木) 00:33:410585デフォルトの名無しさん
2010/10/28(木) 00:34:37ほとんどだろうけど、RTTIはそれとは逆の向きに使われることが多そう。
ぜんぜん違う機能だと思う。
実行時に動作が決まるってところで同じだって言ってるのだろうか。
それは見当違いだよな。
0586デフォルトの名無しさん
2010/10/28(木) 00:35:04どんだけ失言こいても自分個人の品位と関係ないし
0587デフォルトの名無しさん
2010/10/28(木) 00:35:58これはかっこ悪い。
0588デフォルトの名無しさん
2010/10/28(木) 00:38:53これは RTTI だと思う?
struct a
{
union { void* b; char* c; double* d; };
enum { e, f, g } h; //here!!
};
0589デフォルトの名無しさん
2010/10/28(木) 00:39:10自分自身には関係あるだろ。他人にうかがい知れないだけで。
0590デフォルトの名無しさん
2010/10/28(木) 00:41:47なるほどね、それで必死になるのがねらーの習性なわけね
ぱぴこしてきたのが誰だったかによって効果が色々って言ってあげれば
少しは話に入ってこれるかな
0591デフォルトの名無しさん
2010/10/28(木) 00:41:59RTTIって「自分はこう思う」って勝手に定義していいものなの?
0593デフォルトの名無しさん
2010/10/28(木) 00:45:00じゃ「これはRTTIか?」とか聞くなよ。
0594デフォルトの名無しさん
2010/10/28(木) 00:46:54では「設計ミスか?」にしようか
ただし元々の RTTI の定義と全く無関係でもないんだよな
0595デフォルトの名無しさん
2010/10/28(木) 00:48:24>>589 の言っていることは、
> それで必死になるのが
とは、むしろ逆だと思うんだが。
冷静さを失って書けば書くほど品位は貶められるんだから。
0596デフォルトの名無しさん
2010/10/28(木) 00:49:14「はぁ? じゃこれはどうよ」ってunion持ち出すって、支離滅裂だろ。
0597デフォルトの名無しさん
2010/10/28(木) 00:49:21誰の?
0598デフォルトの名無しさん
2010/10/28(木) 00:50:18おまえが読めていないだけ
とぼけているのではなくガチなら残念ながら相手にならない
0599デフォルトの名無しさん
2010/10/28(木) 00:52:04失言した者、だろうな
0600デフォルトの名無しさん
2010/10/28(木) 00:53:22おまえ説明できないから、意味深げに言ってるだけだろ。
モゴモゴ言ってないで、単刀直入に説明してみろよ。
どうせできないんだろうけど。
0601デフォルトの名無しさん
2010/10/28(木) 00:56:32そりゃちゃうやろ
失言した者という抽象概念が指すオブジェクト個々により
冷静さの有無により品位が下がったり下がらなかったりするわけで
0602デフォルトの名無しさん
2010/10/28(木) 00:57:21単刀直入に言ったよ
具体的なコードまで晒してね
で、読めてない人がいるわけで
0603デフォルトの名無しさん
2010/10/28(木) 01:03:29いやぜんぜん言ってないね。
「RTTIが必要ってことは設計ミスだね」
↓
「unionはRTTIだと思う?」
質問に質問で返してるだけで、説明らしきものはまったくない。
0604デフォルトの名無しさん
2010/10/28(木) 01:04:46C++は静的型付けによりその堅牢性と最適化を期待できるから
だからそれを害しない程度にRTTIを使用する分には問題ない
過度な実行時型解決は静的型付けの堅牢性とパフォーマンスを阻害してしまう
それではC++を使用する意味がない
一昔前のハードが貧弱だった頃は、RTTIのコストがバカにならないという時代もあった
当時はRTTIがデフォルトでは使用できないという環境もあったくらい
そのさらに一昔前は仮想関数のコストがバカにならないという時代もあった
MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残
0605デフォルトの名無しさん
2010/10/28(木) 01:05:04おまえさんの言い方に合わせて言うなら
enum は RTTI か、だったはずなんだが
//すら読めてないのな
0606デフォルトの名無しさん
2010/10/28(木) 01:06:36これは virtual が悪いんじゃなくメッセージが 32bit もあることに原因があるわけで
0607デフォルトの名無しさん
2010/10/28(木) 01:09:15> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残
これは単にメッセージに全部仮想関数を割り当てるとvtblが大きくなりすぎるから。
べつに仮想関数のパフォーマンスどうこうって話じゃない。
0608デフォルトの名無しさん
2010/10/28(木) 01:13:05またそれはちがう、これは違うみたいな話かよ。
もうこうやって人を煙にまく(本人はまいたつもり)みたいなのが習い性に
なってるんだろうな。
0609デフォルトの名無しさん
2010/10/28(木) 01:13:24コストって意味にはその意味も含んでいるんだけどね
0610デフォルトの名無しさん
2010/10/28(木) 01:15:320611デフォルトの名無しさん
2010/10/28(木) 01:16:14そういう面も含んでるならいまだってメッセージごとに仮想関数に割り当てるとか、そんな設計しないだろ。
0612デフォルトの名無しさん
2010/10/28(木) 01:17:09おまえ enum って書かれた瞬間に switch か else if と来ない?
つまり実行時判定を連想するかってのが読めてる読めてないってことだぜ
0613デフォルトの名無しさん
2010/10/28(木) 01:20:32結局なんも説明しないわけでしょ?
実行時に、型が決まるものは全部いっしょくた程度の考えしかないのは
分かったから別に説明しなくてもいいけど。
0614デフォルトの名無しさん
2010/10/28(木) 01:22:28それで?
unionにラベルがふってあったら、そういう使い方しか
思いつかないでしょ。ふつーに。
0615デフォルトの名無しさん
2010/10/28(木) 01:23:00本人でない私に言われても困るんだけど
0616デフォルトの名無しさん
2010/10/28(木) 01:24:22union に過剰反応されるとは思わなかった
じゃあいい、あの union は一切忘れてくれ
その隣にあった enum だけで論じよう
実行時に判定する設計は全てミスか?
0617デフォルトの名無しさん
2010/10/28(木) 01:26:42いちいち断らないが勝手に落ちるぞ
0618デフォルトの名無しさん
2010/10/28(木) 01:27:30また支離滅裂路かよ。
enumだけにしたら、ますます関係なくなるじゃん。
むしろ実行時に型がどうこうだったらunionが本質じゃん。
0619デフォルトの名無しさん
2010/10/28(木) 01:29:45そうだよ、だからそのために union を書いた
だがあくまで核心は enum で // にそう書いた
0620デフォルトの名無しさん
2010/10/28(木) 01:34:210621デフォルトの名無しさん
2010/10/28(木) 01:35:280622デフォルトの名無しさん
2010/10/28(木) 01:36:32実行時に型をどうこうみたいな話で、unionとそれの型を選択するenumと
どっちが本質かとか勝手にこだわって、相手がunionって言ったら、
「おまえわかってねー」って勝手に上げ足とったつもりになって、
ばからしいとおもわねえ?
実行時に型が決まるよな動作は全部いっしょくたって以上の認識でてこないじゃん。
結局。
0623デフォルトの名無しさん
2010/10/28(木) 01:37:17もちろんvirtualあるケースで。
newなどで確保したメモリの中にあるの?
Yesなら後ろ?それとも前?
0624デフォルトの名無しさん
2010/10/28(木) 01:38:39断ってるじゃん。
逃げたとか思われるのがいやなんだろ?
>>586みたいなこと、かっこつけて言うなよ。
0625デフォルトの名無しさん
2010/10/28(木) 01:41:19揚げ足? そう誤解されそうなことさえ言ったつもりはないが
もう >>616 の時点で核心そのものを言ってるので
あとは俺ぬきでもいいくらいだ
0626デフォルトの名無しさん
2010/10/28(木) 01:41:55やめろー、引き留めるな鬼畜
0627デフォルトの名無しさん
2010/10/28(木) 01:42:18仮想関数用の vtbl に vtbl[-1] として typeid が入ってる実装を見たことがある。
これならコンパイルオプションで RTTI 無効にしたバイナリとも互換性を保つことが
できそうだなー、と勝手に解釈して感心した。
0628デフォルトの名無しさん
2010/10/28(木) 01:44:20まあ、精神防衛で、自分の言ってることを信じ込んでる人とかよく見るしね > 誤解
0629デフォルトの名無しさん
2010/10/28(木) 01:45:090630デフォルトの名無しさん
2010/10/28(木) 01:47:10ありがとう。
そういう実装だった場合virtualでないやつはどうやってtypeid引っ張ってくるんだろう?
そういう使い方をしたことがないから知らないってだけだけど。
0631デフォルトの名無しさん
2010/10/28(木) 01:49:07最近のはオプションじゃなくてデフォでついてるの?
0632デフォルトの名無しさん
2010/10/28(木) 01:52:37virtual な関数を持つクラス型以外については、そもそも RTTI に基づく挙動は
必要とされず、すべて静的な型情報で処理される。なので、何の工夫も要らない。
5.2.8 p3 より
> When typeid is applied to an expression other than an lvalue of a polymorphic
> class type, the result refers to a type_info object representing the static type of
> the expression.
0633デフォルトの名無しさん
2010/10/28(木) 01:54:14C++98 の時点から標準でついてる。各コンパイラの実装は知らないけど、たぶん
標準を反映してデフォルトで有効になってるはず。
0634デフォルトの名無しさん
2010/10/28(木) 01:59:21なるほど、別に正確な生成時の型が帰ってくるわけじゃないのか。ありがとう。
0635デフォルトの名無しさん
2010/10/28(木) 02:08:21今はどうかしらないけど。
0636デフォルトの名無しさん
2010/10/28(木) 02:21:31VC6〜VC2003はデフォルトではオフ(GRスイッチ)だったと思う
スイッチ入れて使った記憶がある
2008はデフォルトではオン
2010は特に指定されてないけどdynamic_castが正常に動いてるからオンだと思う
明示的にGRスイッチをオフにしたら警告出てstd::__non_rtti_object投げて異常終了した
0637デフォルトの名無しさん
2010/10/28(木) 03:07:350638デフォルトの名無しさん
2010/10/28(木) 22:05:410639デフォルトの名無しさん
2010/10/28(木) 22:09:010640デフォルトの名無しさん
2010/10/28(木) 22:53:59<Hoge*>ではなく<Hoge>で大丈夫なのですか?
0641デフォルトの名無しさん
2010/10/28(木) 22:55:520642デフォルトの名無しさん
2010/10/28(木) 22:58:22uint32_tをハンドルにしてスマポに管理させたい時とか不便
0643デフォルトの名無しさん
2010/10/28(木) 23:05:140644デフォルトの名無しさん
2010/10/28(木) 23:07:02http://msdn.microsoft.com/ja-jp/library/h4bcz65t(VS.80).aspx
0645デフォルトの名無しさん
2010/10/28(木) 23:07:390647デフォルトの名無しさん
2010/10/28(木) 23:12:44std::auto_ptrとかは正式名称
0648デフォルトの名無しさん
2010/10/28(木) 23:31:05この処理結果って見づらいね
0649デフォルトの名無しさん
2010/10/28(木) 23:35:44cppunitとかでgccとVCで結果が違ってムッとした記憶がある。
0650デフォルトの名無しさん
2010/10/28(木) 23:45:05それは見るもんじゃないよ
あくまでも operator== で比較するだけのためのものだと思った方がいい
0651デフォルトの名無しさん
2010/10/28(木) 23:54:34Yes
0652デフォルトの名無しさん
2010/10/29(金) 01:45:05Foo(int x) {}
private:
Foo &operator=(Foo&);
};
上記のクラスの宣言と初期化を同時に行うとき、
Foo x = 5;
のように書けますが、これは operator= の呼び出しではなく、
Foo x(5);
と書くのと同じ意味になるのだと思います。なぜなら、初期化後に改めて
x = 10;
と書いた場合はマッチする operator= がないのでコンパイルできないからです。
この「宣言と初期化を同時に行うときの=は特別」と言うことを規格で確認したいのですが、
どの項を見ればいいのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています