1 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 19:37:43 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。
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()で実体があるから、問題ないんじゃないかと思ってたけど 違うのか。 すごく勉強になったよ。ありがとう〜