トップページ⇒tech
1001コメント275KB

C++相談室 part85

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/10/09(土) 20:22:35
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
0552デフォルトの名無しさん2010/10/27(水) 21:17:41
>>543
言語仕様的に必要性がない
05535432010/10/27(水) 21:17:47
>>549
thx
0554デフォルトの名無しさん2010/10/27(水) 21:25:22
>>538
普通は入れ子のクラスは親のクラスのプライベート領域にもアクセス出来るんだけど
古いコンパイラだと対応してないらしい
そういう時はProxyをfriendにして誤魔化してくれ
0555デフォルトの名無しさん2010/10/27(水) 22:23:26
どのクラスからインスタンス化したのか知りたいのですが、
方法を教えてください
0556デフォルトの名無しさん2010/10/27(水) 22:24:01
クラス名を返す関数を設ける
05575552010/10/27(水) 22:31:28
javaのinstanceofみたいな事をしたいのですが
0558デフォルトの名無しさん2010/10/27(水) 22:40:53
したいのですが……何?
0559デフォルトの名無しさん2010/10/27(水) 22:42:34
RTTIが必要になるのは設計ミス
0560デフォルトの名無しさん2010/10/27(水) 22:47:11
typeid、dynamic_cast、const_cast とかは使うなとかいうけど、
じゃあ最初からなければいいのに、なんであるの?
0561デフォルトの名無しさん2010/10/27(水) 22:49:25
ふーん、じゃ virtual を使うプログラムは全て設計ミスだな
typeid と dynamic_cast さえ使わなければ RTTI は使ってないとか思ってるだろ
0562デフォルトの名無しさん2010/10/27(水) 22:51:04
ミスだろ馬鹿じゃねーの
0563デフォルトの名無しさん2010/10/27(水) 22:53:48
C++を使うこと自体がミスだよね
0564デフォルトの名無しさん2010/10/27(水) 22:54:21
これはこれは面白そうな新説ですな、山田さん
0565デフォルトの名無しさん2010/10/27(水) 22:59:42
C++自体がミスじゃね
0566デフォルトの名無しさん2010/10/27(水) 23:00:56
やはり++Cにすべきだったか
05675552010/10/27(水) 23:02:30
お前らのレスで、目的の情報を見つけた
ありがとうよ

ただ単に少しテストしてみたい事があっただけ
大きいプログラムを作るつもりはない
0568デフォルトの名無しさん2010/10/27(水) 23:07:56
RTTIすら知らなかったの?
0569デフォルトの名無しさん2010/10/27(水) 23:13:33
しらん
0570デフォルトの名無しさん2010/10/27(水) 23:16:20
スマートポインタをメンバに持つクラスをスマートポインタで管理しても意味ないですよね
0571デフォルトの名無しさん2010/10/27(水) 23:26:04
意味はある
0572デフォルトの名無しさん2010/10/28(木) 00:07:44
>>529
こういうこと言う人、まだ居るんだ。根深い迷信だな。
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html
0573デフォルトの名無しさん2010/10/28(木) 00:09:18
>>561
virtual 使ったら RTTI 使ってることになるの?なんで?
0574デフォルトの名無しさん2010/10/28(木) 00:13:59
>>573
RTTI って本質的に何だと思う?
ちなみに禿は virtual の新設に始めは懐疑的だったらしいよ
0575デフォルトの名無しさん2010/10/28(木) 00:14:53
vtbl[0] = ?
0576デフォルトの名無しさん2010/10/28(木) 00:16:15
virtualもRTTIに含まれるとか、またオレオレ定義かよ。
0577デフォルトの名無しさん2010/10/28(木) 00:18:12
言葉の定義を問うているのではない
設計ミスかどうかを論じている
0578デフォルトの名無しさん2010/10/28(木) 00:22:24
ageてんのは一人のアホ
0579デフォルトの名無しさん2010/10/28(木) 00:25:55
本質的って言葉をわざわざ使ってるのに
どーでもいいことを干渉しにくる頭を製造ミスされた奴がいるな
0580デフォルトの名無しさん2010/10/28(木) 00:26:54
>>561
0581デフォルトの名無しさん2010/10/28(木) 00:29:19
>>577
じゃ>>560-561あたりの反論は、ふかく考えずに勢いで言っただけでぜんぜん成り立たないってことですね。
0582デフォルトの名無しさん2010/10/28(木) 00:31:17
引っ込みのつかなくなった人を弄って遊ぶのは
もういいよ
0583デフォルトの名無しさん2010/10/28(木) 00:31:22
>>561 では皮肉を言っただけだよ、額面どおり取るなって
0584デフォルトの名無しさん2010/10/28(木) 00:33:41
恥の上塗り
0585デフォルトの名無しさん2010/10/28(木) 00:34:37
virtualあたりは、型を抽象的に扱うことを意図して使われることが
ほとんどだろうけど、RTTIはそれとは逆の向きに使われることが多そう。
ぜんぜん違う機能だと思う。

