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/
666 名前:660 mailto:sage [2010/03/08(月) 12:52:05 ] >>665 テンプレートと継承の組み合わせというのは考えられませんでした。 ありがとうございます。
667 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 13:41:10 ] >>655-657 サンクスです キャスト≒複製って知りませんでした 時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました
668 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 15:54:42 ] 構造体のメンバ変数を一括で代入する方法ってないんですか? 例えば構造体Aの変数のメンバ変数を全て0にするとか…
669 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 16:26:02 ] struct S { int a, b, c; double x, y, z; static S empty; }; S S::empty = { 0 }; S var; var = S::empty;
670 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ] サンクス。クラス使わないとダメなんすか?
671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ] pod作る関数を作ればいい。テンプレートで
672 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:05:33 ] struct S { int a, b, c; double x, y, z;}; S a={0}; これで事足りるんじゃ
673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ] >>672 それは代入じゃない。
674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ] あーざっす
675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ] 初期化だ(キリッ
676 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 19:48:52 ] >>659 const_cast<int *>(p)だろ 他のconstが必要なら後で付ければいい 何があかんのですか
677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ] const const_iterator* it; const_cast(it) これはどうなるんだ? const_iteratorはポインタかもしれないしクラスかもしれない
678 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:48 ] const_iteratorがconst Type*だった場合、 itの型はconst Type *constでconst_castするとconst Type*になる。 そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。
679 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:43:53 ] >>676 void const * const * const cpcpc = 0; void ** pp = const_cast<void**>(cpcpc); void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?
680 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:34 ] >>678 >itの型はconst Type *constでconst_castするとconst Type*になる。 なんでType*じゃないんだ?>>676 と矛盾しない?
681 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:11:07 ] std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?
682 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:15:54 ] 無闇にメンバ関数にするとprivateにアクセス出来てしまうから、 privateにアクセスする必要のない関数は メンバでもfriendでもない関数にするのが良いって 偉い人が言ってた
683 名前:681 mailto:sage [2010/03/08(月) 22:28:24 ] >>682 ありがとうございます。 もし自分がcomplex作ったら、conj( )をメンバ関数にして privateなデータを変更してしまうように実装しそうなのですが これは良くないんですかね?
684 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:34:42 ] そもそも変更することがおかしいんじゃないかい。 メンバ変数にするにしてもconstにするべきだと思う。 共役複素数を求めるだけだよね?
685 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:42:05 ] むしろその程度の軽い型なら不変型にしちゃった方が
686 名前:681 mailto:sage [2010/03/08(月) 23:02:53 ] >>684 イメージ的にはこんな感じです。 myComplex<double> mc0(2,2); // 2+2i mc0.conj( ); // 2-2i グローバル関数にするとコピーが発生してしまうので 良くないのかなぁ、と思ったのですが。
687 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:14:08 ] 実測した訳じゃないが、 あまり効果なさそうな気はする。 コードを見やすくしたほうがいいんじゃないだろうか。
688 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:28:29 ] なんで配列はイニシャライザリストで初期化出来ないんですか?
689 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:50:50 ] C++0xにご期待ください
690 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:16:28 ] >>679 const増やすのはstatic_castでもreinterpret_castでも出来る お好きな方で
691 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:19:23 ] >>690 キャスト無しで通っちゃうよ。
692 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:28:37 ] >>676 void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード // ここから自前のコード void g(void const* const a[]) { f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう } こわくね?
693 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:23:22 ] まあconst_cast使うなってのが基本だから それを書きやすくするうえに他のキャストと違う形になる 省略記法なんて認められないと思われる
694 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:04:10 ] >>690-691 うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、 なんかおかしいのかな。
695 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:21:42 ] どうせ<>書いてないとか
696 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:26:55 ] 通らない ttp://codepad.org/d4Wo3ozT
697 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:48:53 ] void ** const cpp = static_cast<void **>(pp); えっ?
698 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:49:47 ] >>696 それは、規格の文面によって、明示的に禁止されている。 4.4 Qualification conversions [conv.qual] なぜできないのかというと、それを用いることによって、const性に穴が生じるから。 規格のサンプルコードを、適当にコメントを補って引用すると、 int main() { const char c = ’c’; char* pc; const char** pcc = &pc; // 仮に、これが許可されているとする *pcc = &c;// ppcを介して、pcを変更している。 *pc = ’C’; // pcはconstでもないのに、constなはずのcを参照出来ているので、変更できる。 } つまり、constなppcを介して、非constなpcを変更できてしまうので、 pcが、明示的なキャストもなしに、constなオブジェクトを参照することが可能になってしまう。
699 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:03 ] >>698 規格の参照までしていただいて、ありがとうございます。 参考になります。 ということで、これを踏まえて改めて>>679
700 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:31 ] ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9) 環境で例外クラスの実装を見ようと思ったのですが /usr/include/c++/4.4/stdexcept に logic_error などの宣言はあるのに実装が書いてありません。 どのファイルを見たら良いでしょうか?
701 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:07:03 ] const_castの話してるやつはコテ着けるか 婉曲表現と皮肉をやめて直接主張しろ 何人かいて訳が分からない
702 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:40:34 ] はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので void const * const * const cpcpc = 0; void ** pp = const_cast<>(cpcpc); // 全はがし void const ** cpp = const_cast<void const**>(pp); // つける時は書く // void const ** cpp = const_cast<void const**>(cpcpc); // 一部はがしのときもこれまで同様書ける というのを望んでんのかも
703 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 09:06:33 ] がんばれ 658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01 const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。 const int* からconstとったら int* に決まってんじゃん、と。
704 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:09:06 ] constの話で盛り上ってるからついでに聞きたいんだけど struct X { int *p; void test(int x) const { *p = x; } }; こう書くとconst指定してるのにオブジェクトの内容が変化してる これって合法なの?
705 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:14:13 ] >>704 Xのオブジェクトはpであることを思い出せ。 pはint*型だから「int型の値のあるメモリの位置」を指している。 *p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。
706 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:34:24 ] pは宝の地図 *pは宝の中身 Xのメンバはpつまり宝の地図 だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと *p = xは宝の中身を入れ替えているだけ
707 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:39:05 ] 中々面白い例え方をするな。
708 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:54:36 ] **pは宝の地図の在り処を書いた地図か。判りやすいね。
709 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:57:01 ] ゲームのお使いクエストだな。 そのお宝の例えは俺は結構好きだな。
710 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:19:18 ] へー、いい表現じゃん
711 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:23:11 ] サンクス 正常な動作だったのね
712 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:43:29 ] new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。 new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。 難しいな。
713 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:38:02 ] new int*なんてあんの? あるなら知らなかった。
714 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:58 ] 型なら何でもnew出来るだろ
715 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:46:35 ] 関数型もできるっけ? 関数ポインタじゃなくて。
716 名前:706 mailto:sage [2010/03/09(火) 21:01:33 ] 何の気無しに書いたんで、反応あって驚いてる。 >>706 は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、 今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。 たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で まったく混乱せずに済んだ。>>708 が言うように、ポインタのポインタも 「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。
717 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:46 ] C++は勉強するほど自信がなくなっていくな・・・boostマジキチ
718 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:10:15 ] >>716 初心者には分かりやすい言い例えだね。 俺もそれ使わせてもらいます。
719 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:24:34 ] 住所とか例えるより絶対わかりやすい。
720 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:30:25 ] >「勇者は宝箱を開けた。なんと宝の地図を見つけた!」 あるあるw
721 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:31 ] ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが
722 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:54 ] s/宝箱/宝箱の地図/
723 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:06:18 ] で?
724 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:35:08 ] ヌルポインタはミミックだな 開けると死ぬ
725 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:44:47 ] 住所にたとえるのと変わらんと思うがね
726 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:46:21 ] ていうか別に喩えなくても分かるから
727 名前:デフォルトの名無しさん [2010/03/10(水) 01:46:56 ] ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ
728 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:46:42 ] minorという変数がプログラム中にありますが、 cstdlibをインクルードしたら以下のようなエラーが出るようになりました。 error: macro "minor" passed 2 arguments, but takes just 1 これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?
729 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:58:04 ] >>728 どう読んだらそんな解釈になるんだよ。 そのエラーが再現する最小ソースを作ってみれ。
730 名前:728 mailto:sage [2010/03/10(水) 05:25:53 ] >>729 言葉足らずでした。 上記のエラーは、 ctdlib の中(もしくはcstdlibがインクルードしているファイルの中)に 引数を1つとるminorというマクロ(?)があるから、 引数が2つある自作クラスのオブジェクト名をminorにしてはいけない ということでしょうか? 以下ソース #include <cstdlib> class Hoge { public: Hoge( int i, int j ){ } }; int main(int argc, char* argv[]) { Hoge minor(1,1); return 0; }
731 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:36:58 ] >>730 別に言葉足らずじゃない。>>729 が寝ぼけてるだけ。 環境によってはsys/types.hにminorマクロがあるので使わない方がいい。
732 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:43:19 ] >>731 ありがとうございます。
733 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:56:50 ] >>730 手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。 ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?
734 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:01:57 ] >>731 cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう 予防しとかないといけないものなの?どっかの環境での常識?
735 名前:728 mailto:sage [2010/03/10(水) 06:04:13 ] >>733 Ubuntu 9.10 gcc version 4.4.1 です。 gcc -v の内容全部貼ると Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
736 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:14:04 ] -std=c++98 とかすれば逃げれたりするんじゃないかなー。 まぁ #undef すりゃいいんだけどね。
737 名前:728 mailto:sage [2010/03/10(水) 06:35:01 ] 以下のソースコードコンパイルすると #include <cstdlib> void minor( int i, int j ) { } int main(int argc, char* argv[]) { return 0; } test.cpp:5:26: error: macro "minor" passed 2 arguments, but takes just 1 test.cpp:5: error: variable or field ‘minor’ declared void test.cpp:5: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x というerrorと、warningが出ます。 >>730 のソースコードではwarning出ませんでした。
738 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:54:54 ] functionってすげいな ソース眺めるだけで勉強になる
739 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:43:07 ] struct A; struct B{A a;}; struct A{int a;}; int main(){return 0;} 前方宣言したら、後で定義してれば 使えると思ってたんですが これがエラーになります Bの中をA* aにするとエラーが消えるのですが その辺に理由があるんでしょうか?
740 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:53:13 ] ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね Aのデータは定義されるまでは全く参照出来ないのか struct A; struct B{void f(A *a){}}; //セーフ //struct B{void f(A& a){}}; //セーフ //struct B{void f(A a){}}; //アウト //struct B{void f(A& a){a.a;}}; //アウト //struct B{void f(A* a){a->a;}}; //アウト struct A{int a;}; int main(){return 0;}
741 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:01:37 ] サイズがわかってるかどうかで判断できるよ
742 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:10:29 ] なるほど、セーフなのはアドレスですもんね ありがとうございました
743 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:23:35 ] >>738 しかしそんなソースを仕事で書いたら 同僚に白い目で見られそうだww
744 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:40:04 ] すみません vectorのresizeでサイズを大きくした時に 拡張した結果メモリの再配置が起こったとすると resizeする前のデータはコピーされるのでしょうか?
745 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:42:12 ] ざれます
746 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:10 ] >>744 www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html
747 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:18 ] ありがとうございます><.
748 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:56:34 ] クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:59:17 ] 普通に使用すればいいです Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理
750 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:51:16 ] オペレータオーバーロードの ->* って、どう定義してどう使うんですか? ググール先生に聞こうと思ったんだけど記号検索できませんでした
751 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:55:22 ] ttp://homepage2.nifty.com/well/Operator.html#arrow_ast
752 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:06:36 ] 結合力最強の二項演算子なので マクロとかで細工するときに便利なこともあります
753 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:24:57 ] >>751 どうもです しかしなんだこれって感じですね ポインタエミュレートのために (myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c); といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・) >>752 そういう特殊な使い方ってよく思いつくもんですよね
754 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:03:47 ] >>748 徹底したクラス指向で行くならこの程度のものになる。 int main() { MainClass m; return m.main(); }
755 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:20:39 ] int main() { return MainClass()(); } 徹底するならこうだろーと思った俺はそろそろ寝るべきか
756 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:51:32 ] operator RESULT(); //用意するだろ普通
757 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:29:37 ] throwでint投げると問題があるようなことを聞いたのですが、 どんな問題があるんでしょうか? ポインタでキャッチしてしまうとか?
758 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:33:36 ] 受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから
759 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:44:47 ] なるほど。よくわかりました。
760 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:01:56 ] istringstream の putback って何回でも呼んでおk?
761 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:28:31 ] boost::functionとstd::functionって混在しても問題ありませんか? それともどちらか一方にすべきでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:54:55 ] 混在させたこと無いからわからんけど、大丈夫じゃね? どっちも最終的にはただの関数オブジェクトになるわけだから boostのほうにstdのfunctionを代入することも逆もできるはず 名前は名前空間があるからかぶるわけないし
763 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 22:54:37 ] ABI互換性は?
764 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:03:33 ] 混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?
765 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:15:46 ] namespace boost = std ;
766 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:28:03 ] ありがとうございます。 今のところはboostが使えるならboostが無難かと 思うのでboostにします。