- 1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
- 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++ コンパイラはエラーを出す義務はないのかな?
|

|