実行時に動作が決まるってところで同じだって言ってるのだろうか。
それは見当違いだよな。
0586デフォルトの名無しさん2010/10/28(木) 00:35:04
2chでどうやって「引っ込みがつかなく」なれるんだよ
どんだけ失言こいても自分個人の品位と関係ないし
0587デフォルトの名無しさん2010/10/28(木) 00:35:58
>>583
これはかっこ悪い。
0588デフォルトの名無しさん2010/10/28(木) 00:38:53
>>585
これは 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:59
>>588
RTTIって「自分はこう思う」って勝手に定義していいものなの?
0592デフォルトの名無しさん2010/10/28(木) 00:43:07
>>591
>>577
0593デフォルトの名無しさん2010/10/28(木) 00:45:00
>>592
じゃ「これはRTTIか?」とか聞くなよ。
0594デフォルトの名無しさん2010/10/28(木) 00:46:54
>>593
では「設計ミスか?」にしようか
ただし元々の RTTI の定義と全く無関係でもないんだよな
0595デフォルトの名無しさん2010/10/28(木) 00:48:24
>>590

>>589 の言っていることは、

> それで必死になるのが

とは、むしろ逆だと思うんだが。
冷静さを失って書けば書くほど品位は貶められるんだから。
0596デフォルトの名無しさん2010/10/28(木) 00:49:14
「RTTI使うとか設計ミスだろ」ってツッコまれて、
「はぁ? じゃこれはどうよ」ってunion持ち出すって、支離滅裂だろ。
0597デフォルトの名無しさん2010/10/28(木) 00:49:21
>>595
誰の?
0598デフォルトの名無しさん2010/10/28(木) 00:50:18
>>596
おまえが読めていないだけ
とぼけているのではなくガチなら残念ながら相手にならない
0599デフォルトの名無しさん2010/10/28(木) 00:52:04
>>597
失言した者、だろうな
0600デフォルトの名無しさん2010/10/28(木) 00:53:22
>>598
おまえ説明できないから、意味深げに言ってるだけだろ。
モゴモゴ言ってないで、単刀直入に説明してみろよ。
どうせできないんだろうけど。
0601デフォルトの名無しさん2010/10/28(木) 00:56:32
>>599
そりゃちゃうやろ
失言した者という抽象概念が指すオブジェクト個々により
冷静さの有無により品位が下がったり下がらなかったりするわけで
0602デフォルトの名無しさん2010/10/28(木) 00:57:21
>>600
単刀直入に言ったよ
具体的なコードまで晒してね

で、読めてない人がいるわけで
0603デフォルトの名無しさん2010/10/28(木) 01:03:29
>>602
いやぜんぜん言ってないね。

「RTTIが必要ってことは設計ミスだね」
↓
「unionはRTTIだと思う?」

質問に質問で返してるだけで、説明らしきものはまったくない。
0604デフォルトの名無しさん2010/10/28(木) 01:04:46
>>560
C++は静的型付けによりその堅牢性と最適化を期待できるから
だからそれを害しない程度にRTTIを使用する分には問題ない
過度な実行時型解決は静的型付けの堅牢性とパフォーマンスを阻害してしまう
それではC++を使用する意味がない

一昔前のハードが貧弱だった頃は、RTTIのコストがバカにならないという時代もあった
当時はRTTIがデフォルトでは使用できないという環境もあったくらい
そのさらに一昔前は仮想関数のコストがバカにならないという時代もあった
MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残
0605デフォルトの名無しさん2010/10/28(木) 01:05:04
>>603
おまえさんの言い方に合わせて言うなら
enum は RTTI か、だったはずなんだが
//すら読めてないのな
0606デフォルトの名無しさん2010/10/28(木) 01:06:36
> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残

これは virtual が悪いんじゃなくメッセージが 32bit もあることに原因があるわけで
0607デフォルトの名無しさん2010/10/28(木) 01:09:15
>>604
> MFCのメッセージ処理が仮想関数でなく、メッセージマップマクロで定義されているのはその時代の名残

