C++相談室 part69
..
175:デフォルトの名無しさん
09/05/13 21:47:28
わざわざしなくていいと思うよ
意識せずとも、いずれ自然に必要になって自然に勉強してる
176:174
09/05/13 21:52:03
>>175
ほほう、そんなもんなのか。ありがとう。
むしろもうちょっと高級言語も知っとこうかなぁ。。。
177:デフォルトの名無しさん
09/05/13 23:27:37
C/C++をやると平気でインラインアセンブラを書くようになるよな
特にSSE2/SSE3関連は
178:デフォルトの名無しさん
09/05/14 00:48:26
>>171,172
クラスの関連が複雑になるのと、オブジェクトの寿命管理の点が気になりました。
> 履歴一覧を表示する元に戻すボタンでも実装するのか?
これも1つです。
ソースの見通しが悪くなり、あとで機能を追加したいと思った時に困るのではないかと思いました。
179:デフォルトの名無しさん
09/05/14 01:13:32
ササビーってIntelから出るけどあれどうなの?
180:デフォルトの名無しさん
09/05/14 01:53:25
俺、趣味でオセロプログラム書いてるけど、>>177みたいなことに手を出してみた。
最初は難しいイメージがあったが、やってみるとそうでもなかった。
181:デフォルトの名無しさん
09/05/14 02:25:47
0から1の乱数を表示させるプログラムがほしいんですがわかる人いますか?
調べてみてはいるのですが、なかなかうまく動きません。
乱数生成のためのソフトとかはいるのでしょうか?
もしお暇がありましたらよろしくおねがいします。
182:デフォルトの名無しさん
09/05/14 02:30:59
>>181
今、どれくらいの知識を持ってるの? どんなコード書いてみたの?
とりあえず、標準Cライブラリの rand っていう関数は知ってる?
183:デフォルトの名無しさん
09/05/14 02:31:35
double r;
srand((unsigned int)time(0));
r = rand() / RAND_MAX;
printf("%lf", r);
184:デフォルトの名無しさん
09/05/14 02:44:00
static_cast<double>(rand()) / RAND_MAX;だろとツッコミがほしいんだろ
185:デフォルトの名無しさん
09/05/14 02:54:43
>>183
きっと0か1しか返さないぞ。
>>178
>ボタンが親子関係でもないオブジェクトの参照を持つ
ここでいってるオブジェクトってコマンドクラスのこと?
同じボタンの機能がころころ変化するのでもなければ
参照を持つ必要なんて無いと思うけど?
どうしてもUIにヘルプ文字列を埋め込みたくないのなら
コントロールクラスに自分(ボタン)が今どんな機能なのか
問い合わせるメソッドでも作ったら?
186:デフォルトの名無しさん
09/05/14 03:34:01
>>182
rand関数はさっきから学びはじめたばかりです。
知識は基本的なプログラムならつくれる程度です。
187:デフォルトの名無しさん
09/05/14 03:38:42
randは本格用途では使い物にならんぞ
ゲームのサイコロ振るくらいに使うならいいけど
188:デフォルトの名無しさん
09/05/14 03:40:12
>>186
rand関数は、0 から RAND_MAX までの範囲の整数を返す。
(RAND_MAX は実際にはある特定の数値であり、コード中に RAND_MAX と書けばその数値として扱われる)
後は、0 から RAND_MAX までの範囲の整数を、0 から 1 までの間の小数の値に変換すればよい。
>>183-185あたりを参考に。まだ分からんところがあったら聞いてくれ。
もし本格的な乱数を使用したいなら、boostのrandomってのを調べてみるといいが、
まあそこまでする気がないならrandでいいよ。
189:デフォルトの名無しさん
09/05/14 03:43:14
>>187
本格用途ではなくごく簡単なプログラムで、サイコロを振る程度です。
>>188
rand関数について自分でも調べていたところです。
丁寧におしえていただきありがとうございます。
もしわからないことがあったら書き込みたいと思います。
ありがとうございました!
190:189
09/05/14 04:34:11
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
191:189
09/05/14 05:08:06
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
double random;
srand((unsigned) time(NULL)); // rand関数による乱数生成を不規則にする
for(int i=0; i<20; i++){
random = (double)rand()/RAND_MAX; // 0から1までの乱数の生成
printf("%f\n",random); // 表示する
}
}
ここでのアドバイスなどをもとにして自分でつくりました。
コメントは自分でつけたので語弊があるかもしれません。
192:189
09/05/14 05:11:06
すみません一つはまちがいです。
上のプログラムだと乱数表示はされるのですが
一個だけ乱数表示するプログラムを実行すると、何度実行してもほとんど変わらない乱数
(例えば、0.963742 ⇒0.972378 ⇒0.981201など)
になってしまいます。
良い解決方法はないでしょうか?
193:デフォルトの名無しさん
09/05/14 05:37:58
win32環境ならtime()をGetTickCount()なりQueryPerformanceCounter()なりで置き換えるとか。
194:デフォルトの名無しさん
09/05/14 06:28:58
>>185
> ここでいってるオブジェクトってコマンドクラスのこと?
> 同じボタンの機能がころころ変化するのでもなければ
> 参照を持つ必要なんて無いと思うけど?
ヘルプメッセージを表示するクラスのメンバ関数をboost::functionに入れてボタンクラスに渡すという意味です。
Clickなど他のイベントも同様に「他のクラスのメンバ関数をboost::functionに入れて〜」とやっていったらクラスの関連が複雑になるのではないのかと。
また、boost::functionの中で保持されているポインタの寿命(有効か)の不安を感じます。
195:デフォルトの名無しさん
09/05/14 06:33:38
random = (double)rand()/(RAND_MAX+1.0); // に、しとけ。
196:デフォルトの名無しさん
09/05/14 07:42:43
struct A{virtual void operator()()=0;};
struct B:A{virtual int operator()(int)=0;};
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);}};
struct D:A{void operator()(){}} d;
int f(){
C c(d);
c();
return c(1u); // これ・・・
}
コンパイルを通ってしまわない様にするにはどう改造すればいいのでしょう?
197:デフォルトの名無しさん
09/05/14 08:01:28
>>196
コンパイルが通らないようにする方法ならいくらでもわるわけで、
何がしたいのか挙げてもらわないと望む答えは得られないでしょう。
198:196
09/05/14 08:10:12
void operator()(){x();} を書き忘れ
struct C{A&x;C(A&a):x(a){} int operator()(int i){return static_cast<B&>(x)(i);} void operator()(){x();}};
199:デフォルトの名無しさん
09/05/14 09:03:46
>>195
なんのために+1.0するの?
200:デフォルトの名無しさん
09/05/14 09:06:17
>>199
結果に整数 N をかけることで、簡単に N とおりの選択に使う乱数が得られる。
「0 から 1 の乱数」が 1.0 を含んでいると、こうはいかない。
201:デフォルトの名無しさん
09/05/14 09:12:53
>>200
今回の目的は
「0から1の乱数を表示させる」
だけど、いいの?
202:デフォルトの名無しさん
09/05/14 09:20:22
>>201
日本語だけでは閉区間なのか開区間なのか、区別がつかないんで、
質問者に判別してもらうしかないな。
簡単なサイコロの用途であれば 200 の性質が役に立つはずなんだけど。
203:デフォルトの名無しさん
09/05/14 09:22:50
簡単なサイコロの用途であれば、
random = rand()%6; // で、十分。
204:189
09/05/14 11:12:04
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
205:189
09/05/14 11:13:50
>>193
「GetTickCount()識別子が見つかりませんでした」とでます。
変数として扱われているのですかね・・・
他のプログラムをみてみたのですが使い方がわかりません
勉強不足ですよねスミマセン
>>195
お返事ありがとうございます
プログラムの下から4行目のことですよね?
してみたのですがほとんど値がかわりませんでした
何かまちがっているでしょうか
206:189
09/05/14 12:43:26
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
207:195
09/05/14 12:45:45
コンパイラは Borland だろ。
208:189
09/05/14 12:49:10
>>193
GetTickCount()は識別子が定義されてませんとでてしまいます
変数としてあつかわれてしまっているようです
>>195
お返事ありがとうございます
1を足したのですがあまり乱数はかわらなかったのですが
何かまちがっているのでしょうか
209:189
09/05/14 12:51:07
すみません何度もかきこんでしまいました
210:189
09/05/14 12:55:04
>>202
[0,1)区間となっています。0以上1未満ということです。
サイコロの乱数程度といってしまいましたが
サイコロは関係ありません
211:デフォルトの名無しさん
09/05/14 13:25:26
>>208
windows.hをインクルードしてないとか言うなよ
212:デフォルトの名無しさん
09/05/14 13:29:26
だって、それを書けなんて誰も言ってないじゃないですか。
213:189
09/05/14 13:30:44
>>211
ご指摘ありがとうございます。
してませんでした。
214:195
09/05/14 13:41:16
>>212 コンパイラの名前とバージョンは?
215:デフォルトの名無しさん
09/05/14 23:50:55
すごく初歩的な質問ですが、C++で数字の小数点以下を
繰り上げるには何をつけたらいいんですか?
216:デフォルトの名無しさん
09/05/14 23:53:45
std::ceil()だろ
Cにもある
217:デフォルトの名無しさん
09/05/14 23:55:09
つceil
218:デフォルトの名無しさん
09/05/15 00:16:28
それは「切り上げ」じゃん。ちゃんと答えてやれよ
因みに俺は小数点以下の「繰り上げ」なる概念について知らないので答えられん
219:デフォルトの名無しさん
09/05/15 00:17:50
くだらねえ…
220:215
09/05/15 00:21:12
おかげさまで解決しました。どうもありがとうございましたm(_ _)m
221:デフォルトの名無しさん
09/05/15 00:25:23
ちなみにceil()は負の数は0から離れる方向になるからな
222:デフォルトの名無しさん
09/05/15 09:52:02
>>203
それって偏りが出るよね。
223:デフォルトの名無しさん
09/05/15 10:02:11
RAND_MAXが極端に小さい環境ならね。
32767程度あれば、5461回が5462回になる程度のばらつきだよ。
224:デフォルトの名無しさん
09/05/15 10:22:09
マジで⁉
225:デフォルトの名無しさん
09/05/15 10:23:33
>>222
サイコロに偏りが無いとでも?
226:デフォルトの名無しさん
09/05/15 10:45:40
線型合同法は下位ビットの周期性が
227:デフォルトの名無しさん
09/05/15 12:14:07
テンプレートのテクニックをまとめた、テンプレートの著書を教えてください。
知っているのは、modern C++ と、テンプレートテクニックという本です。
良いサイトや良い本の情報ください。
228:デフォルトの名無しさん
09/05/15 12:26:08
C++ Template Metaprogramming: Concepts, Tools, And Techniques From Boost And Beyond
229:デフォルトの名無しさん
09/05/15 12:53:18
マウスでいまクリック、もしくはドラッグしているファイルやディレクトリのパスを
取得する方法ってありますか?常駐ソフトのような形で、起動してからクリック、ドラッグ
したファイルのパスをテキストログとして、出力するようなものを作りたいのですが・・・。
230:デフォルトの名無しさん
09/05/15 12:56:30
なんでこっちに来たんですか?
231:デフォルトの名無しさん
09/05/15 13:00:38
>>226
そんな乱数でもない数列をrand()という名前の関数の出力にする処理系が悪い。
ゴミだから早急に廃棄しろ。
232:デフォルトの名無しさん
09/05/15 13:39:39
>>225
製作工程の都合で、1,6の面積が微妙に大きいという話しか?
それとも、くりぬかれた目による重心のずれ、密度の偏りの方か?
233:デフォルトの名無しさん
09/05/15 13:55:52
>>228
ありがとうございます。
翻訳出てないんですかね……残念です。
C++の一番の特徴であるテンプレート関係の本が少ないのは何故?
わかりやすくテクニックを知りたいのに
234:デフォルトの名無しさん
09/05/15 15:54:15
すみませぬ JAVAから入っていまC++を勉強し始めたのですが、
C++で、配列で宣言した変数は、跡になってから自らがいくつの要素を持つ配列なのかチェックする方法ってありますか?
Javaだと、
String str[] = new String[3]
のように宣言した場合、
str.length を見れば要素数を見ることができますが、C++の場合は方法ありますか?
235:デフォルトの名無しさん
09/05/15 15:56:52
>>234
ないから素直にstd::vector使っとけ
236:デフォルトの名無しさん
09/05/15 15:57:32
>>234
sizeof(str) / sizeof(str[0]) で自分は調べてる
237:デフォルトの名無しさん
09/05/15 15:58:40
>>236
アホか
238:デフォルトの名無しさん
09/05/15 16:03:46
え?駄目なの
俺も>>236を常用してるけど・・
239:デフォルトの名無しさん
09/05/15 16:07:00
大丈夫、話が噛み合ってないだけだ。
char * foo = new char[3];
した場合は要素数を知る手段はない。
char foo[] = "abc";
した場合は要素数(≠文字数)を>236で得られる。
240:234
09/05/15 16:20:29
ありがとうございます。
C言語の場合、
配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
たとえば10要素の配列を作ったあとに20番目の要素にアクセスしようとすると、JAVAだとぬるぽが出て教えてくれますが、
Cの場合はシステムから見てそれが分からずに、20番(に相当する場所)を読みに行ったり、書き込んでしまう という理解で良いですか?
241:デフォルトの名無しさん
09/05/15 16:25:57
良いです。
ちなみにここはC++のスレです。
242:デフォルトの名無しさん
09/05/15 16:39:03
>>240
そうです
運が良ければアプリ自体が吹っ飛んでくれますが運が悪いとそのままメモリ破壊して動き続けます
なのでJavaしかできない人が集まってC++案件とかやるととても楽しいことになります
243:デフォルトの名無しさん
09/05/15 16:41:59
そもそも、10要素の配列を作ったあとに20番目の要素にアクセスしようとするような奴は
「Javaしかできない人」ではなく、「Javaもできない人」
244:デフォルトの名無しさん
09/05/15 16:47:00
>>240
大きな勘違いをしている。
>配列を作ったら作りっぱなし、メモリのどこまでがその配列に割り当てられた場所かという情報はどこにもないという認識で良いですか?
配列は、>36でサイズを得ることができる。
つまり、newなんていう外道なモノを使わずに、(昔なつかしの)固定長配列を使うかstd::vectorを使えと言うことだ。
245:デフォルトの名無しさん
09/05/15 20:48:50
Cに配列なんてなかった
246:デフォルトの名無しさん
09/05/15 21:16:41
>>245
何??
247:デフォルトの名無しさん
09/05/15 21:18:10
何の話?
248:デフォルトの名無しさん
09/05/15 21:19:50
ついに狂ったか?
249:デフォルトの名無しさん
09/05/15 21:22:37
Cなんてなかった
250:デフォルトの名無しさん
09/05/15 21:50:31
コンピュータなんてなかった
251:デフォルトの名無しさん
09/05/15 21:52:47
平行世界とつながったな
252:デフォルトの名無しさん
09/05/15 22:09:27
仕事なんてなかった
253:デフォルトの名無しさん
09/05/16 22:00:39
ISOのC++の2003年の規格のJISは訳がひどいですね。
原文の構成もひどいけど。
規格をもっと読みやすくしたような、同じだけ詳しい本ってあるんでしょうか?
254:デフォルトの名無しさん
09/05/16 22:06:55
無いから我慢して読め
255:デフォルトの名無しさん
09/05/16 22:15:03
規格書の文章なんてどれもああいうもんだよ。
訳が酷いわけじゃない。
256:デフォルトの名無しさん
09/05/17 01:01:57
C++は規格自体がひどいから文章もひどくなる
257:デフォルトの名無しさん
09/05/17 01:56:44
C++の文法があまりに酷いもんで翻訳者もイライラしながら
訳してたんじゃないか?w
258:デフォルトの名無しさん
09/05/17 02:35:49
どのくらいメモリを使っているかという情報は型が持っているのだから
例えば、char[3] 型の最初の要素のアドレスをchar*型に代入したら
もうメモリサイズがわからなくなるのは当然といえば当然。
char[3] 型を char[3] 型に代入する分にはちゃんとサイズがわかる。
という感じかしら
259:デフォルトの名無しさん
09/05/17 04:11:03
変数の型も含めてすべてをクラスにってのがJava以降に導入されたもんだからね
260:デフォルトの名無しさん
09/05/17 04:25:19
それは別にJavaで初めてというわけじゃないだろ。
261:デフォルトの名無しさん
09/05/17 08:18:01
Javaも全てがクラスというわけでもないし。
262:デフォルトの名無しさん
09/05/17 08:57:46
全てがクラスになる
unlambdaやれば全てが関数だからオススメ。
263:デフォルトの名無しさん
09/05/17 09:49:55
C++の一行の文字数って標準仕様上、制限ありますか?
またあるとして、現実的に気にした方が良いですか?
264:デフォルトの名無しさん
09/05/17 10:53:44
>>263
言語仕様としてはメモリの許す限りおk
265:デフォルトの名無しさん
09/05/17 10:56:29
メモリの許す限りという制限すらない無制限
266:デフォルトの名無しさん
09/05/17 11:16:18
ありがとうございます。
じゃあ気にせず行きます!
267:デフォルトの名無しさん
09/05/17 11:29:51
80文字が一つの目安だな。
120文字超えてたらちょっとイラッとする。
268:デフォルトの名無しさん
09/05/17 11:32:26
クラスのメンバ関数の返り値は
コピー返しでも可能ならconstにしろ
とEffective C++で言われていましたが、
なぜか返り値がbool型だけはconst付けない風習がありません?
例: bool is_valid() const {return member?true:false;}
この場合も返り値にconst付けた方が良いのでしょうか?
269:デフォルトの名無しさん
09/05/17 11:34:17
付けた方がいいよ。
270:デフォルトの名無しさん
09/05/17 11:54:31
>>268
メリットはなに?
271:268
09/05/17 11:58:07
>>269
そうですよね。ありがとうございます。
>>270
組み込み型の返り値を万が一変更するバカが居た場合の予防です。
272:デフォルトの名無しさん
09/05/17 12:12:37
>組み込み型の返り値を万が一変更する
なんてできません。
馬鹿って言う人が馬鹿なんだぞw
ちゃんと読もうぜ。
273:デフォルトの名無しさん
09/05/17 12:25:20
メリットは記述の統一感かな?
テンプレート引数にするときにいいことってある?
自分は組み込み型にはconst付けない派だな
274:デフォルトの名無しさん
09/05/17 12:34:53
それ書いてあるのってEffecitve C++だっけ? Exceptionalかなんかのほうだった気がするが。
275:デフォルトの名無しさん
09/05/17 12:35:35
> テンプレート引数にするときにいいことってある?
全くない。
むしろ
組み込み型戻り値のconstは
環境によってはwarningやerrorになるから
うっとうしいことこの上ない。
276:デフォルトの名無しさん
09/05/17 13:02:35
constな自クラス型参照メンバなんか使いだすと有りとあらゆる宣言にconstが波及して`err passing〜'の楽しい事になるんだよね。
277:271
09/05/17 13:06:18
>>272
> >組み込み型の返り値を万が一変更する
> なんてできません。
有名どころのコンパイラならちゃんとコンパイルエラー出してくれるみたいですが
環境が違っても確実に予防してくれるのでしょうかね?
>>274
Exceptional C++だったかもしれません。
>>275
gccやboostの実装でも確かに組み込み型の戻り値にconstは付いていないようですね。
278:デフォルトの名無しさん
09/05/17 13:59:47
そもそも「組み込み型の返り値を万が一変更する」って
どういう意味なの?
279:デフォルトの名無しさん
09/05/17 14:00:46
public継承は分かる。
private継承も分かる。
ではprotected継承は?
使ったことある人います?(遊びじゃなく実用で。)
280:デフォルトの名無しさん
09/05/17 14:17:27
だからちゃんと嫁ってば。
Effecitve C++ 2ndの21節と29節に書いてあるのは、
非組み込み型のコピーを返す関数を左辺値として使われないように、
左辺値になり得る型が戻り値の場合はconst付けよーねってことと、
const宣言したメソッドがデータのハンドル(stringクラスのcharポインタとか)を
返却するときは戻り値にconst付けよーねってこと。
わざわざ押し入れからEffectiveC++取り出してきた俺に
プッチンプリン買ってこいw
>環境が違っても確実に予防してくれるのでしょうかね?
ぶっ壊れたコンパイラの話をされても困る。
281:デフォルトの名無しさん
09/05/17 14:18:55
じゃあ俺はなめらかプリンでよろしく
282:271
09/05/17 14:33:58
>>280
サーセン。吊って来ます。
ありがとうございました。
283:デフォルトの名無しさん
09/05/17 14:35:03
constの同音異義語っぷりもなかなか見事なものだ
284:デフォルトの名無しさん
09/05/17 17:10:42
>>280
非組み込み型の戻り値について const つけてあると、右辺値参照として取れなくなっちゃいそう。
この指針は将来的に非推奨になるんじゃなかろうか?
285:デフォルトの名無しさん
09/05/17 17:52:26
そもそも右辺値参照自体が、
Effective C++で問題が広く知れ渡ったことで
実装されることになったんじゃないかな。
ぷらぷら界に多大な影響を与えた引き替えに、
次の版は全面改定だな。
286:デフォルトの名無しさん
09/05/17 17:55:23
cppunitに関する質問ってありですか?
287:デフォルトの名無しさん
09/05/17 17:56:06
>>286
専用スレがあるから、まずはそっちで。
↓
CPPUnitについて少し話そうかい
スレリンク(tech板)
288:デフォルトの名無しさん
09/05/17 18:07:21
互換性考えたら右辺const値のオブジェクト代入は右辺値参照を無視してコピー噛ますんじゃないかな
289:デフォルトの名無しさん
09/05/17 18:09:03
そう。だから右辺値参照を使って最適化しているつもりが、うっかり今までどおりの
コピーになったりすることが考えられる。まぁ最適化の範疇と認識する分には問題には
ならないんだろうけど。
290:デフォルトの名無しさん
09/05/17 19:44:11
右辺値参照って、なんだかよく分からない。
C++0xが出れば解説も増えるかな?
291:デフォルトの名無しさん
09/05/17 20:32:36
僕もよく解らないけど、関数の返すオブジェクトがコピーされるとき、
もとのオブジェクトが捨てられる場面で、
コピーコンストラクタを呼ばないでよりコストの低い破壊的なコピー、
つまりオブジェクトのメンバを移動することをするってことなんでしょ?
ただそれだけでしょ?
292:290
09/05/17 21:12:34
現在 標準C++のコンパイラの最適化機能として実装されている
戻値最適化
とは違うのかいな?
C++ ラビリンス Return value and constructor
URLリンク(www.fides.dti.ne.jp)
293:デフォルトの名無しさん
09/05/17 21:12:36
そうそう、「移動」の概念(ムーブセマンティクス)を容易に実現するための言語仕様として考え出されたのが右辺値参照。
ほかに分かりやすい例を挙げるとしたらauto_ptr(の後継)がvectorに入れられるようになることとか、
functionやbindなどで各引数のconstや参照の有無の挙動を完全に再現したoperator ()を実現できるなんて効果がある。
294:デフォルトの名無しさん
09/05/17 21:27:43
多次元配列の要素全てを任意の値で埋めたい場合
どう書くのが良いでしょうか。
1次元の場合は std::fill や std::fill_n が使えるのですが。
int a[10][10];
for(int i=0; i < 10; i++)
for(int j=0; j < 10; j++)
a[i][j] = 42;
ということをしたいわけです。
295:デフォルトの名無しさん
09/05/17 21:28:25
>>292
最初の例や2番目のコピーコンストラクタ・代入演算子が呼ばれる例でもムーブセマンティクスは効く。
そこのコピーコンストラクタ・代入演算子の呼出が、ムーブコンストラクタ・代入演算子の呼出になる。
一般にムーブコンストラクタ代入演算子はコピーコンストラクタと違って、
それより遙かに低コストで例外の投げようもない実装になるので、より最適なコードになるとされる。
296:デフォルトの名無しさん
09/05/17 21:31:12
>>294
自分で書いてるじゃねーか。何が不満なの?
297:デフォルトの名無しさん
09/05/17 21:34:04
酒鬼薔薇
298:290
09/05/17 21:34:39
>>295
ほっほー。
そうなのかぁ。
ありがとう。C++0xが楽しみになって来たんだぜ。
299:デフォルトの名無しさん
09/05/17 21:46:45
いや普通に
memset(a, 42, 100);
で、いいんでない。string.h が使える環境なら
それより最近、スザンヌとギャル曽根の区別が付かなくて困ってます
見分け方を教えてください
300:デフォルトの名無しさん
09/05/17 21:47:47
>>299
int に memset() して 42 になるとでも思ってんのか?
301:299
09/05/17 21:47:53
アンカー忘れ。>>294 な
302:デフォルトの名無しさん
09/05/17 21:51:12
>>299
これはひどい。
303:299
09/05/17 21:52:38
すまん。レス取り消し。int だったね
回線切って(ry
304:299
09/05/17 21:53:52
>>301-302
仕事速いな。暇人
305:デフォルトの名無しさん
09/05/17 22:04:38
>>304
お前の方がよっぽど暇人に見えるんだが
306:デフォルトの名無しさん
09/05/17 22:11:27
>>294
その配列だったら連続性が保証されてるから
std::fill_n(&a[0][0], 100, 42)
でいいだろ。
307:デフォルトの名無しさん
09/05/17 22:12:15
>>294
お好きなほうをどうぞ。
std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42);
namespace bll = boost::bind;
std::for_each(a, a + sizeof a / sizeof a[0], bll::bind(std::fill_n<int*, std::size_t, int>, bll::_1, sizeof a[0] / sizeof a[0][0], 42));
308:デフォルトの名無しさん
09/05/17 22:23:24
>>307
std::fill_n(first, n, val) は [first, first + n) に対しての操作だから
要素数でOK。sizeof a / sizeof a[0][0] は冗長。
309:デフォルトの名無しさん
09/05/17 22:26:42
それも要素数・・・
310:デフォルトの名無しさん
09/05/17 22:28:14
g++にてテンプレートに暗黙の型変換を絡めたら分からなくなったので教えてください。
C++ code - 60 lines - codepad
URLリンク(codepad.org)
このソースコードでは50行目hoge < short(1)の部分で
error: no match for 'operator<' in 'hoge < 1'
と言われてしまいます。どうやら暗黙の型変換がうまくいかないようです。
これを改変してForward declarationを無くして代わりにクラステンプレートの内部で friend 関数を定義することで回避できます。
C++ code - 49 lines - codepad
URLリンク(codepad.org)
しかし、どうして前者のソースコードでは暗黙の型変換がうまくいかないのでしょうか?
311:294
09/05/17 22:30:18
みなさまありがとうございます。
std::fill_n(&a[0][0], sizeof a / sizeof a[0][0], 42)
がよさそうですね。勉強になりました。
312:デフォルトの名無しさん
09/05/17 22:39:30
>>309
だから、要素数が既知なのに一々冗長に書くことないってこと。
313:デフォルトの名無しさん
09/05/17 22:42:54
>>312
「要素数が既知」ということに依存したコードにするほうが面倒なこともあると覚えておけ。
一般的には、保守性のほうが一回だけの記述の利便よりも重要だ。
314:デフォルトの名無しさん
09/05/17 22:45:14
>>313
何頭に血を登らせてるの?
質問者が提示したコードで要素数が定数になってたんだからそれでいいだろ。
不明な場合に要素数を計算するのは当然のこと。
315:デフォルトの名無しさん
09/05/17 22:45:22
>>312
マジックナンバーは避けるべきだろjk
const N = 10;
int a[N][N];
なんてしているならsizeofを使わずにNと書いてもいいとは思うけど。
316:デフォルトの名無しさん
09/05/17 23:08:17
そういう本質でない話はもういい
317:デフォルトの名無しさん
09/05/18 01:54:38
template<T,U>void fill(T (&d)[U],T v){for(unsigned i=0;i<U;++i)d[i]=v;}
template<T,U0,U1>void fill(T (&d)[U0][U1],T v){for(unsigned i=0;i<U0;++i)for(unsigned j=0;j<U1;++j)d[i][j]=v;}
マジックナンバーイラズサイテキ化キタイダイ
int a[10][10];
double b[10];
fill(a,0);
fill(b,0.0);
318:デフォルトの名無しさん
09/05/18 02:07:27
オナニーレスうぜえな
ループを書きたくないってのが本題なのに、それじゃ本末転倒だろうが
319:デフォルトの名無しさん
09/05/18 02:22:32
>>318
何いってんの?
ライブラリって知ってる?
320:デフォルトの名無しさん
09/05/18 02:57:44
>>310
暗黙の型変換はテンプレートを具象化しなければならない時には行われないから
んで、どうすればいいかというと後者のようにすればいい
Effective C++の46項に詳しく書いてあるよ
321:デフォルトの名無しさん
09/05/18 03:25:03
>>284,285,288,289
C++0x の話としては,戻り値の型が const 修飾されていると
move 出来ない (immutable な右辺値になる) ので,
Effective C++ の記述がやや古くなるのはその通りだと思います.
C++0x 的には, EC++ のこの記述は
恐らく "Extending move semantics to *this" と
"Defaulted and Deleted Functions" との組み合わせに置き換わるべき話だと思います.
322:デフォルトの名無しさん
09/05/18 03:56:14
C++が苦手なCプログラマなのですが、ちょっと質問です。
ファイル内の文字列を探すプログラムです。
これをC++で書くとしたらこの程度でもクラスを作るのですか?
#include <stdio.h>
#include <string.h>
int main(int ac, char * av[])
{
//ファイルからメモリーに読み込み
FILE * fp = fopen("文字列が入ったファイル", "r");
fseek(fp, 0, SEEK_END);
int fSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
char * buf = (char *)malloc(fSize);
fread(buf, 1, fSize, fp);
fclose(fp);
//さがす
char ss = "abcde";
int ss_len = strlen(ss);
char * p = buf;
for (int i = 0; i < fSize - ss_len; i++) {
if (strncmp(ss, p, ss_len) == 0) {
printf("%d番目に見つかりましたよ\n", i);
return 0;
}
p++;
}
free(buf);
return 0;
}
323:デフォルトの名無しさん
09/05/18 04:00:29
おれはc++のOOP が標準だから、特別な理由が無い限りOOPで書く。
英語で育った人は、特に何も考えずに英語会話するのと同じ
324:デフォルトの名無しさん
09/05/18 04:03:57
その程度だと、既存のクラスを使うだけで出来上がるね。つまり、クラスを作る出番ではないと。
極論すればクラスってのは作るものというより使うもの。
325:デフォルトの名無しさん
09/05/18 04:09:51
それに、mallocをfreeしてないでしょ、終われば開放するけど、
それはたまたま短いプログラムだから、OOPだと、明示的にディストラクタがある。
まあ使わなきゃ意味無いけど、私はこれも標準で書いてしまう。だから少し安心なわけ。
それに、そのプログラムはバッファーオーバランしないようだけど、それも、保護されやすい。
ただし、標準でOOPが身についてるからであって、人によってはOOPでもいくらでも汚くかける。
326:デフォルトの名無しさん
09/05/18 04:13:16
あ、ごめ freeしてた orz
327:デフォルトの名無しさん
09/05/18 04:14:40
いや…、Cはもう、身についてないから…と言い訳する orz orz orz
328:デフォルトの名無しさん
09/05/18 04:16:55
一人で無駄に4レスも使いやがって
329:デフォルトの名無しさん
09/05/18 04:17:57
俺はその程度ならclass内でやったりしないな。FILEも普通に使うし。
ただ、バッファはvector<char>で確保するし
探索も文字列探索クラス(BM法とか)を作って実行するね。
処理自体は(mainには限らないが)普通の関数に置く。
ただこれは当然「ファイル内の文字列探索が処理の全て」の場合。
何らかのclassの処理の中でファイル内探索を必要とする時は、当然そのように書く。
330:310
09/05/18 05:52:46
>>320
Effective C++では後者の方式が天下りに与えられていました。
あくまで前者のような方式(実装をクラス宣言部分に書かない)
で解決する方法はありませんか?
(後者の方式でprivate宣言されたヘルパー関数を呼び出すという回避策もありますけれど。)
331:デフォルトの名無しさん
09/05/18 05:56:50
>>325
destructor
はディストラクタではなくデストラクタね。発音的にも用語的にも。
ディスクトップでなくデスクトップなのと同じで。
332:デフォルトの名無しさん
09/05/18 10:51:25
>>330
関数が2つになっちゃうけど、
クラス内に
template<typename T> friend bool operator <(const Hoge &lhs, T rhs);
template<typename T> friend bool operator <(T lhs, const Hoge &rhs);
って書けば、関数テンプレートの定義を外に書けると思う…たぶん
それか、関数テンプレートをやめて定義を特殊化して書いてもいけるんじゃないかな。
間違ってたらサーセン
333:デフォルトの名無しさん
09/05/18 16:13:37
>>322 を見て思ったんですが、
ファイルを読み込み文字列検索するだけでこんな長く分り難いにコードにえーって感じなんですが、
C++を使って書くとこれより短く解りやすいコードになるんですか?
それはどんな感じになるんですか?
>>322 で
printf("%d番目に見つかりましたよ\n", i);
return 0;
ここでreturnしているんですが、ここではfreeしなくて良いんですか?
334:デフォルトの名無しさん
09/05/18 16:41:01
>333
main() {system("grep abcde 文字列が入ったファイル");}
>free
リークしていないので問題ないが、姑に目を付けられる。
335:デフォルトの名無しさん
09/05/18 16:53:00
でも突然サブルーチンに昇格する可能性もあるから、
常にfreeした方がいいよ。
336:デフォルトの名無しさん
09/05/18 17:02:55
>>334
>free
見つかった時、見つからない時の両方でfreeしないなら良いけど
片方しかしてないって、C使いらしくないんじゃない?
短いコードでたった2箇所を管理するだけなのに、それすら出来ないなんて
337:デフォルトの名無しさん
09/05/18 17:55:44
freeの仕様について言及しただけで、
>>322のソース自体に文句付けるなら
もっといろいろあるだろ。
338:デフォルトの名無しさん
09/05/18 21:07:11
return 0; を break; に置き換えるとか?
339:デフォルトの名無しさん
09/05/18 21:14:11
ファイルを一気に読むのが好きになれない、俺なら1行ずつの処理にする。
340:デフォルトの名無しさん
09/05/18 21:15:00
配列まではすんなり頭に入ったけど、ポインタとかクラスのメンバ関数とかわけわかんねー・・
なんにしても作りたい物が無ければ頭に入らない気がしてきたんだけど、ドリルみたいなものって無いですか
341:デフォルトの名無しさん
09/05/18 21:16:19
宿題スレに山ほど
342:デフォルトの名無しさん
09/05/18 21:19:51
こんなスレあったのか、ありがとう
343:デフォルトの名無しさん
09/05/18 21:35:44
>>341
宿題スレはいいよな
糞問ばっかりだけど最初のうちは数こなす方が大事だし
344:310
09/05/18 23:20:37
>>332
なるほど。
やはり関数を1つにまとめ、かつ
(特殊化をすると妨げられる)汎用性を保とうとするならば
Dan Saksの
More C++ Idioms/friend 関数の生成(Making New Friends) - Wikibooks
URLリンク(ja.wikibooks.org)(Making_New_Friends)
すなわちEffective C++でいう後者の方式しかないようですね。
ありがとうございました。
345:デフォルトの名無しさん
09/05/18 23:30:53
次はコナン風で頼む。
346:デフォルトの名無しさん
09/05/18 23:32:24
どっちのコナンだよ
347:デフォルトの名無しさん
09/05/18 23:43:35
やってくれるのか?
わくわく
348:デフォルトの名無しさん
09/05/19 01:23:32
コナン・ザ・グレート風で頼む。
349:デフォルトの名無しさん
09/05/22 23:15:48
クラス中の宣言の中でメンバ関数の定義をした場合、
自動的にinline展開要請になるんだよね?
では
クラス中の宣言の中でfriend関数の定義を記述した場合、
inline展開要請になるのかい?
350:デフォルトの名無しさん
09/05/22 23:32:49
^^
351:デフォルトの名無しさん
09/05/22 23:35:26
inline展開陳情のほうがいいかも。
352:デフォルトの名無しさん
09/05/22 23:49:36
俺のBCC 6.1.0ではオプションを付けない限り inline は全部無視される\(^o^)/
デバッグの時の事を考えてだと
353:デフォルトの名無しさん
09/05/23 00:48:25
>>352
BCC以外でもみんなそうだけど……。
354:デフォルトの名無しさん
09/05/23 15:44:38
同じ質問になるのですが、86とは別人です。
コンストラクタで例外を投げるな、というのをかなり以前Cマガジンで読みました。
その後、Google や >>93 で、コンストラクタ内で例外を投げる時に
適切にリソースを解放すれば問題ない、というのが多かったのですが、
以下のサイトに気になる記述も見つけました。
URLリンク(www.geocities.jp)
newで作ったときにオブジェクト自体がリークしてしまう
URLリンク(monoist.atmarkit.co.jp)
ポインタが返ってこない。知らないポインタは消せない
コンストラクタで例外を発生させてもよいが、その場合は new するな、
という理解でよいでしょうか。
355:デフォルトの名無しさん
09/05/23 16:19:13
>>354
Symbianは組込だからそうなっていないのかもしれないが、普通はその心配は要らない。
その場合は確かにプログラムで対処できないので、言語が面倒を見てdeleteしてくれる。
規格では15.2にそう定められている。
ちなみに、そういうわけでnewを定義するときには必ず対応するdeleteを定義しないといけない。
URLリンク(www.fides.dti.ne.jp)
356:デフォルトの名無しさん
09/05/23 17:13:34
>>355
規格での項番まで示していただきまして、有難う御座います。
15.2/2 の箇所ですね。
規格に正しく準拠した処理系であれば問題ないとことで、懸念なく利用したいと思います。
有難うございました。
357:デフォルトの名無しさん
09/05/23 22:49:39
初心者ではないと思っていたのですが、初心者からこんな質問を受けて
的確に答えられなかった自分が恥ずかしいです。どなたか、模範解答を教えてください。
「ヘッダファイルの用途と、使用によるメリットは理解できました。
ただ、cpp ファイルを分ける目的がわかりません。
また、cpp ファイルを複数持たせた場合、ビルド順はどうなるのですか?」
宜しくお願いします。
358:デフォルトの名無しさん
09/05/23 23:01:32
むしろcppファイルを分けないでどうやってまともに開発しているのか分からないぐらいだが。
分割コンパイルすることで仕様変更に伴う再コンパイル時間の短縮とかも見込めるけど、
それ以上にそもそも他人が作ったクラスとかを使いたい(再利用したい)場合とか
cppファイルが分かれてなかったら再利用できないだろ。
359:デフォルトの名無しさん
09/05/23 23:06:45
>>358
その観点で考えると、うちのプロジェクトは基本的にほどんどがヘッダファイルで構成されていて、
クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。
なので、再利用には困りません。
ほとんどがヘッダっていう考え方がNG?
あと、ビルド順序はどうなるものですか?やってみたんですが分かりませんでした。
360:デフォルトの名無しさん
09/05/23 23:07:48
いやまて。ヘッダファイルに直接定義を書き込んでいるのか?
そんなことできないだろ。
361:デフォルトの名無しさん
09/05/23 23:10:52
出来るだろ。じゃないとboostのビルド不要なライブラリは実現できないよ。
362:デフォルトの名無しさん
09/05/23 23:12:36
「ビルド順はどうなるか」って、質問者はもちろん、>>357自身も理解してない気配。
分割コンパイルやリンクについてわかってないまま脱初心者とは。
ちなみに、グローバルやclass-staticな変数の初期化順については
何も規定されていないことが規定されている。
ということは、リンク順についてそれが当てはまることを意味するが
規格に「リンク」という単語が出ているかは知らない。
cppの分割については>>358と同じ。
classにわけたり、意味的なまとまりにわけたりして
まともなものを作るのなら分割するのが当然。
>>359
Javaチックな書き方ってことかね。
別にそれならそれで良いんじゃないの。
.hに全部書く、ということは、「ビルド(コンパイル)時間の短縮」なんて
露ほどにも考えていないということだから、
再利用もできるし分割コンパイルなんて必要無いかもね。
363:デフォルトの名無しさん
09/05/23 23:13:20
言い方がまずかったか。「できないものがある」。こうだな。
もしかして、全部 inline にしたり、あらかじめ obj にしたりしてあるのだろうか。
364:デフォルトの名無しさん
09/05/23 23:17:24
>>359
>クラスは基本的に .h で作って #include で取り込む、っていう方法を取っています。
>なので、再利用には困りません。
>ほとんどがヘッダっていう考え方がNG?
マジ??
その会社 大丈夫???
考えて見ればcppファイルが1つだけなら関数の定義とかを.hに書き込んでも
バイナリの時点で重複は起らないが(hでインクルードガードしていること前提ね。)
それにしても、、、ねぇ。。。
365:デフォルトの名無しさん
09/05/23 23:18:54
>>360
dllexport が必要な時と、main() 系、コールバック系以外はすべてヘッダファイルなんです。
クラスの定義や構造体など、ほとんど。
ヘッダファイルの考え方が違うのかな…
>>362
規定が無い点について理解しました。
確かにうちのプロジェクトのソースはビルド時間かなりかかるんです…
.cpp で書くと分割コンパイルされて速度が向上するということですね。
まったく知りませんでした。。
まさに java チックです。
なので、include 順序がかなり大事で問題も結構起きるんですよね。
でも私個人的には、c++ で開発しているので、c++ の基本を知りたいです。
>>363
全然、そんなことないんです><
おまけに、プリコンパイルヘッダもないので時間ばかりが掛かって…
366:デフォルトの名無しさん
09/05/23 23:21:28
>>365
ヘッダに定義を全部書いたら、クラスのインタフェースに全く影響を及ぼさない
変更であっても、そのヘッダに依存するソースファイルすべてが再コンパイル
されるじゃないか。その程度も分かってない会社って一体・・・
367:デフォルトの名無しさん
09/05/23 23:22:39
>>364
インクルードガードしてもできないよ。
インクルードガードは同一翻訳単位内でしか有効ではないから。
368:デフォルトの名無しさん
09/05/23 23:25:16
>>364
そうなんですよ!!
.cpp ファイルは main 用に1つだけあって、あとは .h の処理を呼び出したり、
クラスを生成してクラスに処理を任せたり、、、
グローバル関数までもが .h に居る始末です。
>>366
まさにその通りですね。
これでも一部上場なのですが、本当にお恥ずかしいです。
369:364
09/05/23 23:25:54
>>367
いやできるでしょ。
cppが1つしかないんだぜ?
ってことは翻訳単位も(恐ろしいことだが)一つってことじゃん。
370:デフォルトの名無しさん
09/05/23 23:27:17
すでに拡張子の意味を逸脱した使い方なのはわかった
371:デフォルトの名無しさん
09/05/23 23:29:20
>>369
あぁ、そういうことか。理解したw
すごいな。
372:357
09/05/23 23:33:35
結論としては、>>370 がおっしゃっているように、
拡張子の意味を確実に逸脱しているのですね。
みなさんがおっしゃったように、リンクの意味を理解していなかったようです。
分割ビルドは十分理解できました。
今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか?
また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる
考えられる問題がありましたら教えてください。
>>369
すみません、私は理解できませんでした。
まだ初心者であることを思い知りました。
翻訳単位が1つだと、恐ろしいものですか?時間が掛かる、という観点でしょうか。
373:369
09/05/23 23:40:35
>>372
>翻訳単位が1つだと、恐ろしいものですか?
そんな開発者見たことないから、恐ろしいと形容した。
>今一度教えてください。みなさんは .h を基本的にどのような用途で利用されていますか?
あくまで宣言だけを書いておく。
MyClassを使う必要があればMyClass.hをインクルードする。
一方MyClass.cppにもMyClass.hをインクルードしておいて、別途コンパイルしておく。
こうすることで、MyClass.cppが変更されても他の大部分のcppは再コンパイルしないで済む。
あるいはMyClass.cppをコンパイルしてライブラリとして公開する場合、
他社には.hだけを見せるわけだから実装を隠せるとか。
>また、現状のように .cpp を1つだけもち、ほとんどすべてを .h に置くことで発生しうる
>考えられる問題がありましたら教えてください。
他の会社や組織に公開する時に実装がだだ漏れになるとか
374:デフォルトの名無しさん
09/05/23 23:46:19
つか、どんな教科書で勉強したんだよ。
大概の教科書は分割の仕方書いてあるだろ^^
375:デフォルトの名無しさん
09/05/23 23:49:36
>>372
ビルドに時間が掛かって仕方がないだろう
376:357
09/05/23 23:54:38
>>323
なるほど、、、将来を見据えた設計をしながら開発してるんですね。
なんかもう、うちの会社が悩ましいです。
>>374
会社の研修では一切…
ちなみにほとんどのプロジェクトがそんな感じです。
java と COBOL 人間ばかりなので、include = そこにそのファイル内容を挿入、っていう
意味合いだけしか着目していないんだと思います。
>>375
その通りですね。勉強になりました。
今日皆さんにご指導いただいた内容を以って、会社の開発体制の改善を
促して以降と思います。
ありがとうございました。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5008日前に更新/243 KB
担当:undef