1 名前:デフォルトの名無しさん [2009/07/18(土) 02:54:58 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part70 pc12.2ch.net/test/read.cgi/tech/1244942050/l50
83 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 19:20:49 ] public: Derived(int x, int y);
84 名前:69 mailto:sage [2009/07/25(土) 20:14:00 ] >>70 ありがとうございます。
85 名前:81 mailto:sage [2009/07/25(土) 20:16:29 ] 自決しました。 どうやらコンパイラ(g++ (GCC) 3.4.5 (mingw special))の仕様のようです。 バグって言い切っていいのかは分かりませんが。 自決方法 Windows XP HomeEd SP2 g++ (TDM-1 mingw32) 4.4.0 この環境でなら問題無く動作するようになります。
86 名前:71 mailto:sage [2009/07/25(土) 20:30:16 ] >>73 すみません >>74-76 ありがとうございます。そしてごめんなさい。 使用コンパイラがbcc5.5なのですが、is_base_ofの中核部分だけを取り出して コンパイルした結果、bccではうまく判別できず、VC2008ではうまく判別できました。 どうやらbccでは定数の初期化式に関数の呼出し等があると、コンパイルは通っても 値は0?とかになってしまうようです。だめですね…
87 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 20:39:40 ] >>85 死ぬな死ぬなw
88 名前:82 mailto:sage [2009/07/25(土) 21:42:32 ] >>83 ありがとうございました。
89 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 22:58:33 ] std::maxのような関数テンプレートは どの標準ヘッダに定義されていますか??
90 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:09:41 ] algorithm
91 名前:デフォルトの名無しさん mailto:sage [2009/07/25(土) 23:11:15 ] >>85 いろいろ問題がありそうなコードだけど コンパイルエラーになることが、 "問題無く動作する"ってことなの?
92 名前:85 mailto:sage [2009/07/25(土) 23:36:04 ] >>91 > コンパイルエラーになることが、 > "問題無く動作する"ってことなの? はい、g++としてはコンパイル時エラーで教えてくれる方が 正しい挙動だと思いまして。 > いろいろ問題がありそうなコードだけど 例えばどこが問題でしょうか?
93 名前:89 mailto:sage [2009/07/25(土) 23:37:04 ] >>90 ありがとうございます!!
94 名前:85 mailto:sage [2009/07/25(土) 23:41:38 ] >>91 > いろいろ問題がありそうなコードだけど #define OPERATOR_MY〜〜 などのマクロが登場していることや public : int_t num; の様にメンバが丸裸のpublicアクセス指定されている事 以上2点はサンプルコードだからです。 さすがにこんなクソコードは実務では書きません。 なんか後出しじゃんけんみたいになってしまって恐縮です。 申し訳ありません。
95 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:18:43 ] 自決でビール吹いたw
96 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 01:52:39 ] >>87 を見るまで気づかなかったw
97 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 03:51:31 ] 自決やべー後からくるわ。
98 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 10:11:31 ] 自決しました より 自決方法 にじわじわくる XPとg++でどう死ぬんだと
99 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 14:57:26 ] 未定義動作とか使うんだろうかw
100 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:15:11 ] 鼻から出てきた百足に目を食い破られて死ぬんじゃないかなぁ
101 名前:デフォルトの名無しさん mailto:sage [2009/07/26(日) 18:27:56 ] それ自決じゃない 自決といえばdelete thisだろ
102 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:27:12 ] >>101 うちの会社でよく見るコードだわ なんとか動いてるけど恐ろしい・・・
103 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 13:28:30 ] delete thisは使い方さえ間違わなければ合法だよ
104 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 18:47:24 ] >>103 そうなんだけど、よくわからんやつが適当にいじると そのあとメンバ触ってあぼんぬとかよくあるからさ おまけにそのデバッグやらされるの俺だし
105 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 19:22:22 ] 今ならコンストラクタをprivateにして、shared_ptr返すファクトリ関数作る delete thisは過去の遺物だな
106 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 21:55:34 ] delete thisって何だ? 初めて知ったんだが。 ファクトリメソッドやshared_ptrなどは知っています。 delete thisは俺が新参者だから知らないだけか?
107 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:13:43 ] delete p; とかと一緒 thisを削除
108 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 22:20:01 ] delete thisは、COMみたいに自分で寿命を管理するときに使う。 まぁ、前時代的な実装だね。
109 名前:106 mailto:sage [2009/07/27(月) 22:53:58 ] ふーん。 そうなんだ。 思い返してみたけどやっぱ見たこと無ねぇな。 まあ理解しなくても良いよね。 どーも。
110 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 23:00:07 ] boost::intrusive_ptrの使用例を検索してみると、 delete thisを見られるよ。
111 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:39:11 ] Stateパターンで遷移後状態を返す直前に自状態を始末する際に delete thisすることが多かったかな。最近はsmart pointerを 使うことが多くなったが。
112 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:53:21 ] delete this じゃないが デストラクタを明示的に呼ぶコードってのはたまーに使うな。 まあ大半の人が、STLコンテナの内部で使われているのを利用しているが。
113 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 11:56:11 ] >>112 そうそう、デストラクタって明示的に呼べるんだよね。 いつ使うのか全然しらない。
114 名前:112 mailto:sage [2009/07/28(火) 12:00:42 ] つながりの無い事柄みたいになっちゃったが、 要は void T::reconstruct() { this->~T(); new (this) T(); } から連想したんだ。許してくれ。
115 名前:デフォルトの名無しさん [2009/07/28(火) 13:30:04 ] C2227のエラーが出て解決できないのですが、どういうことが理由なのでしょうか
116 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 13:43:42 ] >>115 たぶんVCなのだと思うが、だとすれば、間接参照不可能なポインタ変数を 間接参照しようとしているから。 これ以上はソースを見ないと言い様が無い。
117 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:28:43 ] 間接参照不可能なポインタ変数を間接参照することは問題ないだろ。 問題なのは、間接参照不可能なポインタ変数を使って間接参照することだ。
118 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 14:33:09 ] 日本語でおk
119 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 15:04:59 ] >>118 じゅうぶんわかる。 間接参照不可能なポインタ変数を間接参照することは問題ないね。
120 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:32:18 ] いやまて 間接ポインタ変数を間接参照不可能な参照で間接参照にすることは問題なんじゃないか?
121 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 16:52:12 ] 間接参照不可能なポインタ変数ってvoidポインタのことでしょ? ->演算子でアクセスできないことも間接参照不可能っていうの?
122 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 17:25:55 ] >>121 じゃあやっぱり>>117 でいいよね
123 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:39:08 ] MyClassクラスのテンポラリオブジェクトを返す関数の戻り値は const MyClass& temp で受け取って束縛しても大丈夫ですよね? そのスコープから外れるまでは有効ですよね?
124 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:44:51 ] テンポラリオブジェクトを返す関数のスコープを抜けるまで有効です。
125 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:55:30 ] 関数の戻り値をconst指定しておけば、参照変数が生きてる間束縛される
126 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 18:57:08 ] >>125 > 関数の戻り値をconst指定しておけば おかなくてもだろ?
127 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:16:15 ] え、まじで?無知ごめん
128 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:17:44 ] っていうか、そうだよね。constは関係ないね。 ちょっと考えれば分かる話でしたorz
129 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:21:30 ] >>113 placement new したオブジェクトを消すとき
130 名前:123 mailto:sage [2009/07/28(火) 19:53:50 ] みなさんありがとうございます。
131 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 19:57:50 ] >>129 placement deleteじゃだめなの?
132 名前:デフォルトの名無しさん [2009/07/28(火) 20:02:53 ] λ式ってブースト使わないと利用不可?
133 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:03:33 ] placement deleteはデストラクタを呼ばないから、自分でデストラクトする必要がある。
134 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:12:21 ] >>132 Visual C++ 2010 msdn.microsoft.com/ja-jp/library/dd293608 (VS.100).aspx
135 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:14:55 ] >>132 Intel C++ 11 www.xlsoft.com/jp/products/intel/compilers/
136 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:31:30 ] ラムダ式なんてオタのオナニー道具です 使っちゃいけません
137 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:45:26 ] >>134-136 俺の明日はどっちだ…
138 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:57:23 ] >>132 ラムダはちょっとしたところで使うなら便利。 あまり多用すると自分が困るかもしれないがね。 結局は使いようなんだが。
139 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 20:58:46 ] >>133 そうなのか。 ありがとう。
140 名前:132 mailto:sage [2009/07/28(火) 21:02:17 ] あり^^
141 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:33:50 ] データを出力するときにn行おきに空行を入れたいのですがどうすればいいですか?
142 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:39:22 ] 繰り返しつかえばあ
143 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 21:58:48 ] >>141 帰れ。 バカ過ぎる。
144 名前:デフォルトの名無しさん [2009/07/28(火) 22:23:37 ] for(int i = 0; i < num; i++) { cout << line[i] << endl; if(i % n == n-1) cout << endl; }
145 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:34:37 ] >>144 やってみます
146 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:41:16 ] なんかもっと初心者向けのスレに行けば? たぶん宿題だろうし
147 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 22:58:31 ] あっそ
148 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:22:02 ] そういう態度は失礼だってママに言われなかった?
149 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:32:48 ] ママは彼が物心つく前に鬼籍に入りまして。。。
150 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:43:08 ] 今日からパパがママよ!
151 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 23:50:33 ] >>150 ぎゃ^
152 名前:デフォルトの名無しさん [2009/07/29(水) 08:51:51 ] struct Point { int x; int y; Point(int x, int y) : x(x), y(y) {} }; struct Size { int width; int height; }; Size Hoge() { Point point; ... return *reinterpret_cast<Size *>(&point); …(1) return *reinterpret_cast<Size *>(Point(0, 0)); …(2) } 例が良くないかも知れないのですが、 この書き方ってC++におけるインスタンスの 生存期間的に問題はあるでしょうか?
153 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:10:29 ] >>152 (1)はダメ Hoge()を抜けた途端にpointのインスタンスが消滅してしまう
154 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:12:08 ] あほくさ
155 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 09:29:33 ] >>152 (1) はコピー返しなので問題ない (2) は生存期間以前にポインタでないものをポインタにキャストしてるから滅茶苦茶なことが起きるだろう
156 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:00:03 ] >>126 いやいや、一時オブジェクトを束縛して寿命を延ばす効果があるのはconst参照だけだろ。
157 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 13:44:20 ] 戻り値がconstである必要は無いというお話
158 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:19:06 ] throwはreturnやbreakと同じようにスコープを抜ける つまり自動変数のデストラクタ呼び出しが保障されてるんでしょうか?
159 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 16:58:37 ] されます。例外が送出された時点でローカルスコープは「突然」終了し、 可能な限りスタックを巻き戻すことになってます。 なので、(一般に)デバッグ用途には使えません。 …メモリダンプを見ても変数の中身が消えちゃってるので。
160 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:15:28 ] 前にbcc5.5でboost::is_base_ofを使おうとしてた者です。あの後いろいろやってたらできました。(多分) 他にも使いたい人はいると思うんで一応載せときます。 struct yes_type{char t[100];}; struct no_type{char u[10];}; template<typename T,typename U> struct test_helper{ template<typename S> static no_type test(void const volatile * ,S ); static yes_type test(T const volatile * const,int ); }; template<typename T,typename U> class is_base_of{ struct pointer_type{ operator U const volatile *(); }; enum{ delived = sizeof( test_helper<T,U>::test(pointer_type(),0) ) }; public: enum{ value = delived == sizeof(yes_type), }; }; 使い方は is_base_of< Hoge,Piyo >::value とし、後のクラスが前のクラスの派生クラスの場合は1をそうでない場合は0を返します。 長文失礼しました。
161 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:29:38 ] あー、これだと両方同じ型を指定した時は必ず成功してしまいますね…。 型の比較なんてないですよね?どうしよう…
162 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:42:04 ] bcc5.5なんて糞コンパイラを窓から投げ捨てろ
163 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:48:00 ] VCの複雑さが無くなれば捨ててもいいけど・・・
164 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 00:49:51 ] コマンドラインで単なるC++コンパイラとして使うときに、 VCが特に複雑と言うほどBCCと何か違うことってあるか?
165 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 01:03:49 ] さっきのis_base_ofですが、value = ...の条件式に以下を加えてください。 !is_void<T>::value && is_class<U>::value && type_equal == sizeof(no_type) && is_voidやis_classや自分で作るかなんかしてください。 次にtest_helperに以下の関数を追加 static yes_type type_equal(T*); template<typename S> static no_type type_equal(S*); 最後にis_base_ofの一個目のenumに以下を追加 type_equal = sizeof( test_helper<T,U>::type_equal((U*)NULL) ), これで、抜けはありそうですが、とりあえず判定はできると思います。
166 名前:デフォルトの名無しさん mailto:sage [2009/07/30(木) 05:36:55 ] >>158 例外がmainでcatchされずに飛び出るとterminateが呼ばれて 破棄処理が実行されない可能性がある
167 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 15:28:35 ] お勧めのC++用リファクタリングツールを教えてください。
168 名前:デフォルトの名無しさん mailto:sage [2009/07/31(金) 23:23:19 ] メモ帳
169 名前:デフォルトの名無しさん [2009/08/01(土) 00:05:34 ] mapとかsetをデフォルト引数にする場合ってどの様に書けば良いでしょうか? 下記のように、vectorっぽくやりたいのですが。 void func( set<int> s = set<int>(0) ) { if( s.size() == 0 ){ ... } else{ ... } } int main() { set<int> s; s.insert(100); func( s ); func( ); }
170 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 00:09:03 ] >>169 setやmapには、vectorのような要素数を指定するコンストラクタがないから、 単にデフォルトコンストラクタで初期化すればいい。 void func( set<int> s = set<int>() )
171 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 00:19:28 ] 質問なんですが、 #include<stdio.h> main() {int suuji[10],i,x,s,n; float r; i=0; s=0; while(x!=0){ if(i==50); printf("数字="); scanf("%d",&x); suuji[i]=x; n=i; i=i+1; s=s+y; } r=s/n; printf("平均=%d\n",&r); } の形を使って数字を幾つか入れてその平均点をfloatを使った状態でだしたいのですが数字が何も出てきません。 上のプログラムの修正をよろしくお願いします。
172 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 00:38:18 ] r=(float)s/n; printf("平均=%f\n",&r); あたりでうごく?
173 名前:169 mailto:sage [2009/08/01(土) 01:25:54 ] >>170 ありがとうございます。m(_ _)m
174 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:26:36 ] >>172 r=(float)s/n; を習ってないので使ってはいけないんですよ… なんででないのかわからない… %d→%fは直します。ありがとうございます!
175 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:41:41 ] ならこう。 #include<stdio.h> main() { float suuji[10]; float x, s, r; int i, n; i = 0; s = 0; while(x != 0) { if (i == 10) break; printf("数字="); scanf("%f", &x); suuji[i] = x; n = i; i = i + 1; s = s + y; } r = s / n; printf("平均=%f\n", r); }
176 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:50:14 ] よくみたらx初期化してないし、sに加算してないし そもそもC++のプログラムじゃないし レスした自分が恥ずかしい s+=x;な
177 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:55:47 ] 宿題スレでやれよ
178 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:56:32 ] まあC++コンパイラで通るからいいかなと思った。今は反省している。
179 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 01:57:53 ] >>177 そこはお客に丸投げしていただいたありがたい課題を解いて楽しむという反教育な場ですから。
180 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 04:01:34 ] >>177 すいません… >>178 C++じゃなかったんですか!自分はずっとC++と思い込んでました。 ありがとうございます。
181 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 04:46:33 ] >>180 なんていうか、先が思いやられるな。未来のこの人の先輩がんばってください。
182 名前:デフォルトの名無しさん mailto:sage [2009/08/01(土) 11:53:51 ] >>180 いや、間違いなくC++だよ Cコンパイラでも通るかもしれないというだけで
183 名前:デフォルトの名無しさん [2009/08/02(日) 01:21:46 ] コンストラクタで例外投げてもいいですか?