これは単にメッセージに全部仮想関数を割り当てるとvtblが大きくなりすぎるから。
べつに仮想関数のパフォーマンスどうこうって話じゃない。
0608デフォルトの名無しさん2010/10/28(木) 01:13:05
>>605
またそれはちがう、これは違うみたいな話かよ。
もうこうやって人を煙にまく(本人はまいたつもり)みたいなのが習い性に
なってるんだろうな。
0609デフォルトの名無しさん2010/10/28(木) 01:13:24
>>607
コストって意味にはその意味も含んでいるんだけどね
0610デフォルトの名無しさん2010/10/28(木) 01:15:32
相手にするのが馬鹿馬鹿しくなって放置されるから煙に巻いた気分にはなれるぞ
0611デフォルトの名無しさん2010/10/28(木) 01:16:14
>>609
そういう面も含んでるならいまだってメッセージごとに仮想関数に割り当てるとか、そんな設計しないだろ。

0612デフォルトの名無しさん2010/10/28(木) 01:17:09
>>608
おまえ enum って書かれた瞬間に switch か else if と来ない?
つまり実行時判定を連想するかってのが読めてる読めてないってことだぜ
0613デフォルトの名無しさん2010/10/28(木) 01:20:32
>>610
結局なんも説明しないわけでしょ?

実行時に、型が決まるものは全部いっしょくた程度の考えしかないのは
分かったから別に説明しなくてもいいけど。
0614デフォルトの名無しさん2010/10/28(木) 01:22:28
>>612
それで?
unionにラベルがふってあったら、そういう使い方しか
思いつかないでしょ。ふつーに。
0615デフォルトの名無しさん2010/10/28(木) 01:23:00
>>613
本人でない私に言われても困るんだけど
0616デフォルトの名無しさん2010/10/28(木) 01:24:22
>>614
union に過剰反応されるとは思わなかった
じゃあいい、あの union は一切忘れてくれ
その隣にあった enum だけで論じよう

実行時に判定する設計は全てミスか?
0617デフォルトの名無しさん2010/10/28(木) 01:26:42
ところで眠いし明日も仕事なんだ
いちいち断らないが勝手に落ちるぞ
0618デフォルトの名無しさん2010/10/28(木) 01:27:30
>>616
また支離滅裂路かよ。
enumだけにしたら、ますます関係なくなるじゃん。

むしろ実行時に型がどうこうだったらunionが本質じゃん。
0619デフォルトの名無しさん2010/10/28(木) 01:29:45
>>618
そうだよ、だからそのために union を書いた
だがあくまで核心は enum で // にそう書いた
0620デフォルトの名無しさん2010/10/28(木) 01:34:21
久しぶりに見たな、こんなネット初心者みたいな奴
0621デフォルトの名無しさん2010/10/28(木) 01:35:28
俺は MNP4 から始めたクチだが
0622デフォルトの名無しさん2010/10/28(木) 01:36:32
>>619
実行時に型をどうこうみたいな話で、unionとそれの型を選択するenumと
どっちが本質かとか勝手にこだわって、相手がunionって言ったら、
「おまえわかってねー」って勝手に上げ足とったつもりになって、
ばからしいとおもわねえ?

実行時に型が決まるよな動作は全部いっしょくたって以上の認識でてこないじゃん。
結局。
0623デフォルトの名無しさん2010/10/28(木) 01:37:17
どうでもいいけどRTTIって実際どうやってんだろうね?
もちろんvirtualあるケースで。
newなどで確保したメモリの中にあるの?
Yesなら後ろ?それとも前?
0624デフォルトの名無しさん2010/10/28(木) 01:38:39
>>617
断ってるじゃん。
逃げたとか思われるのがいやなんだろ?
>>586みたいなこと、かっこつけて言うなよ。
0625デフォルトの名無しさん2010/10/28(木) 01:41:19
>>622
揚げ足? そう誤解されそうなことさえ言ったつもりはないが

