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/
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にします。
767 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:34:01 ] >>766 えぇーーー 普通は逆でしょ 標準で済むなら標準を使うのが筋でしょ
768 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:38:24 ] >>767 std::function はまだ標準じゃないでしょ。
769 名前:767 mailto:sage [2010/03/11(木) 23:40:20 ] >>768 そりゃそうだ boost と std だけ見て function を見てなかったよ
770 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:48:14 ] >>766 も「今のところは」って言ってるしな。
771 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:27:32 ] placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?
772 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:30:56 ] >>771 何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか std::uninitialized_copy() とかが使えるんじゃない?
773 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:16:48 ] template <class T> void Caller( T &f ){ f(); } に対して、 void Callee(); があり、 Caller( Callee ); // これだとコンパイルが通るのに、 Caller( &Callee ); // こっちは通らない のはなぜですか?
774 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:40:58 ] codepad.org/WzrQ1BNa それはポインタだからさ
775 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:32:25 ] 関数の引数に配列の参照を渡したいんですが、どうすればいいですか
776 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:16 ] >>774 サンクスです。 T &fは「関数の参照型」と言えばいいんでしょうか? また、関数ポインタを呼ぶ際は、 (*f)(); //デリファレンスあり f();//なし 2通りで呼べますが、これはシンタックスシュガー的なものですか? どっち使ってもOKですか?
777 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:42 ] template<typename T, size_t N> void func(T (&x)[N])
778 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:39:50 ] typedef std::deque<int>::iterator iterator; iterator tekitou; //... tekitou == iterator(); //tekitouに代入処理がなかったらtrue を期待して組んでたら例外が発生してパソコンが爆発したんですけど tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?
779 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:52:18 ] >>778 パソコンが爆発するプログラムを作っているんだったら いますぐやめなさい。
780 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:53:54 ] パソコンが爆発するプログラムを作っているのではありません。 パソコンが爆発するのを防ぐプログラムを作っているのです。
781 名前:デフォルトの名無しさん [2010/03/13(土) 01:15:50 ] 爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・
782 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:17:30 ] 兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。 ご教示いただけないでしょうか?
783 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:20:26 ] 判定する方法は無い ポインタと違ってイテレータにはNULL入れられないからねぇ int *ptr = 0;
784 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:21:45 ] 本当に爆発するというなら、 本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。
785 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:22:35 ] bool変数でも使って対処しとけ
786 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:24:23 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・
787 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:25:48 ] こういうときは boost::optional だっけ?
788 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:26:47 ] つtuple
789 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:30:12 ] end()をNULL代わりにしたらあかんの?
790 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:32:49 ] 今回もそうでしたが、コンテナを特定できないとそれは使えません。
791 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:55:44 ] じゃあNULL用の適当なコンテナ作ればいいじゃん
792 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:58:30 ] std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・
793 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:59:08 ] nil使えよ
794 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:06:15 ] iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな? わざわざややこしいことやってるように見えるけど
795 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:43:02 ] namespace boost { namespace detail { struct none_helper{}; } typedef int detail::none_helper::*none_t ; } // namespace boost namespace boost { none_t const none = ((none_t)0) ; } // namespace boost このコードはいったい何をしようとしてるわけ?
796 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:55:22 ] ググった?
797 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 04:11:26 ] >>795 他のどんな型からも自動変換されないし、 他のどんな型へも自動変換されないような変数を定義してるんじゃね?
798 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:23:39 ] >>468 といい>>778 といい、最近のPCは爆発しすぎだな
799 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:27:14 ] 俺のPCは蒸着するぜ0.05秒で。
800 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:52:58 ] 手荷物どころかそのうち航空貨物での取り扱いも断られる
801 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:31:03 ] そして単純所持禁止へ
802 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:33:53 ] コンピュータが爆発するって 昔の映画や漫画によくあったな
803 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:52:27 ] 「映画の中のコンピュータ」って ジョークがあったな
804 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:20:38 ] 「なお、このPCは自動的に消滅する」
805 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:22:54 ] >>799 あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
806 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:27:14 ] >>795 なんだこれ超ムズイじゃねぇか。
807 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:03:28 ] pointer to memberって使ったことあんましないからわからんけど ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない なおかつメンバが空だからnullしか入れるものがない したがってただひとつの状態を持てるってことかな C++ってこういう気持ち悪いバッドノウハウ多すぎるよね すなおに仕様でnil型導入すればいいのに
808 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:26:04 ] 一般的な実装上の都合からいうと、 メンバへのポインターは、単なるオフセットに過ぎない。
809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ] null_ptrをお待ちください
810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ] >>807 実装上の都合を言語ユーザに押し付けてる感はあるな
811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ] >>810
812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ] ごめん、途中で送信してしまった。 >>810 他の言語はともかく、 余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ] >>810 型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、 何のことを言ってるの?
814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ] void Test(int *array) { // ごにょごにょ(配列の長さについては考えないとする) } みたいな関数があったとき、 int array[3] = {0,0,0}; Test(array); はコンパイルできるのに、 Test({0,0,0}); はコンパイルできない。 配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、 良い手段ない? それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ] 名前付けないと可読性下がりそう
816 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:19 ] >>814 C++0x をお待ちください。 名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら __LINE__ あたりとくっつけとけばよかったりしない? C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら ↓こんなのが使えたり。 void Test(int *array); #define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0) void Tests() { TEST({1,2,3}); TEST({4,5,6}); TEST({7,8,9}); }
817 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ] 可変長引数マクロ関数使えるのか
818 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:36 ] >>814 ヘルパー関数を使って、 std::vector<int> make_vector(int num, ...); Test(&make_vector(3,0,0,0)[0]); とか、 Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00"); などの悪手しか思いつかない。
819 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ] 配列リテラルとかLL出身者っぽい要望だなぁ
820 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:05 ] >>816 レスありがとうございます。 > 名前が不足するというのがよくわからん Testを沢山呼ぶんですよ。 それで、 int array1[3] = {0,0,0}; Test(array1); int array2[3] = {0,0,1}; Test(array1); int array3[3] = {0,0,2}; Test(array1); 以下大量に。 (実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる) __LINE__をつけるというのはいいですね。 >>818 レスありがとうございます。 STL不勉強のためすみませんが今はちょっとよくわかりません。 >>819 はい・・・LL出身です・・・。 とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。
821 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ] >>820 なんかTestの引数が全部array1になっちゃってますが、 2回目はarray2、3回目はarray3です・・・。
822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ] C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。 Test((int[]){0,0,0});
823 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:37:24 ] 二次元配列にすればいいだけなんじゃない int arys[100][3]; for(int i=0;i<100;++i){ arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; test(arys[i]); }
824 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ] >>822 std::initializer_listが入る
825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ] >>823 >>820 でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、 必ずしも arys[i][0]=0; arys[i][1]=0; arys[i][2]=i; となるわけではないのです。 質問のために簡略化しているので・・・すみません。
826 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:44:44 ] それなら読み込めばいいんでは? int arys[100][3]; for(int i=0;i<100;++i){ cin >> arys[i][0] >> arys[i][1] >> arys[i][2]; test(arys[i]); } これは標準入力だけど、別にファイルからでもいいし
827 名前:814 mailto:sage [2010/03/13(土) 21:50:09 ] >>826 そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは よくないかなぁと思ったんですが、 データをあまり見られたくないんですよ。 それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと 見られにくいかなぁと思ったので。 別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ] 慣れたLLでコードジェネレートしればいいじゃない
829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ] >>828 なるほど、考えてみます。ありがとうございます。
830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ] >>827 __VA_ARGS__ は使えんのか? >>816 にあるやつ。
831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ] >>830 Visual C++ 2008なので使えると思います。 考えてみます。
832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ] >>820 int *arrays[] = { { 0,0,0 }, { 0,0,1 }, { 0,0,2 } }; みたいなのじゃダメなの? argv と同じやりかた。
833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ] >>832 コンパイルしてみてから言おうな。
834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ] めんどくせw
835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ] >>816 __LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ] >>835 同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。 この場合は単にスコープ分けるだけでも済みそうだし、 __VA_ARGS__ が使えるなら >816 のやつがいいと思う。