C++相談室 part78
..
310:デフォルトの名無しさん
10/02/22 01:08:08
std::string a = "asdf", b = "9999999999999999999999999999999";
って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!?
std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;;
→ のーぷろぶれむ
311:304
10/02/22 01:15:14
>>310
ありがとう。
その通りでした。
>>308
あとあと編集しづらいかな見にくいかなと思ったので。
312:デフォルトの名無しさん
10/02/22 01:47:53
クラス内にstatic constのint値を定義して,
#defineの代わりにしたいんですが,
このint値はそのクラスのインスタンスを生成してなくても,
メモリ上に存在するのでしょうか?
そうなると,大規模開発では避けるべきなのでしょうか?
313:デフォルトの名無しさん
10/02/22 01:51:08
#defineされた値だとプログラム全体の最適化がされない限り書く度に別々のところに数値が配置されるけどね。
314:デフォルトの名無しさん
10/02/22 02:00:33
グローバル変数ってlibファイルで共有?
モジュールで共有?
315:デフォルトの名無しさん
10/02/22 17:47:17
>>312
最適化すりゃどうせ消える
316:デフォルトの名無しさん
10/02/22 21:00:22
>>312
まあ理屈はそうだけども、
現実的にはその最適化がなされないような状況は
明示的にコンパイルオプションで止めろ!
と言わない限りおこんなinじゃない?
317:デフォルトの名無しさん
10/02/22 21:40:04
staticなんだからインスタンスは関係ないんじゃ
318:デフォルトの名無しさん
10/02/22 21:56:37
templateクラスのstatic変数ならあるいは
319:デフォルトの名無しさん
10/02/22 22:40:59
hiphopのwindows binaryありますか。phpコードをc++に書き換え、phpから利用できるようになるようなんですが。
ソースコード。
URLリンク(github.com)
320:デフォルトの名無しさん
10/02/23 01:04:04
来月出版の
C++テンプレートメタプログラミング
糞本かな?
えぴなんとかさんの書いた類の糞本レベル?
321:デフォルトの名無しさん
10/02/23 05:41:33
禿本の邦訳にも係わってる人だよ
322:デフォルトの名無しさん
10/02/23 12:14:03
えぴなんとかさんってすごいのかどうかよくわからん
昔の掲示板ログとか見るととんちんかんな感じだよね
えぴなんとかさんが初心者だったころなのかもしれないけど
323:デフォルトの名無しさん
10/02/23 18:19:02
これのことかな
URLリンク(episteme.wankuma.com)
324:デフォルトの名無しさん
10/02/23 18:48:30
わんくま同盟ってなんか気持ち悪いよね
公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ
325:デフォルトの名無しさん
10/02/23 19:14:15
気持ち悪いというあいまいで感覚的な概念が気持ち悪い
326:デフォルトの名無しさん
10/02/23 19:41:10
単に偉そうでむかつくんだろ
327:デフォルトの名無しさん
10/02/23 19:47:58
「気持ち悪い」のはともかく、「よね」が意味わからん
328:デフォルトの名無しさん
10/02/23 20:52:33
内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない
329:デフォルトの名無しさん
10/02/24 00:19:05
えぴなんとかさんって
インなんとかさんみたいなもんか?
330:デフォルトの名無しさん
10/02/24 00:42:06
ペンネームに機種依存文字を使うプログラマの人って…
331:デフォルトの名無しさん
10/02/24 00:50:37
ビル☆ゲイツの悪口はそこまでだ
332:デフォルトの名無しさん
10/02/24 01:07:23
C++学ぶのにいい本ありませんか?
333:デフォルトの名無しさん
10/02/24 01:08:02
>>332 >>4-5
334:デフォルトの名無しさん
10/02/24 01:11:44
>>330
今チェックしたんだけど
機種依存文字じゃなかったぞ
335:デフォルトの名無しさん
10/02/24 06:51:15
>>332
こいつはマルチポストだから相手にしないように!
336:デフォルトの名無しさん
10/02/24 18:30:19
単項演算子-のオーバーロードについて質問があります。
独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略)
class coord{
int x,y;
public:
coord(){x=0;y=0;}
coord operator-(coord ob2);//2項負符号
coord operator-();//単項負符号
};
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-(){
x=-x;
y=-y;
return *this;
}
上記の場合、
coord ob1;
coord ob2;
ob2=-ob1;
としただけで、ob1の内容が変わってしまうと思うのですが、
このサンプルコードは正しいのでしょうか?
以下のほうがいいと思うのですが。
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-()
{
coord temp;
temp.x=-x;
temp.y=-y;
return temp;
}
337:デフォルトの名無しさん
10/02/24 18:33:57
俺もそのほうが良いと思う
一般に組み込み型と同じ挙動になるようにデザインするほうが良いと
EffectiveC++にも書いてあるし
338:デフォルトの名無しさん
10/02/24 18:40:12
そしてconstを付けるべき
339:デフォルトの名無しさん
10/02/24 19:21:48
>>336
君の意見は正しい。
coord coord::operator-()const;
とすれば納得できると思う。
340:336
10/02/24 19:57:51
>337-339
ありがとうございました。
これで先に進めます。
341:デフォルトの名無しさん
10/02/24 23:20:04
ん
*thisを返すからいいんじゃないの?
342:デフォルトの名無しさん
10/02/24 23:23:33
this->xが変わるからダメなんじゃないの
343:デフォルトの名無しさん
10/02/24 23:28:54
プログラムに致命的なエラーがあり
(取り扱えない例外をキャッチしたなど。)
そこで即座に終了したい場合、
assert(0);
exit(1);
のどちらが望ましいのでしょうか?
また、この2つにはどんな違いがあるのでしょうか?
よろしくお願い申し上げます。
344:デフォルトの名無しさん
10/02/24 23:33:31
>>342
ああ、すまない。ぼけてたorz
もう寝る…
345:デフォルトの名無しさん
10/02/24 23:42:17
>>343
assertは、ここでこうなってるはずがない、というプログラマの意思表示
んで、それはリリースビルドだとなくなるロジック
346:デフォルトの名無しさん
10/02/24 23:59:19
インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。
一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、
いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。
また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。
つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか?
(妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)
347:デフォルトの名無しさん
10/02/25 00:22:00
一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ
348:デフォルトの名無しさん
10/02/25 01:11:41
>>343
その用途だと abort() あるいは terminate() が正解だと思う。
assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。
349:デフォルトの名無しさん
10/02/25 01:14:23
>>346
new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね?
そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ
置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。
350:デフォルトの名無しさん
10/02/25 01:16:15
>>346
dlmallocなんて単純だからすぐ作れるし
自分でmalloc作ればいいよ
351:デフォルトの名無しさん
10/02/25 01:20:56
>>346
まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが
new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、
それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、
書いても良い。
それ以外は許さん。
352:デフォルトの名無しさん
10/02/25 01:51:00
>346
実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら?
実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。
お手軽に実装するんだったらboost::shared_ptr + deleterかね。
353:デフォルトの名無しさん
10/02/25 02:01:58
>>343
assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。
exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。
C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。
terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、
そこまでしたい状況は考えにくい。
結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが
常道だと思う。
354:デフォルトの名無しさん
10/02/25 02:05:19
>>343
取り扱えない例外ははじめからキャッチするなよ。
万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。
そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。
355:デフォルトの名無しさん
10/02/25 03:30:24
enum型を引数に持つときって参照渡しにした方がいいの?
構造体とは違うっぽいのでしなくてもいい?速度的に
356:デフォルトの名無しさん
10/02/25 03:38:12
>>355
速度が気になるなら計測してみるがいい。
参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより
大きくなることはなさそうで、あまりメリットはなさそうな感じではある。
357:デフォルトの名無しさん
10/02/25 03:54:59
>>351
配置newって嫌われ者なの?
358:デフォルトの名無しさん
10/02/25 05:48:41
>>355
列挙型の実態が整数"ではない”実装を見たことがない。
359:デフォルトの名無しさん
10/02/25 09:35:37
>>357
別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。
360:デフォルトの名無しさん
10/02/25 10:53:34
誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。
361:デフォルトの名無しさん
10/02/25 10:55:15
>>360 boost::aligned_storage あたりでおきかえる。
362:デフォルトの名無しさん
10/02/25 11:33:04
じゃあ最初からboost::aligned_storageって書けよ
363:349
10/02/25 12:07:15
>>362
boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した
ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、
そんな気持ちを込めて「〜みたいな領域」と書きました。
364:343
10/02/25 12:49:32
>>345>>348>>353-354
ありがとうございます。
assert() exit() terminate() abort()
について勉強してきます。
365:デフォルトの名無しさん
10/02/25 17:02:41
>>363
>そんな気持ちを込めて「〜みたいな領域」と書きました。
どう考えてもそれだけの情報からその気持ちは伝わらないから。
頭大丈夫?日本語分かる?精神鑑定してもらったら?
366:デフォルトの名無しさん
10/02/25 20:49:40
解析で使う
A-Z a-z 0-9
1 1 2 3
2 1 2 3
3
4
な表ってなんて名前だっけ?
367:デフォルトの名無しさん
10/02/25 20:57:50
>>366
LR解析表なのか?状態複数あって
LR衝突してないのか?
368:デフォルトの名無しさん
10/02/25 21:03:59
>>367
表の中は説明で適当に書いただで意味はないんだ。
どんな名前だったか忘れてしまったもんで。
助かったよ。ありがとう
369:デフォルトの名無しさん
10/02/25 22:34:38
>>365
俺には伝わっていたが、伝わらない人がいるのもわかる。
そして、伝わらなかったからといってそのようなレスをするあなたが心配です。
370:デフォルトの名無しさん
10/02/26 13:26:29
一般に、
g++ -lhoge test.cpp
という調子でライブラリを読み込んで成功したとき、
hogeの場所を知るコマンドってありますか?
具体的には
g++ -llapack test.cpp
なのですが、これは
Fortranのライブラリをリンクしているそうです。
Fortranでは
DSYEV
という関数名なのがC系だと
dsyev_
と、アンダーバーがつくようになるというのがよく分からないので・・・。
371:デフォルトの名無しさん
10/02/26 14:38:16
よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい
それにOS依存の話題だったら微妙にスレ違いだぜ
372:デフォルトの名無しさん
10/02/26 15:45:41
LD_LIBRARY_PATHとか
373:デフォルトの名無しさん
10/02/26 15:47:09
・リンカが検索に用いるパスを探すことで場所を知ることができる
・ラッピングした際に小文字にしたんでしょう
374:デフォルトの名無しさん
10/02/26 16:06:37
>>370
URLリンク(www.netlib.org)
As previously stated, the CLAPACK library was built using
a Fortran to C conversion utility called f2c. The entire
Fortran 77 LAPACK library is run through f2c to obtain C
code, and then modified to improve readability. CLAPACK's
goal is to provide LAPACK for someone who does not have
access to a Fortran compiler.
It is important to note that this f2c conversion was run on
a machine that appends an underscore to differentiate C
and Fortran 77 namespaces. If your machine does not append
an underscore to differentiate namespaces, then CLAPACK
will not work on your machine.
375:デフォルトの名無しさん
10/02/26 17:11:46
ありがとうございます。
だんだん事情が分かってきました。
人間がCに移植しているわけではないのですね。
clapack.h
をみても、単に宣言が書いてあるだけなので、
Cのソースコードとしてincludeするわけでもないのか。
あと前半はたしかにOS依存の話ですね。
手元の環境ではLD_LIBRARY_PATHも空だったし。
すみませんでした。
376:デフォルトの名無しさん
10/02/26 20:04:26
/*******************************************************/
#define MAX(x,y) ((x)>(y) ? (x):(y))
int a = 3;
int b = 3;
int m = MAX(a,++b);
はプリプロセッサによって
int a = 3;
int b = 3;
int m = ((a)>(++b) ? (a):(++b));
と展開されます。
結果的に++bが2度評価され、bとmは5になってしまいます。
/*******************************************************/
という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか?
私には未定義の動作になりそうに見えるのですが。
よろしくお願いします。
377:デフォルトの名無しさん
10/02/26 20:07:07
保証されますよ
378:デフォルトの名無しさん
10/02/26 20:25:05
>>377
int m =++b, a , ++b;
の場合はどうなりますか?
bとmが5になりますか?
それとも未定義の動作でしょうか?
379:デフォルトの名無しさん
10/02/26 20:30:14
未定義の動作ですよ
380:デフォルトの名無しさん
10/02/26 20:39:49
int m = (a)>(++b) ? (a):(++b);
だとOKで、
int m =++b, a , ++b;
だと未定義の動作なのですね。
うーん、ややこしいです。
両方とも一つの式の中で2回bの値が
変化しているように思うのですが、
どういった相違により
片方がOKでもう一方はダメに
なるのでしょうか?
381:デフォルトの名無しさん
10/02/26 20:41:58
カンマがね、ヤバイんですよ・・・ここだけの話
382:デフォルトの名無しさん
10/02/26 20:54:23
unsigned A(){
struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1};
retrun r(0)|r(8)|r(16)|r(24);}
0x04030201 // 式中でオブジェクトの順状態て保証される?
383:デフォルトの名無しさん
10/02/26 21:00:47
>>382
されない
384:デフォルトの名無しさん
10/02/26 21:42:11
なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。
>>378 の m, b ともに 5 になることは保証されているぞ (5.18-1)
m=func(++b, a, ++b); だと未定義動作だけどな。
>>376 副作用完了点でぐぐってみるべし
385:デフォルトの名無しさん
10/02/26 22:03:09
a++, a++;
未定義
386:380
10/02/26 22:23:55
int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。
int m = (a)>(++b) ? (a):(++b); は正当で
int m =++b, a , ++b; も正当
ですが
int m =++b, ++b;
は未定義ということなのですか?
int m=(++x) + (++x); は未定義動作になりますか?
387:デフォルトの名無しさん
10/02/26 22:39:06
未定義
388:デフォルトの名無しさん
10/02/26 22:39:58
>>384
int a=3;
int b=3;
int m =++b, a , ++b;
このときにmが5になることが保証されているといっている?
389:デフォルトの名無しさん
10/02/26 22:40:35
>>378 これはコンパイルエラーでしょ。
390:デフォルトの名無しさん
10/02/26 22:43:36
>>384
カンマ演算子は副作用完了点たりえないのでは?
391:390
10/02/26 22:45:15
間違えて覚えてたみたい。ごめんなさい。
392:384
10/02/26 22:46:49
章番号までちゃんと示してある。言語規格書呼んでから話するんだな。
393:デフォルトの名無しさん
10/02/26 22:54:23
>>392
自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。
カンマ演算子とか言ってるところを見ると、
int m =(++b, a , ++b);
こう解釈したんだろうとは思うけど。
394:デフォルトの名無しさん
10/02/26 22:54:31
特例は3項演算子、カンマ演算子のほかに&&と||もあるから
int b=1;
int a=++b&&++b&&b;
こんなのでもちゃんとa=3になるな
しかしひどいコードだ
395:デフォルトの名無しさん
10/02/26 22:57:41
もういいから黙って二行に分けろよカス
396:デフォルトの名無しさん
10/02/26 22:59:04
>>393
その程度だろ
URLリンク(codepad.org)
今話してる話題と関係ないだろ
397:デフォルトの名無しさん
10/02/26 23:07:28
何そのイン○リさんみたいな返し?流行ってんの?
398:デフォルトの名無しさん
10/02/26 23:08:14
何言ってんだか
399:デフォルトの名無しさん
10/02/26 23:11:21
>>393
コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので
mに4が代入された後、bはインクリメントされる。
なので、>>388を書いた。
400:デフォルトの名無しさん
10/02/26 23:16:56
>>399
なんだか知らんが
++bは前置増分演算子って呼ぶってことは知ってるの?
401:デフォルトの名無しさん
10/02/26 23:20:01
URLリンク(codepad.org)
ああこういう意味でコンパイルエラーってことね。
上記の話をまとめると
int m =(++b, a , ++b);
は
URLリンク(codepad.org)
のようになり、正当な動作をするって考えていいのね。
402:デフォルトの名無しさん
10/02/26 23:21:46
つまり
3項演算子(条件演算子
カンマ演算子
&&
||
の4つは、副作用完了点となるから
それらのオペランドに++aが複数回出現しても
未定義の動作にならないってこと?
403:デフォルトの名無しさん
10/02/26 23:29:57
>>400
なんだかどうしようもないところでボケていてすまんかった
404:デフォルトの名無しさん
10/02/26 23:45:55
>>402
「オーバーロードされてなければ」それで合ってる
405:デフォルトの名無しさん
10/02/27 15:54:25
URLリンク(codepad.org)
このコードで
std::cout << hairetsunoyousosuu(arr) << std::endl;
の部分は 期待通りになるのですが
std::cout << foo(arr) << std::endl;
の部分が期待通りになりません。
どうすれば
「引数として渡された配列の要素数を返す『関数』」
が書けるでしょうか?
よろしくお願い申し上げます。
406:デフォルトの名無しさん
10/02/27 16:00:57
関数の仮引数の[]はただのポインタに変わる
コンパイル時にわかるものなら_countofを参考にする
それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない
407:デフォルトの名無しさん
10/02/27 16:03:23
>>405
main::arrはint[5]型
foo::argはint[]型
sizeof(int[5])はsizeof(int*) * 5
sizeof(int[])はsizeof(int*)
int*とintの大きさがたまたま同じだっただけ。
408:デフォルトの名無しさん
10/02/27 16:05:30
>>406
ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。
409:デフォルトの名無しさん
10/02/27 16:34:50
構造体と勘違いしてんじゃねえのお前
410:デフォルトの名無しさん
10/02/27 16:42:25
こまけぇことはいいんだ、vector使え!
411:デフォルトの名無しさん
10/02/27 18:23:11
>>405
なんか codepad は Error 500 で見れなかったんだけども、こういう話?
URLリンク(d.hatena.ne.jp)
412:405
10/02/27 19:19:17
>>406-411
みなさんありがとうございます。
template<class T, int N> int len(T (&)[N]){return N;}
と
#include <cstddef>
template<typename T, std::size_t N>
char (&lengthof_helper_char_array(T (&a)[N]))[N];
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))
ですと、どちらが望ましいのでしょうか?
413:デフォルトの名無しさん
10/02/27 19:24:04
>>412
どちらが望ましいかは場合によるね。
前者はコンパイル時定数としては使えない。
後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく
なっているし、基本的に避けるべきであるマクロまで組み合わされている。
414:デフォルトの名無しさん
10/02/27 19:39:51
>>413
なるほど、そう言った違いがあるのですね。
ありがとうございました。
415:デフォルトの名無しさん
10/02/27 19:43:00
URLリンク(www.kijineko.co.jp)
ここに書いてあることについてお伺いしたいのですが。
const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
if (isalpha(static_cast<unsigned char>(s)))
{
...
}
}
こうすべきとのことですが、これは
const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
if (isalpha(s))
{
...
}
}
の用にキャストを外すと動かないことがあるということでしょうか?
"abc123"のように、内容全てがASCII文字であってもだめなのでしょうか?
よろしくお願い申し上げます。
416:デフォルトの名無しさん
10/02/27 19:46:07
>通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、
417:デフォルトの名無しさん
10/02/27 20:04:49
>>416
多バイト文字を含む文字列の各要素も
isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか?
たとえば
"あいうえおabcd"
のような全角文字でもできるのでしょうか?
418:デフォルトの名無しさん
10/02/27 20:10:47
その記事も含めてそんなことをいってる奴は居ない
419:デフォルトの名無しさん
10/02/27 20:11:28
> is 系関数に実引数として渡すことができる値は、0 〜 UCHAR_MAX または EOF だけです
420:デフォルトの名無しさん
10/02/27 20:30:00
ASCIIだけなら問題ないんじゃない?
他の文字コード入ってたら知らんけど
421:デフォルトの名無しさん
10/02/27 20:58:27
"abc123"は多バイト文字を含む文字列ではありませんよね。
では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など
とは、具体的にはどんな文字列のことなのでしょうか?
422:デフォルトの名無しさん
10/02/27 21:17:37
sjisとかunicodeとか。
isalphaのかわりに_ismbcalphaやiswalphaで調べられる。
423:デフォルトの名無しさん
10/02/27 21:22:38
3の倍数のときだけ多バイトな文字列の例.
"123456789"
424:デフォルトの名無しさん
10/02/27 21:39:22
それスゲー迷惑だけどオッサンが漢字キーを駆使しながら頑張って作ったものだと想像するに少し許せる
正規表現置換とかだったら死刑
425:デフォルトの名無しさん
10/02/27 23:14:54
文字コードって訳わかんない
ひとつに絞って他のコードは国際法で規制しろよ
426:デフォルトの名無しさん
10/02/27 23:43:28
>>425
トロンコード最強ってことで。くっくっく。
427:デフォルトの名無しさん
10/02/28 00:29:23
>>415
isalpha()に「0〜UCHAR_MAX または EOF 以外の値」が渡された時の動作は未定義
ということはわかっているのかね。きじねこは不可解な動作やらクラッシュという表現をしてるが
例えばstrにSJIS全角文字「A」(コード0x8260)を含んでいたとして(str="Aabc123"とか)
forループ内でisaplha()に、0x82、0x60と渡されていくことになるが、
例えばcharが符号付きでint型が32ビットの処理系だと0x82→0xffffff82と
符号拡張で変換されるから「0〜UCHAR_MAX または EOF 以外の値」となって未定義となる
unsigned charにキャストしとけば「0〜UCHAR_MAX または EOF」には納まる
このきじねこの記事雑だな
constや*忘れてる
428:415
10/02/28 00:34:56
>>422
>>423
>>427
解説ありがとうございます。
そう言った意味なんですね。
429:デフォルトの名無しさん
10/02/28 18:15:24
hoge *p = new hoge;
my::smp q(new hoge); // ok
my::smp r(p); // no!
上の初期化法だけを許可したいんだけど、方法はある?
つまりテンポラリなポインタだけを受け取れるような方法
C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・
今ではまだメタプログラミングを駆使しても不可能かな?
430:デフォルトの名無しさん
10/02/28 18:20:41
無理。my::smpのコンストラクタ内でnew hogeを実行するようにすれば近いことはできるんじゃない?
引数付きのコンストラクタも考えると現実的でないが
431:デフォルトの名無しさん
10/02/28 19:01:30
>>430
thx
コピーコストが気になるけどその方向で考えてみますわ
432:デフォルトの名無しさん
10/02/28 21:10:12
boostにそんなのがあった気が
433:デフォルトの名無しさん
10/02/28 23:34:24
テンプレートクラスについてお聞きします。
テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね?
もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか?
たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、
関数の実装をヘッダファイルに書かず、
テンプレートパラメータがtrueのときの処理と、falseのときの処理を
それぞれcppファイル側に書いてもいいものでしょうか?
(そのようなクラス設計がいいかどうかは別として・・・)
434:デフォルトの名無しさん
10/02/28 23:36:04
>>433
まずいだろう
他のファイルからもそのヘッダファイルを参照していたらどうなる?
435:デフォルトの名無しさん
10/02/28 23:50:58
>>433
いいよ
template<bool A>
struct X
{
void f() {}
};
template<>
struct X<true>
{
void f();
};
とヘッダーに書いて
void X<true>::f(){}
を別のコンパイル単位に書くのはOK。
bool が typename でも同じ
436:デフォルトの名無しさん
10/02/28 23:51:44
クラス設計に関して質問です。
Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。
実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか?
オブジェクト指向がよくわかっていなくて・・・
437:デフォルトの名無しさん
10/02/28 23:59:35
// ヘッダファイル
template<bool B>
struct hoge
{
hoge();
};
// ソースファイル
template<>
hoge<true>::hoge() {}
template<>
hoge<false>::hoge() {}
これで問題ないね
438:433
10/03/01 00:18:10
>>435
>>437
ありがとうございました!
439:デフォルトの名無しさん
10/03/01 00:45:56
>>436
WaveIO obj = new WaveIO(filePath);
Player obj2 = new Player();
obj2.Play(obj);
とかってなるんでないの
440:デフォルトの名無しさん
10/03/01 02:23:03
マルチスレッドキューありますか。
自作しようして無理だった。
441:デフォルトの名無しさん
10/03/01 05:44:38
>>432
make_sharedだな。TR1にもC++0xにもある。
>>440
Intel TBBになんかあったはず。
442:デフォルトの名無しさん
10/03/03 00:34:04
クラスのメンバ関数とそのconst関数の共通化をしようとして失敗しています。
以下のコードでは [ ]演算子のオーバーロードがその例です。
どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか?
URLリンク(codepad.org)
443:デフォルトの名無しさん
10/03/03 00:56:27
高校1年の春、2年生に進級する直前のできごとでした。
僕は難関、最初の壁と名高いポインタにぶつかりました。
ポインタ・・・彼は僕を苦しめました
存在が意味不明でした。
『本当に必要なのか?
いつ、使うの?君はなんなんだい?』
僕は寝ることをやめて飲まず食わず
1週間、ずっとポインタを見つめた結果
理解できませんでした・・
そのときの挫折はまさに、絶望でした。
自分の理解力の無さと頭の悪さに怒りを覚え
その怒りはそのうちに悲しみにかわり
僕は1ヶ月、眠れませんでした。
444:デフォルトの名無しさん
10/03/03 01:11:16
>>442
× return const_cast<double&>( static_cast<const Test>(*this)[pos] );
○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );
445:デフォルトの名無しさん
10/03/03 01:14:32
そんな僕がまたプログラマ目指そうと思ったのですが
どう思います?
446:デフォルトの名無しさん
10/03/03 01:17:12
>>445
好きにすればいい。分からない事があったらここに書き込めば俺は答える。
447:デフォルトの名無しさん
10/03/03 02:35:19
>>444
ありがとうございます。
<間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] );
は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、
その生成されたオブジェクトに [pos] でアクセスしている。
だから、実際には *this の中身にアクセスできていない。
という解釈で良いでしょうか?
448:デフォルトの名無しさん
10/03/03 02:38:14
>>442
こういうのも
return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );
449:デフォルトの名無しさん
10/03/03 02:41:27
>>447 そういうこと。
450:442
10/03/03 04:18:56
>>448
>>449
ありがとうございます!
451:デフォルトの名無しさん
10/03/03 07:50:18
ツリーのクラス構造について質問です。
現在、以下のようなクラスを考えています。
class Base{}
class ParentBase : public Base { };
class Parent : public ParentBase { };
class ChildBase : public Base { };
class Child : public ChildBase { };
class ChildA : public Child {}
class ChildB : public Child {}
class ParentA : public Parent
{
public:
ChildA childa;
ChildB childb;
};
class ParentB : public Parent
{
public:
ParentA parenta;
};
Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B)
ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか?
やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。
一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。
何かいい方法はないでしょうか?
452:デフォルトの名無しさん
10/03/03 11:04:37
ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある
453:デフォルトの名無しさん
10/03/03 11:15:38
>>451
コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、
いろいろあるだろ。何が気に入らないんだ?
454:デフォルトの名無しさん
10/03/03 11:27:28
struct hoge: public unary_function<int,int> {
int operator(int);
};
的な関数オブジェクトを
g++ -Weffc++ hoge.cpp
でコンパイルした場合、
warning: base class struct std::unary_function<int, int> has a non-virtual destructor
というエラーがどうしても出るのですが、
ライブラリの責任であってユーザ側からは対応しようがない、
というので正しいでしょうか?
455:デフォルトの名無しさん
10/03/03 11:41:08
protected継承
456:デフォルトの名無しさん
10/03/03 11:43:09
>>454 URLリンク(ja.lmgtfy.com)
457:デフォルトの名無しさん
10/03/03 12:35:06
>>456
要するにGCCがそうだと言ってるからそうだ、ということですね。
これに対するライブラリ実装者の答えが欲しいのですが・・・。
458:デフォルトの名無しさん
10/03/03 12:38:09
>>457 どうしてそうなったw
459:デフォルトの名無しさん
10/03/03 12:42:54
>>457
>456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、
その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?
460:デフォルトの名無しさん
10/03/03 12:46:39
そう読むのか。
コメントのほうを読んで誤解してしまいました・・・。
ありがとうございます。
461:デフォルトの名無しさん
10/03/03 16:09:59
>>454 が何を問題だと言っているのか判らない。
もしかして、Effective C++ 読まずに問題視してる?
462:デフォルトの名無しさん
10/03/03 22:27:54
調子に乗って struct を class みたいに使うのが悪いんじゃね?
463:デフォルトの名無しさん
10/03/03 22:37:41
どうせポリモルに扱わないんだからほっとけよ
464:デフォルトの名無しさん
10/03/03 22:37:41
>>454
どこに「エラー」って書いてあるんだよ
もしかしてエラーと警告を混同してるか?
465:デフォルトの名無しさん
10/03/03 23:00:41
C++のキャストって長ったらしくてあまり使わないんですが,
実際C++のキャストで助かった&Cのキャストではまった
経験をお持ちの方っていますか?
466:デフォルトの名無しさん
10/03/03 23:08:51
C++スタイルはデバッグで見つけやすい
467:デフォルトの名無しさん
10/03/03 23:18:38
>>465
キャストは奨励できないからC++のキャストは長い。
キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。
あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。
468:デフォルトの名無しさん
10/03/03 23:20:00
long longな値をstd::fstreamに<<すると三桁区切りにcommaが入ってPCが爆発するんだけど
書式設定だとか弄ってcomma入れないような設定できなかったっけ?
469:デフォルトの名無しさん
10/03/03 23:50:17
>>465
意図しない、または、意図した以上のキャストをコンパイル時に発見できる
470:デフォルトの名無しさん
10/03/03 23:59:55
>>468
localeとfacet
thousands_sep()が返す値を確認するとよい
471:デフォルトの名無しさん
10/03/04 00:28:37
C++スタイルのキャストでコンパイルエラーがでる度に助かっているわけだ
472:デフォルトの名無しさん
10/03/04 00:44:21
>465
検索が簡単。
473:デフォルトの名無しさん
10/03/04 05:25:49
分かってても、警告がうざい&タイプが面倒だから、使ってしまう(int)キャスト
474:デフォルトの名無しさん
10/03/04 06:50:49
>>473 しね
475:デフォルトの名無しさん
10/03/04 07:30:55
dynamic_castの機能はCスタイルのキャストでは実現できない
476:デフォルトの名無しさん
10/03/04 08:12:19
キャストの多さは設計の不十分さを示す良い指標
477:デフォルトの名無しさん
10/03/04 10:50:11
dynamic_castはゆとり
const_castはバグ
478:デフォルトの名無しさん
10/03/04 12:20:32
stdの特殊化が許されてるのはswapだけですか?
479:デフォルトの名無しさん
10/03/04 13:28:12
ていうかstatic_castも暗黙的な変換ができないポインタ変換に対して使えちゃうだろ。
static_castは甘え
480:デフォルトの名無しさん
10/03/04 13:33:06
dynamic_castを使う設計てどっかミスってるはず
ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ
481:デフォルトの名無しさん
10/03/04 13:35:39
いやdynamic_castでいいだろw
482:デフォルトの名無しさん
10/03/04 13:37:38
>>481
アップキャストした後にダウンキャストとかポリモーですらないじゃん
483:デフォルトの名無しさん
10/03/04 13:40:39
クロスキャストなんてboostにそれ専用のがあるだろ?
484:デフォルトの名無しさん
10/03/04 13:43:24
>>483
うるせーテーブル作らせろ
いやまじでダウンキャストとか使う場面なくね?
面倒だからやっちゃえとかならわかるんだが
485:デフォルトの名無しさん
10/03/04 13:54:06
同意
内部でdynamic_cast使ってるboostとか糞だよな
486:デフォルトの名無しさん
10/03/04 14:14:02
RTTI嫌ってるやつって厨二病みたいなもんだろ?
487:デフォルトの名無しさん
10/03/04 14:32:25
RTTIは遅くなるっていうけど、実際影響がどんなもんか分からん
488:デフォルトの名無しさん
10/03/04 14:39:26
RTTIで起きる速度低下の影響は自前で仮想関数テーブルを用意する場合と同じ。
489:デフォルトの名無しさん
10/03/04 14:41:41
見栄の問題なのか?w
490:デフォルトの名無しさん
10/03/04 15:06:56
>>489
見栄だよ
型名保持してポインタを型変換するだけだし
でも使ってない
491:デフォルトの名無しさん
10/03/04 16:48:51
C++ってゲームプログラミングに使える?
492:デフォルトの名無しさん
10/03/04 16:56:09
>>491
DirectX使えば、いろいろ綺麗に作れるぞ。
493:デフォルトの名無しさん
10/03/04 18:18:44
>>492
取り合えず勉強してみます
ありがとう!
494:デフォルトの名無しさん
10/03/04 20:14:40
キャストは結局のところ「正しくないかもしれないけど見逃してくれ」とコンパイラに指示している。
キャストが正しいことをプログラマーが保証しなければならない。
dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。
どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。
暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。
わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。
495:デフォルトの名無しさん
10/03/04 20:22:37
プログラムが正しいかどうかをコンパイラに丸投げする考えのほうがよっぽど危険だよ
第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ
できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは
できることとしていいことの分別がつく人しか C++ を使うべきではないということだ
496:デフォルトの名無しさん
10/03/04 20:31:50
キャストは影響を局所化してさらに見えないように包めばいいじゃない
497:デフォルトの名無しさん
10/03/04 20:35:09
>>487
1万回ループさせて0.1秒差とかそんなもん
>>494
NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん
そんなの参照と例外に狂ってるやつくらいだろ
498:デフォルトの名無しさん
10/03/04 20:37:50
暗黙の型変換でプログラムが堅牢になると聞いて
499:デフォルトの名無しさん
10/03/04 20:37:59
たった10000回で100msも差がでるのか。
100000000回で10msくらいでもまだ遅いのに
500:デフォルトの名無しさん
10/03/04 20:42:30
>>499
そんな見栄を張るなよw
501:デフォルトの名無しさん
10/03/04 20:43:44
>>478
swap以外もすべて明示的特殊化してよい。
502:デフォルトの名無しさん
10/03/04 20:45:32
暗黙の型変換で堅牢
ハハッ
503:デフォルトの名無しさん
10/03/04 20:45:45
>>500
ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。
もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。
504:デフォルトの名無しさん
10/03/04 21:04:38
>>503
自衛隊がお断りだ
505:デフォルトの名無しさん
10/03/04 21:19:52
>>504
もうニート生活はやだよ・・・
506:デフォルトの名無しさん
10/03/04 23:01:18
普通にstatic_castしか使わない = Cのキャストでおk
static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
507:デフォルトの名無しさん
10/03/04 23:06:17
>>506
> static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
いや、わからない人用にあるわけじゃないんだけど。
508:デフォルトの名無しさん
10/03/04 23:09:06
>>506
どんなに経験積んだって人間は間違えるから予防が必要なんだよ
509:デフォルトの名無しさん
10/03/04 23:14:27
構文が悪い
static_cast<int>(var)と(int)varじゃ
後者を使いたくなるのもわかる
510:デフォルトの名無しさん
10/03/04 23:15:31
>>506
よくないよ。
static_cast 継承関係に無い型をキャストしようとエラーになる
Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。
511:デフォルトの名無しさん
10/03/05 00:31:20
インディアン 嘘つかない
512:デフォルトの名無しさん
10/03/05 00:46:24
Cスタイルのキャストを残したビャーネが悪い
513:デフォルトの名無しさん
10/03/05 01:00:33
残すも何も互換性だから
514:デフォルトの名無しさん
10/03/05 01:04:56
じゃあ完全互換じゃなくしたビャーネはもっと悪い
515:デフォルトの名無しさん
10/03/05 01:07:44
CとC++って完全互換じゃないの?
extern C/C++ とかでなんとかなると思ってたんだけど
だれか反例教えちくり
516:デフォルトの名無しさん
10/03/05 01:13:04
100%の互換となることを目標としたことは一度もない、とプログラミング言語C++に書かれているよ
517:デフォルトの名無しさん
10/03/05 01:26:17
そうなのか,買って呼んでみるよ
518:デフォルトの名無しさん
10/03/05 01:28:12
>>515
URLリンク(www.google.co.jp)
URLリンク(www.google.co.jp)
519:デフォルトの名無しさん
10/03/05 01:30:15
int class;
この時点から 100% じゃないしな
520:デフォルトの名無しさん
10/03/05 01:31:10
>>515
変数名に new とか関数名に delete とか、余裕で死ねる。
521:デフォルトの名無しさん
10/03/05 01:31:25
C89 でもちょこちょこ違うのに、C99 で決定的になったからな<非互換性。
ああ、すべての言語に複合リテラルがあればいいのに。
522:デフォルトの名無しさん
10/03/05 01:47:46
>>521
残念ながら C++ は C89 ではなく K&R C から派生した言語なので
C++ が C89 に対して互換性がないのではなく、
C89 が C++ に対して互換性がないんだよ
C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で
extern "C" などの後付け設定がこの原則の例外
523:デフォルトの名無しさん
10/03/05 01:50:13
>>522
> 残念ながら C++ は C89 ではなく K&R C から派生した言語なので
はつみみです
ソースある?
524:デフォルトの名無しさん
10/03/05 01:51:49
D&Eでございます。
525:デフォルトの名無しさん
10/03/05 02:05:31
それ、禿一人で作ってたころのはなしじゃねーの?
少なくとも ISO C++ が参照してる C は ISO C だし。
526:デフォルトの名無しさん
10/03/05 02:07:38
どのクラスからも呼び出すことの出来る変数はどのように宣言するのでしょうか?
staticやexternがあるみたいですが
いかんせんエラーが出ます。どうか教えてください
527:デフォルトの名無しさん
10/03/05 02:08:00
>>522
C++ の設計が K&R C から始まったとして、どうしてそれが
標準 C++ と標準 C との互換性の主従に関係するの?
528:デフォルトの名無しさん
10/03/05 02:08:44
>>526 ソースとエラーメッセージうp 長いなら >>6 へ
529:デフォルトの名無しさん
10/03/05 02:15:54
>>528
長いんで省略した形で記述します。
たとえば
==================================
//○×.h
class Cabc : public **
{
省略
public:
//ここでグローバル変数を記述したい
static CString str;
//省略
}
/////////////////////////////////////
○X.cpp
//省略
str = _T("a");
//省略
/////////////////////////////////////
このstrの値を他のクラスで使いたい場合
CString buf;
buf = Cabc::str ;
のようにしてもダメなんでしょうか?
わかりにくくてごめんなさい
なにぶん初心者ですのでよろしくおねがいします
530:デフォルトの名無しさん
10/03/05 02:17:13
>>527
公式に「主従」なんかないだろう
俺は事の経緯から導かれる道義的な関係を指摘したまで
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5400日前に更新/218 KB
担当:undef