もう >>616 の時点で核心そのものを言ってるので
あとは俺ぬきでもいいくらいだ
0626デフォルトの名無しさん2010/10/28(木) 01:41:55
>>624
やめろー、引き留めるな鬼畜
0627デフォルトの名無しさん2010/10/28(木) 01:42:18
>>623
仮想関数用の vtbl に vtbl[-1] として typeid が入ってる実装を見たことがある。
これならコンパイルオプションで RTTI 無効にしたバイナリとも互換性を保つことが
できそうだなー、と勝手に解釈して感心した。
0628デフォルトの名無しさん2010/10/28(木) 01:44:20
>>625
まあ、精神防衛で、自分の言ってることを信じ込んでる人とかよく見るしね > 誤解
0629デフォルトの名無しさん2010/10/28(木) 01:45:09
触るなバカ
0630デフォルトの名無しさん2010/10/28(木) 01:47:10
>>627
ありがとう。
そういう実装だった場合virtualでないやつはどうやってtypeid引っ張ってくるんだろう?
そういう使い方をしたことがないから知らないってだけだけど。
0631デフォルトの名無しさん2010/10/28(木) 01:49:07
上のほうで「昔はRTTIはオプションだった」みたいなことが書いてあるけど
最近のはオプションじゃなくてデフォでついてるの?
0632デフォルトの名無しさん2010/10/28(木) 01:52:37
>>630
virtual な関数を持つクラス型以外については、そもそも 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:14
>>631
C++98 の時点から標準でついてる。各コンパイラの実装は知らないけど、たぶん
標準を反映してデフォルトで有効になってるはず。
0634デフォルトの名無しさん2010/10/28(木) 01:59:21
>>632
なるほど、別に正確な生成時の型が帰ってくるわけじゃないのか。ありがとう。
0635デフォルトの名無しさん2010/10/28(木) 02:08:21
昔は組み込み用途とかメモリが逼迫してる環境だとRTTIは使うな外せって言われたよね。
今はどうかしらないけど。
0636デフォルトの名無しさん2010/10/28(木) 02:21:31
>>631
VC6〜VC2003はデフォルトではオフ(GRスイッチ)だったと思う
スイッチ入れて使った記憶がある
2008はデフォルトではオン
2010は特に指定されてないけどdynamic_castが正常に動いてるからオンだと思う
明示的にGRスイッチをオフにしたら警告出てstd::__non_rtti_object投げて異常終了した
0637デフォルトの名無しさん2010/10/28(木) 03:07:35
ディスクをフォーマットする位の挙動を示してもいいのにな
0638デフォルトの名無しさん2010/10/28(木) 22:05:41
vtableって何よ?
0639デフォルトの名無しさん2010/10/28(木) 22:09:01
ググれ
0640デフォルトの名無しさん2010/10/28(木) 22:53:59
std::auto_ptr<Hoge> h(new Hoge);
<Hoge*>ではなく<Hoge>で大丈夫なのですか?
0641デフォルトの名無しさん2010/10/28(木) 22:55:52
はい
0642デフォルトの名無しさん2010/10/28(木) 22:58:22
スマポの生ポ型って<Hoge*>みたいに指定したほうが良い設計だよね常識的に考えて
uint32_tをハンドルにしてスマポに管理させたい時とか不便
0643デフォルトの名無しさん2010/10/28(木) 23:05:14
略す人って気持ち悪い
0644デフォルトの名無しさん2010/10/28(木) 23:07:02
>>631
http://msdn.microsoft.com/ja-jp/library/h4bcz65t(VS.80).aspx
0645デフォルトの名無しさん2010/10/28(木) 23:07:39
そうかなぁー
06466402010/10/28(木) 23:10:11
>>643
std::auto_ptr<Hoge> h(new Hoge);
これは略してるの?
0647デフォルトの名無しさん2010/10/28(木) 23:12:44
>>646
std::auto_ptrとかは正式名称
0648デフォルトの名無しさん2010/10/28(木) 23:31:05
std::cout << type_id(p).name() << std::endl;
この処理結果って見づらいね
0649デフォルトの名無しさん2010/10/28(木) 23:35:44
name()出力って処理系ごとに違わなかったっけ?
cppunitとかでgccとVCで結果が違ってムッとした記憶がある。
0650デフォルトの名無しさん2010/10/28(木) 23:45:05
>>648
それは見るもんじゃないよ

あくまでも operator== で比較するだけのためのものだと思った方がいい
0651デフォルトの名無しさん2010/10/28(木) 23:54:34
>>649
Yes
0652デフォルトの名無しさん2010/10/29(金) 01:45:05
struct Foo {
Foo(int x) {}
private:
Foo &operator=(Foo&);
};

上記のクラスの宣言と初期化を同時に行うとき、
Foo x = 5;
のように書けますが、これは operator= の呼び出しではなく、
Foo x(5);
と書くのと同じ意味になるのだと思います。なぜなら、初期化後に改めて
x = 10;
と書いた場合はマッチする operator= がないのでコンパイルできないからです。
この「宣言と初期化を同時に行うときの=は特別」と言うことを規格で確認したいのですが、
どの項を見ればいいのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています