C++相談室 part52

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>1-15 付近参照

前スレ
C++相談室 part51
http://pc8.2ch.net/test/read.cgi/tech/1153079297/
2デフォルトの名無しさん:2006/08/26(土) 02:08:45
3デフォルトの名無しさん:2006/08/26(土) 02:09:26
4デフォルトの名無しさん:2006/08/26(土) 02:09:59
5デフォルトの名無しさん:2006/08/26(土) 02:10:30
6デフォルトの名無しさん:2006/08/26(土) 02:11:01
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映しない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
7デフォルトの名無しさん:2006/08/26(土) 02:11:48
8デフォルトの名無しさん:2006/08/26(土) 02:14:17
9デフォルトの名無しさん:2006/08/26(土) 02:14:49
10デフォルトの名無しさん:2006/08/26(土) 02:15:22
■関連スレ■
多すぎ。とりあえずスレタイ C++ で検索して。
以下、スレタイで見つからなさそうな関連スレ。

Boostを語れゴラァ part2
http://pc8.2ch.net/test/read.cgi/tech/1139313234/
GCCについて part7
http://pc8.2ch.net/test/read.cgi/tech/1145357824/
11v(^・^)v:2006/08/26(土) 02:17:00
テンプレ終了。例のやつは、もう飽きたんで好きな人は勝手にやって。

過去スレ一覧、 2ch のアドレス貼っても HTML 化されるわけじゃないし、
そろそろ考え直したほうがいいかも。
12デフォルトの名無しさん:2006/08/26(土) 02:21:13
>>11
激しく乙。
過去スレのリンクは、datを探してる人(いるのか?)には有益だから、そのままでもいいと思うよ。
あるいは、テンプレサイトか。
13デフォルトの名無しさん:2006/08/26(土) 02:31:37
>>996
お前は無知そうだし答えなくていいよ
14デフォルトの名無しさん:2006/08/26(土) 02:34:03
まだ続けるつもりなのか。。。
15デフォルトの名無しさん:2006/08/26(土) 02:34:53
そうだ。話は終わっている。誰も答えなくていいよ。
16デフォルトの名無しさん:2006/08/26(土) 02:36:38
糞スレ化が進んでいます
17デフォルトの名無しさん:2006/08/26(土) 02:38:49
C/C++には、言語的なオーバーフロー検地方法が無いので、次のいずれかの方法を取ります。
1. オーバーフローしないサイズの型を選択する
2. 計算前にチェックする
3. 計算後にチェックする
4. クラスを作ったりする。

F.A.
18デフォルトの名無しさん:2006/08/26(土) 02:46:03
どれも微妙だ。。4.は何を作るか次第だけど難しそう。
19デフォルトの名無しさん:2006/08/26(土) 02:52:18
だからケースバイケースなんですよ。
20デフォルトの名無しさん:2006/08/26(土) 03:04:06
>>18
例えばNumricクラスを作って四則演算を演算子オーバーロードして、
オーバーフロー時に例外をthrowするようにするとか。これだと簡単でしょ。
でも普通は1.だと思うけど。
21デフォルトの名無しさん:2006/08/26(土) 03:15:23
まあそんな感じにはなるんだろうけど汎用的なものが作れるなら
既にboostとかにありそうな気も。あと基本型のみのoperatorは
できないような。。片方はクラスに入れてとか?
22デフォルトの名無しさん:2006/08/26(土) 03:20:02
いえいえ、オーバーフローする危険性のある変数は、全てNumeric型のインスタンスに
するという意味です。
23デフォルトの名無しさん:2006/08/26(土) 03:23:49
てか、マジでそのレベルの回答を求めてたのか。。。
24デフォルトの名無しさん:2006/08/26(土) 03:28:40
全ての整数型をNumeric型にするのはパフォーマンス的にも作業的にも
現実的じゃなさそうですし、オーバーフローしそうな箇所のみを特定して
おいてNumeric型にするというのがやはり妥当なんですかねえ。。
25デフォルトの名無しさん:2006/08/26(土) 03:39:50
まあそんな感じでめんどくさくなって結局__int64にしとけばいいやって
なって脆弱なプログラムができあがるわけだ
26デフォルトの名無しさん:2006/08/26(土) 03:43:51
メモリが許す限りの無限桁の整数を扱う基本的手法を教えてください
27デフォルトの名無しさん:2006/08/26(土) 03:52:40
なんで急にあげ。。
BigIntで検索しよう。がんばって作るんだよ。
28デフォルトの名無しさん:2006/08/26(土) 03:54:30
>>26
多倍長整数を扱うライブラリを拾ってくる。
29デフォルトの名無しさん:2006/08/26(土) 04:03:27
質問させてください、

今DLLを作っているのですが、例えば文字列を
char *ではなくstring でやりとりするような関数をDLLで作ったとき、
1.そのDLLを利用するアプリケーション側 と
2.DLL側 とで
開発環境が異なっていてstringの実装詳細が違っていたりしたら
実行時エラーとかが起こってしまうのでしょうか?

ご回答よろしくお願いします。
30デフォルトの名無しさん:2006/08/26(土) 04:10:48
>>29
stringが規格に則って正しく実装されているなら、
実装の詳細は関係ない。
3129:2006/08/26(土) 04:20:46
>>30
ありがとうございました。
32デフォルトの名無しさん:2006/08/26(土) 04:25:16
>>29
起こってしまいます。

>>30
DLL とのインターフェースではバイナリ互換性が要求される。
規格にバイナリ互換性についての規定は無い。

class string { size_t n; char* p; ... };
class string { char* p; size_t n; ... };
↑の2つの string はどちらも規格に適合した実装となり得るが、
一方の実装が使われた DLL での string を、他方の実装が使われた
プロセスで正しく操作することはできない。
3329:2006/08/26(土) 04:38:22
>>32
ありゃorz
なるほど了解です、あきらめてchar *で受け渡すようにします。
勉強になりました、ありがとうございました。
34デフォルトの名無しさん:2006/08/26(土) 05:09:35
VC++7でdynamic_castで基底クラスへのポインタを派生クラスのポインタに変換しようとすると
変換できない場合NULLが返るということらしいのですが、そうならなくて、代わりにaccess violationが発生します
なぜですか?
35デフォルトの名無しさん:2006/08/26(土) 05:31:08
>>34
自分はその症状に遭遇したことないけどこんなの発見した、
ttp://www.s34.co.jp/cpptechdoc/article/newcast/index.html
(抜粋)dynamic_castが適用できるのはポリモルフィック・クラス、
    すなわち少なくとも一つのメンバ関数が仮想関数でなくてはなりません。

そして多分この場合bad_cast例外が投げられてるんじゃないかと
36デフォルトの名無しさん:2006/08/26(土) 05:42:24
>>34
問題が再現する最小のソースを作ってみよう。
37デフォルトの名無しさん:2006/08/26(土) 08:48:17
>>34
RTTIを使用するためのコンパイラオプションを設定していないのではないか?
VC++ 7ではそれを指定しないとRTTIが使えなかった気がする。

>>24
世の中それでパフォーマンスが問題になるほど最適化があほなC++コンパイラばかりでもないぞ。
まあ作業時の方が問題だというのはそうだろうな。
3826:2006/08/26(土) 08:50:46
>>27-28
ありがとうございました^^
39デフォルトの名無しさん:2006/08/26(土) 11:18:32
>>25
C++でオーバーフローチェックしてるプログラムなどほとんどない。
40デフォルトの名無しさん:2006/08/26(土) 14:15:32
>>39
そりゃあらかじめ要素の範囲が解ってる設計してるからじゃないのか?
41デフォルトの名無しさん:2006/08/26(土) 14:42:24
そういえばBASICって変数の型を指定していなかった場合、
処理の途中で現在の型の範囲を超える値になった時に
その変数の型をより大きな範囲を表現できる型に自動で変更してくれる。
4234:2006/08/26(土) 14:47:21
>>35-37
レスありがとうございます。

コンパイラオプションが必要ということはまったく知りませんでした。
ためしに同じソースを家のVC++7だとコンパイルできた。
プロパティーの「言語」の「ランタイム型情報を有効にする」は「いいえ」になっています。
会社のとバージョンが違うのかな。。
もっと調査してみます。


>>35
bad_cast例外ってC++の例外ですよね?Win32例外でしたので。
43デフォルトの名無しさん:2006/08/26(土) 19:47:52
>>42
コンパイルは通るよ。
実行時にエラーが出るけど。
44デフォルトの名無しさん:2006/08/27(日) 02:42:56
STLも質問していいですか?
vectorとかのbegin()は、もし要素がない場合nposを返すのですか?
それとも要素がない場合を判定するにはend()と比較するのですか?
nposと書いたらコンパイルエラーになったもので。
45デフォルトの名無しさん:2006/08/27(日) 02:45:51
>>44 end() と比較する。
46デフォルトの名無しさん:2006/08/27(日) 02:58:39
そうなんですか。サンクス
47デフォルトの名無しさん:2006/08/27(日) 03:03:40
empty()で最初に調べる手もあるよ。
48デフォルトの名無しさん:2006/08/27(日) 03:30:20
>>44
vec.size()<1
ループなら 
for(int i=0; i<vec.size(); i++){
でOK
文字列std::stringならempty()
49デフォルトの名無しさん:2006/08/27(日) 03:31:28
>>48
イテレータ使えよ…
50デフォルトの名無しさん:2006/08/27(日) 03:40:45
iteratorって長いんだよね…
Dのautoみたいなのがあればいいんだけど。
51デフォルトの名無しさん:2006/08/27(日) 03:47:21
>>48 vector でも empty() だよ。
52デフォルトの名無しさん:2006/08/27(日) 03:54:45
>>50
次の標準で入ります。
53デフォルトの名無しさん:2006/08/27(日) 04:42:56
何故empty()がvectorにも用意されているか考えましょう。
#つーか、EffectiveSTLは必読書だと思う。
54デフォルトの名無しさん:2006/08/27(日) 06:23:44
vectorだろうがstringだろうが、全部ではないにしても
共通のインターフェースで処理を行うことが出来るのが利点の一つだよな。
初心者向けのAccelerated C++にさえ載っている。
55デフォルトの名無しさん:2006/08/27(日) 08:38:07
containerはempty()必須です。
stringはcontainerじゃないが。
56デフォルトの名無しさん:2006/08/27(日) 11:02:15
stringをコンテナと考えても差し支えない気もする。違うけど。
57デフォルトの名無しさん:2006/08/27(日) 11:13:13
stringは確かにchar型のコンテナだな。文字列の結合・部分的取り出し・
置き換え・挿入などが頻繁に行われるので、いろんなメンバ関数を
持ってる所が他のコンテナと違うけどな。
58デフォルトの名無しさん:2006/08/27(日) 11:25:42
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。


C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

スマン・・・どうしても・・・
59デフォルトの名無しさん:2006/08/27(日) 11:52:49
>>58
いいんだ。
俺もそれをいつ入れようかと思っている間にスレ番があっという間に
進んでしまい、躊躇していた。
60デフォルトの名無しさん:2006/08/27(日) 12:27:14
>>58
> すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
STL使うのにスタティックリンクかダイナミックリンクで違いが?
61デフォルトの名無しさん:2006/08/27(日) 12:29:57
違うコンパイラ・リンカもあるってことだろ
62デフォルトの名無しさん:2006/08/27(日) 12:34:07
例のヒトの予感
63デフォルトの名無しさん:2006/08/27(日) 12:36:54
検索したらhaskellスレにもあるし
http://pc8.2ch.net/test/read.cgi/tech/1149263630/556
64デフォルトの名無しさん:2006/08/27(日) 13:28:47
ぶっちゃけ経緯の分からんやりとりの一部載せられても
粘着にしか見えね
65デフォルトの名無しさん:2006/08/27(日) 14:15:16
同じ議論の繰り返しが予想されるから晒してるだけじゃね。
66デフォルトの名無しさん:2006/08/27(日) 15:39:46
こういうのが職場にいるとやる気下がるな
67デフォルトの名無しさん:2006/08/27(日) 17:15:56
魔よけの御札みたいなもんだろ。
むしろ変なものを呼んでるけど。
68デフォルトの名無しさん:2006/08/27(日) 19:36:40
燃料か釣りかありがたい壷にしかみえない
69デフォルトの名無しさん:2006/08/27(日) 19:50:43
>>55-56
21.3.2 にこんなん書いてあるよ。
"The class template basic_string conforms to the requirements of a Sequence, as specified in (23.1.1).
Additionally, because the iterators supported by basic_string are random access iterators (24.1.5),
basic_string conforms to the the requirements of a Reversible Container, as specified in (23.1)."
70モンガー:2006/08/27(日) 21:47:56
この本読んだことある人いる?どうだった?感想を聞かせてくれろ。

『More C++ Gems』
http://www.amazon.com/gp/product/0521786185/sr=1-2/qid=1156682502/ref=pd_bbs_2/104-6793333-7903963?ie=UTF8&s=books
71デフォルトの名無しさん:2006/08/27(日) 21:58:15
継承関係になくても、
instantiateに成功すればいいってもがC++だからね。
72デフォルトの名無しさん:2006/08/27(日) 22:04:01
>>70
古い。
アジソン=ウエズレイの"The C++ In-Depth Series"で、
網羅されていて、しかも内容も新しくなっている。

古文書やD&Eを読む趣味がある人は読んでもいいと思う。
いまだにPDFになってないオリジナルの著名論文も読めるし。
73モンガー:2006/08/27(日) 22:57:22
>>72
ありがとう。とても参考になる。
74デフォルトの名無しさん:2006/08/28(月) 12:30:11
JavaにClosureが導入されるかも〜という話を聞いて、もう、C++でいいだろとか思ったぜ
むしろ、C++からJVMのバイトコードし、Javaのクラスライブラリが
C++からも利用できれば、C++最強じゃね?とか妄想したり。
75デフォルトの名無しさん:2006/08/28(月) 18:58:59
ostringstreamってバッファはどうなってるんだろう。
<<で、連結していくと、どっかでバッファ拡張するようにな仕組みなんかな。
なんとなく重い気がする。JavaでいうStringBuilderみたいなの作った方がよいのかな。
76デフォルトの名無しさん:2006/08/28(月) 19:13:14
それ、昔俺も調べたけどわからなくて
結局<<を諦めてstring+reserveでお茶を濁した覚えがある。
77デフォルトの名無しさん:2006/08/28(月) 19:59:05
>>75-76
その辺は、basic_stringbuf が管理してる。
overflow が呼び出されたときに、必要に応じて拡張される。
http://www.io.nara-su.ac.jp/kanrishitsu/manual/FSUNf90/LANG/japanese/C++/stdlib/stdref/bas_3672.htm

ちなみに、VC7.1 付属の stringbuf だと、もとの1.5倍程度になるらしい。
78デフォルトの名無しさん:2006/08/28(月) 19:59:54
以前、tietewがcppllに文字列の連結をstringとして評価されるまで遅延して
領域の確保を一度で済ませるようなコードをポストしていた気がする。
79デフォルトの名無しさん:2006/08/28(月) 23:25:51
自作クラスのoperator=()で、メンバ変数を全てコピーしたいのですが、

void operator = (const T& t) {
a = t.a;
b = t.b;
}

のように1つひとつコピーだと、メンバ変数が増えたときにコード量が多くなってしまいます。
thisを使って一気にコピーしたいのですが、

void operator = (const T& t ) {
*this = t;
}

のように書くと無限ループに陥ってしまいます;
どのように記述すればよいでしょうか?

あと、
T a, b, c;
a = b = c;
のように記述したいときは、
T& operator = ( const T& t )
{
......
return *this
}

でいいですか?
80デフォルトの名無しさん:2006/08/28(月) 23:28:57
>>79
そりゃ自分で自分自身を呼び出せば無限ループになるだろう。
基本的にはメンバ毎にコピーするしかない。
81デフォルトの名無しさん:2006/08/28(月) 23:34:39
>>79
メンバ変数を代入するだけなら暗黙に定義されるoperator=で十分じゃね。
82デフォルトの名無しさん:2006/08/28(月) 23:42:23
operatorのオーバーロードで()演算子をオーバーロードした関数オブジェクトってものが出てきたんですが、
これって何に使うんですか?
メンバ関数にhoge()って一つ用意するよりずっと便利な使い方とかあるんでしょうか
83デフォルトの名無しさん:2006/08/28(月) 23:43:12
下手だなあ>>79君は・・・
データのまとめ方が圧倒的に下手・・・!

class mydata
{
public:
int a,b;
};
mydata data;
void operator = (const T& t ) {
data = t.data;
}
これで万事解決・・・!
84デフォルトの名無しさん:2006/08/28(月) 23:46:31
すげえシュールだ。感動した。
85デフォルトの名無しさん:2006/08/28(月) 23:46:54
>>79
全メンバを普通にコピーするだけならデフォルトの方が良い
メンバが増えるたびに書き直す必要がなくなるし、コンパイラの最適化も効く
86デフォルトの名無しさん:2006/08/28(月) 23:47:40
>>82
関数オブジェクト(Functor)のありがたさを本当に実感するには、
STLのコンテナにアルゴリズムを適用させるようになってからだろう。
8779:2006/08/28(月) 23:48:29
>>80-83
ありがとうございます。
無知なもので、operator=が暗黙的に定義されることを知りませんでした。

やりたいことはメンバ変数の代入だけなので、それで解決しました。
88デフォルトの名無しさん:2006/08/28(月) 23:52:44
ポインタはコピーしないようにな。
8979:2006/08/28(月) 23:55:55
>>88
以前は配列にポインタを使っていたんですが、vectorに変えたので大丈夫です。
わざわざありがとうございます。
90デフォルトの名無しさん:2006/08/29(火) 00:00:55
vectorってビット毎のコピーで大丈夫なんかな?実装にもよるけど、
ヒープ領域に実体を持ってて、メンバにはポインタを含んでいそうな
気がするんだけど。
9179:2006/08/29(火) 00:03:48
>>90
vectorのoperator=で、新しくヒープに領域を確保すると思ってたんですが・・・
そう言われると不安になってきました
9279:2006/08/29(火) 00:06:07
int main()
{
myClass t;
for( ;; ) {
}
9379:2006/08/29(火) 00:07:13
すいません、>>92は間違い・・・

int main()
{
myClass t;
for( ;; ) {
myClass t2;
t=t2;
break;
}
t.show();
}

で確認したのでおそらく大丈夫かと思われます
94デフォルトの名無しさん:2006/08/29(火) 00:07:27
>>90>>91
問題ない。コンテナはデフォルトのoperator=でコピーしても
メモリリークとか二重解放しないように設計されている。
95デフォルトの名無しさん:2006/08/29(火) 00:07:50
std::stringとかのメンバーならコピーすれば内容も新しいヒープにコピーされる。
自分のクラスのメンバ変数がポインタで、そこに何かを格納している場合、
コピーを作るときは、自分でnewして、そこにポインタの指すメモリ内容を転写するんだよ。
同じものを複数のポインタが見ていて問題ない設計ならOKだが。
96デフォルトの名無しさん:2006/08/29(火) 00:13:00
メンバにPOD型でないクラスを含んでいた時は、それらはビット毎の
コピーは適用されなくて、クラスのoperator=を呼び出すんじゃね?
規格書のどこに書いてあるかは忘れたが。
97デフォルトの名無しさん:2006/08/29(火) 00:16:29
98デフォルトの名無しさん:2006/08/29(火) 00:18:05
99デフォルトの名無しさん:2006/08/29(火) 00:34:23
§12.8.13当たりだな。

13 The implicitly-defined copy assignment operator for class X performs memberwise assignment of its subobjects.
The direct base classes of X are assigned first, in the order of their declaration in the base-specifierlist,
and then the immediate nonstatic data members of X are assigned, in the order in which they were
declared in the class definition. Each subobject is assigned in the manner appropriate to its type:
? if the subobject is of class type, the copy assignment operator for the class is used (as if by explicit qualification;
that is, ignoring any possible virtual overriding functions in more derived classes);
? if the subobject is an array, each element is assigned, in the manner appropriate to the element type;
100デフォルトの名無しさん:2006/08/29(火) 00:39:51
>>95,96,99
「全部 operator= が適用される」で済む話をわざわざ複雑にするな。
101デフォルトの名無しさん:2006/08/29(火) 00:59:50
ま、端的にいうとそうなんですが。>>100

ありがとうございます。参考になりました
102デフォルトの名無しさん:2006/08/29(火) 10:32:54
class A
{
public:
void hoge() {}
private:
char buf[256];
};

A a1;
A a2 = a1;
a2 = a1;

こういうメンバ変数がPOD型だけのクラスの場合
デフォルトのコピーコンストラクタやoperator=が例外を投げることはあるのでしょうか?
103デフォルトの名無しさん:2006/08/29(火) 13:25:04
C++例外は飛ばないと思うけどね。
104デフォルトの名無しさん:2006/08/29(火) 20:03:57
参照とポインタの使い分けがいまいち分かりません
関数内で値をいじるならポインタで、見るだけなら参照だと聞いたんですが
変更する必要がないなら普通に引数として渡せばいいんじゃないですか?
105デフォルトの名無しさん:2006/08/29(火) 20:11:21
俺の使い分けはnullpoがあるならポインタ、ないなら参照(const参照も)
106デフォルトの名無しさん:2006/08/29(火) 20:15:53
>>104
その使い方は C 使いの人が好む流儀。見た目で区別がつくという利点があるが、
その流儀に従わない人もいるので信頼性が微妙。結局のところ全部参照でも問題ない。

普通に引数として渡すとコピーが必要になるので、大きなクラス(構造体)の場合に
処理効率が問題になることがある。値渡しは const 付きの参照で置き換えると
コピーを必要とせずにほぼ同じ効果を得ることが出来るので大きなクラスに限らず
よく使われる。
107104:2006/08/29(火) 20:24:19
>>105-106
ありがとうございました
特に決まった使い分け方があるというわけではないのですね
108デフォルトの名無しさん:2006/08/29(火) 20:42:45
引数の型としてポインタを要求するケース:
・内部でイテレーションしたいとき。(配列など)
・”無効な値”が渡される可能性があるとき。(所謂ぬるぽ)
・スマートポインタ/生ポインタ互換のインターフェイスを作るとき
・関数ポインタが欲しいとき
・Cとの互換性など

引数の型として値を要求するケース
・そのほうが効率がいいとき
・内部でスワップ技法を利用するとき。
・破壊的コピーなどを期待するとき。

引数の型として参照・const参照を要求するケース
・上記以外
109デフォルトの名無しさん:2006/08/29(火) 20:45:55
捕捉:
operator= の実装で、swap 技法を使うときなどは値渡しが良い。
 T operator=( T const & rhs ) { T(rhs).swap(*this); return *this; }
とやるくらいなら、
 T operator=( T rhs ) { rhs.swap(*this); return *this; }
の方が分かりやすくてGOOD
110デフォルトの名無しさん:2006/08/29(火) 20:47:19
>>107
"C++ Coding Standard"と言う本の
> 25. 値、スマートポインタ、リファレンスのパラメータを適切に使い分けよう。
を読んで。
111デフォルトの名無しさん:2006/08/29(火) 21:03:43
C++ の標準規格ってどこで入手できますか?
112デフォルトの名無しさん:2006/08/29(火) 21:04:35
>>111
ごにょごにょ
113デフォルトの名無しさん:2006/08/29(火) 21:15:07
>>111
ぬるぽ
114デフォルトの名無しさん:2006/08/29(火) 21:15:32
>>108 に追加して、
引数の型としてポインタを要求するケース:
汎用ポインタ(void*)を扱うとき。

>>111
英語版はテンプレに書いてある。日本語版は JIS X3014 で検索。
115デフォルトの名無しさん:2006/08/29(火) 21:23:25
>>109
どっちでも変わらんし、実装が宣言に漏れてるみたいで嫌だ。
116デフォルトの名無しさん:2006/08/29(火) 22:13:02
>>114
> 英語版はテンプレに書いてある。日本語版は JIS X3014 で検索。
あんと。でもな、
> [JTC1/SC22/WG21 - C++]
>  http://www.open-std.org/jtc1/sc22/wg21/
>  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
ここ見たけど、どれをダウンロードすればいいか分からんのやよー。
117デフォルトの名無しさん:2006/08/29(火) 22:16:16
>>116
n1905.pdf当たりだろ。
118デフォルトの名無しさん:2006/08/29(火) 22:30:26
>>117
ありがとー。ダウンロードできたよー。
119デフォルトの名無しさん:2006/08/29(火) 23:32:21
漏れはポインタのポインタを受け取るとき
void foo(char * & p);
などとしてしまうんだが、これって同ですか?
個人的には、見た目が好きじゃないけど、めんどくささがないから使っちゃう。
120デフォルトの名無しさん:2006/08/29(火) 23:43:58
>>119
そうですか。
121デフォルトの名無しさん:2006/08/30(水) 00:12:00
>>119
ポインタのリファレンスを使わないと、プログラム内で呼び出し元の
関数のポインタの値を変えるにはポインタのポインタが必要となり、
しかもその関数内では余計な*が常に必要となる。

ポインタのリファレンスを使えば、呼び出し元の関数と同レベルで
ポインタを扱えるようになり、頭の切り替えが必要なくなる。
122デフォルトの名無しさん:2006/08/30(水) 00:32:21
> 実装が宣言に漏れてるみたい
その表現イイ!後輩いじめにつかわしてもらうわ。
123デフォルトの名無しさん:2006/08/30(水) 00:38:42
>>121
なるほど。漏れもそういう理屈で吹っ切ることにする。
124デフォルトの名無しさん:2006/08/30(水) 01:04:13
void foo(const char* p);
void bar(char* &p);

のときに、どちらも
foo(p);
bar(p);

となるので、俺は使わない。
125デフォルトの名無しさん:2006/08/30(水) 01:25:03
>>124
それはポインタに限った話じゃないでしょ。
126デフォルトの名無しさん:2006/08/30(水) 04:01:14
基本的に、ポインタや組み込み型は参照渡しにはしない。
127デフォルトの名無しさん:2006/08/30(水) 04:03:23
>>126
そうでもない。組み込み型は値渡しがほとんどだろうけど、
ポインタはリファレンス渡しも多用される。
128デフォルトの名無しさん:2006/08/30(水) 04:19:10
な、なんだってー!(AA略
129デフォルトの名無しさん:2006/08/30(水) 05:34:23
>>127
俺は市内というだけの話。
130デフォルトの名無しさん:2006/08/30(水) 07:07:37
市外局番でおかけください
131デフォルトの名無しさん:2006/08/30(水) 08:31:40
実装が宣言に漏れてるみたいなことはしないで!
132デフォルトの名無しさん:2006/08/30(水) 08:32:24
実装とインターフェースの分離しがいがある。
133デフォルトの名無しさん:2006/08/30(水) 08:57:29
俺はC++で参照は一切使わない。
かえってややこしくならないか?
134デフォルトの名無しさん:2006/08/30(水) 08:58:41
俺はC++でポインタは一切使わない。
かえってややこしくならないか?


違うものなんだから、普通に使い分けろよ。
135デフォルトの名無しさん:2006/08/30(水) 09:18:18
その使い分けもめんどい。個人てやってる分には良いけど、
チームで開発するならルール付けもいるよね。
136デフォルトの名無しさん:2006/08/30(水) 09:34:40
>>135とは一緒に開発したくない
137デフォルトの名無しさん:2006/08/30(水) 09:40:56
ポインタの方が強い概念なのだから
参照が使えるところでは常に参照を使うべき
constと話は同じだ
138デフォルトの名無しさん:2006/08/30(水) 09:44:21
でもライブラリやAPIがポインタ使いまくりだから、ごちゃごちゃにならない?
139デフォルトの名無しさん:2006/08/30(水) 09:50:42
ごちゃごちゃになるような名前の付け方とかしてるの?
140デフォルトの名無しさん:2006/08/30(水) 10:04:00
>>138
混ざると何か困るのか?
141デフォルトの名無しさん:2006/08/30(水) 10:08:51
ライブラリやAPIがポインタ使いまくりなのはCのため。
142デフォルトの名無しさん:2006/08/30(水) 10:18:11
ポインタはイテレータ。
参照はエイリアス。
143デフォルトの名無しさん:2006/08/30(水) 10:37:59
>>138
ごちゃごちゃになるのがいやならラッパクラスを作ればいいだけっしょ。
144デフォルトの名無しさん:2006/08/30(水) 12:52:49
俺は>>104のやり方で書いてる。
foo(a);と書かれた時にaが変更されない保証がされてるほうがいいし
多くのAPIとの親和性にも優れてると思う
145デフォルトの名無しさん:2006/08/30(水) 13:39:22
"C++ Coding Standard"!"C++ Coding Standard"!"C++ Coding Standard"!
146デフォルトの名無しさん:2006/08/30(水) 20:50:48
class Hoge
{
friend class Foo; // <----
};

template<typename T>
class Foo {};


Fooをfriendにしたいのですが、これではコンパイルが通りません。
friendにしたい相手がtemplateの場合はどう書けばいいのでしょうか?
147デフォルトの名無しさん:2006/08/30(水) 20:56:46
template<typename T>
friend class Foo;
148デフォルトの名無しさん:2006/08/30(水) 21:11:05
C++なら全部参照渡しにすべき
・Javaはやってる
・ポインタ印* をなくすこと
・文字列はstd::string。Cの汚点は文字列の参照渡しができないとこ
・動的配列はvectorで作って、頑張ればnew、deleteを使わないコードができる
引数 char* c とかやると、関数内で *c とか書くんしょ、バグのもとだよ
149デフォルトの名無しさん:2006/08/30(水) 21:13:34
>>147
なるほど。ありがとうございました。
ここでもう一つ疑問なのですが、B<int>のみfriendにしたい場合はどう書くのでしょうか?

class Hoge
{
template<typename T> class B;
friend class B<int>;
};

と書いてみたのですが、この宣言自体は通るけどfriendの効果がありませんでした。
150デフォルトの名無しさん:2006/08/30(水) 22:11:19
>>148
Java -> C++という勉強順序だったのかな?
151デフォルトの名無しさん:2006/08/30(水) 22:15:39
>>149
それだと最初の宣言が Hoge::B になる。 ::B にしたければ、
class Hoge の前に、外で宣言すればいい。
152デフォルトの名無しさん:2006/08/30(水) 22:32:05
>>151
ああなるほど、そういうことだったんですか。
外に出したらコンパイル通りました。
ありがとうございました。
153デフォルトの名無しさん:2006/08/31(木) 00:10:30
>>148
ケースバイケースだなぁ。
工場メソッドとかならポインタでやったほうが楽だ。
154デフォルトの名無しさん:2006/08/31(木) 01:11:15
auto_ptr使いの漏れの立場は?
155デフォルトの名無しさん:2006/08/31(木) 03:15:44
関数に値を渡すとき、
void hoge( int a ) { ... }

hoge( int( 10 ) );

とかって渡すのと、普通に

hoge( 10 );

って渡すのでは何が違うの?
156デフォルトの名無しさん:2006/08/31(木) 03:49:20
>>155
同じ。
157デフォルトの名無しさん:2006/08/31(木) 04:58:02
>>148
全部参照にすべきというのは言い過ぎ。
ポインタの方がいいケースも多々ある。
158デフォルトの名無しさん:2006/08/31(木) 05:20:02
朝からつまらん事を言うな
159デフォルトの名無しさん:2006/08/31(木) 05:22:39
それだけを言いに来た>>158は俺の嫁
160デフォルトの名無しさん:2006/08/31(木) 12:26:39
Javaのプリミティブ型が常に値渡し、それ以外は常に参照渡し
とかよっぽど紛らわしいと思うんだが
161Lisper:2006/08/31(木) 12:28:26
それは普通のことだ。
162デフォルトの名無しさん:2006/08/31(木) 15:24:47
ぬるぽ使えないのはこまるなぁ。
163デフォルトの名無しさん:2006/08/31(木) 15:30:56
          _
      ミ ∠_)
         /
         /   \\
 ウイーン  Γ/了     | |
  ウイーン  |.@|    | | ガッガッガッ
       | / | .     人
       |/ |    <  >_Λ∩
      _/  | //. V`Д´)/ >>162
      (_フ彡           /
164デフォルトの名無しさん:2006/08/31(木) 16:20:47
大抵のぬるぽはぬるぽ相当のクラスとかぬるぽ相当の例外を定義すれば済むぬるぽ
165デフォルトの名無しさん:2006/08/31(木) 19:14:10
  ∧_∧
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ     人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/ >>164
 (_フ彡
166デフォルトの名無しさん:2006/08/31(木) 23:21:47
例外について質問です。
送出されるクラスオブジェクトの定義(クラスの定義)って
皆さんはどこに書かれてますか?

クラス(例外で用いられるものではなくて、ごく普通の目的で作るもの)を作る時は
定義をヘッダに書いて実装をcppファイルに書いたりしますが
例外用のクラスはそのヘッダファイルに一緒に書けばいいのか
あるいは単独のヘッダファイルで定義するべきなのか迷っています
167デフォルトの名無しさん:2006/08/31(木) 23:30:41
>>166
例外オブジェクトって、std::exceptionの派生とかで作るやつ?
あるクラスが固有に投げる独自の例外ならそのクラスのヘッダに書くかも
そうでなきゃ単独かな
168デフォルトの名無しさん:2006/09/01(金) 08:45:26
>>166
迷うくらいだから一緒でいいんじゃないのか?
要するに他の全く独立したクラスからは利用されない例外ってことでしょ?
169デフォルトの名無しさん:2006/09/01(金) 11:15:31
>>166
「例外用だから」っていう理由で定義場所の決め方は変えないと思うよ。
170デフォルトの名無しさん:2006/09/01(金) 11:17:19
template<typename T> class A
{
typedef std::list<T> List;
typedef std::map<int, List::iterator> Map;
};

List::iteratorにtypenameを付けないとコンパイルエラーになるのですが
List::iteratorと書いてあるところが多数あり、全てにtypenameを付けるのは冗長な気がして
できれば避けたいです。
typedef typename List::iterator ほにゃらら;
としてしまえばいいんでしょうが、List::iteratorの方がわかりやすいのでこのまま使いたいのです。
何か方法はありませんか?
171デフォルトの名無しさん:2006/09/01(金) 11:28:12
>>170
typedef typename List::iterator List_iterator; // typename がウザイんで
172デフォルトの名無しさん:2006/09/01(金) 11:32:57
>>170
そんな時はエディターの置換を使おう。
173デフォルトの名無しさん:2006/09/01(金) 11:47:20
いっそのことdefineとか
174デフォルトの名無しさん:2006/09/01(金) 11:53:20
>>173
#define でどうやったら解決できるの?
175デフォルトの名無しさん:2006/09/01(金) 11:59:38
>>171
typedefは避けたいと書いたのですが…
>>172
書くのが面倒なのではなく、見た目が長ったらしくなるのが嫌なのです。
一箇所でこいつは型だとコンパイラに教える事が出来ればいいのですが…
>>173
それは勘弁
176デフォルトの名無しさん:2006/09/01(金) 12:03:03
>>175
typename は避けたいとしか書いてないだろ。
List::iterator というのを一字一句変えるつもりが無いなら無理だ。
177デフォルトの名無しさん:2006/09/01(金) 12:04:52
>>176
ゆとり世代か?
List::iteratorのまま使いたいと書いてあるだろ。
178デフォルトの名無しさん:2006/09/01(金) 12:06:07
C++以外の言語を考えたほうがいいんじゃない?
typenameが必要な理由だって、そのcontext sensitiveな文法から来ているんだし。
179デフォルトの名無しさん:2006/09/01(金) 12:06:43
171をよーくみよう
180デフォルトの名無しさん:2006/09/01(金) 12:08:35
>>177
だから、それなら無理だっていってんじゃねーか。

typedef が嫌な理由も「List::iteratorの方がわかりやすい」としか書いてない。
で List_iterator なら大差なかろうという妥協案を出した。これが嫌だというなら
一字一句変えたくないんだろう。でもそれは無理だ。
181デフォルトの名無しさん:2006/09/01(金) 12:10:11
>>177はゆとり世代でないようだが
それなら何故こんなに馬鹿なのか
182デフォルトの名無しさん:2006/09/01(金) 12:11:46
>>171のやり方が、標準的だと思う。
標準ライブラリでも使われている。
183デフォルトの名無しさん:2006/09/01(金) 12:12:09
「List::iteratorはわかりやすいけどList_iteratorは嫌」
ってどんな我が儘だよ。後者で十分だろ。
184デフォルトの名無しさん:2006/09/01(金) 12:12:47
>>180
下手な煽りには乗らない方がいい。
185デフォルトの名無しさん:2006/09/01(金) 12:13:17
>>180
>typename は避けたいとしか書いてないだろ。
につっこんだんだ。
無理という部分には同意だ。
186デフォルトの名無しさん:2006/09/01(金) 12:13:57
そうやれば出来るのはわかってると書いてるだろうが。
187デフォルトの名無しさん:2006/09/01(金) 12:15:08
>>170への回答は「無理」ってことで次ドゾー
188デフォルトの名無しさん:2006/09/01(金) 12:20:53
無理無理無理無理カタツムリ
と言う事で落着
189デフォルトの名無しさん:2006/09/01(金) 12:45:45
>>178
C++ の文法って context sensitive なの?
190デフォルトの名無しさん:2006/09/01(金) 15:18:44
#include <iostream>

struct T1 {
T1 operator()(int x) { return T1(x); }
int operator=(int x) { return x; }
T1(int) {}
};

struct T2 {
T2(int) {}
};

int a, (*(*b)(T2))(int), c, d, e;
void f()
{
T1(a) = 3;
T2(4);

//std::cout << a << std::endl;

e = (*(*b)(T2(c)))(int(d));
}

int main()
{
f();
}
191デフォルトの名無しさん:2006/09/01(金) 15:20:53
お聞きしたい事があります。
>>190のソース(規格票の中のプログラムに若干手を加えたものです)で、
T1(a) = 3; が何をしているのかわかりますか?

そして、aを出力する行をコメント記号を外すと、"T1に適用できるoperator<<はない"
というようなエラーが出るのです。aってintなのに、どうしてこんなエラーが
出るのでしょうか?

多分T1(a) = 3; と関係があると思うのですが、一晩考えてもわかりませんでした。
よろしくお願いします。
192デフォルトの名無しさん:2006/09/01(金) 15:40:26
>>191
>T1(a) = 3;
aはT1型です。グローバルのaと違います。
193デフォルトの名無しさん:2006/09/01(金) 15:55:25
>>192
レスありがとうございます。どうしてaがT1型になるのやらさっぱり・・・・

T1(a)というのは、aを引数とするコンストラクタを呼び出して一時オブジェクト
を作って、そこに3をコピーコンストラクタで初期化しているのかと思いました
が、試しにT1(3)とやるとコンパイルエラーになります。

T1(a)の意味がわかりません。
194デフォルトの名無しさん:2006/09/01(金) 16:24:12
T1 (a) = 3; → T1 a = 3;
と解釈されてるみたいだね。
195デフォルトの名無しさん:2006/09/01(金) 16:26:09
(T1(A)) = 3;
とすると意図通りになる。
196デフォルトの名無しさん:2006/09/01(金) 16:26:50

Aは小文字にして
197デフォルトの名無しさん:2006/09/01(金) 16:30:25
>>194-196

なるほどありがとうございます。という事は 3 には特に意味がないみたいですね。
T1の中には変数もありませんし。<<でT1型のオブジェクトを表示しようにも、
T1が値を持っていませんので表示できませんね。
198デフォルトの名無しさん:2006/09/01(金) 16:38:33
>>197
> という事は 3 には特に意味がないみたいですね。

まあintじゃないとまずいけどな。
199デフォルトの名無しさん:2006/09/01(金) 16:42:29
SunのCCコンパイラで
switch文の最初のcase以降のcaseが
「エラー: この case は局所変数の初期設定を迂回しています.」
って言われるんだけど何故?

switch文って何か特別な制限があるんだっけ?
200デフォルトの名無しさん:2006/09/01(金) 16:46:22
>>198
そうですね。今まで中にメンバ変数を持たないクラスというのは
関数オブジェクト位しか作った事がなかったので、理解するのに
今回は時間が掛かりました。純粋に文法だけを追っていけば
いいわけですね。
201デフォルトの名無しさん:2006/09/01(金) 16:48:16
warningだろ?
最初のcaseでだけ局所変数の初期化をしている。

int a;
switch (〜) {
case X:
a = 1;
break;
case Y:
}
とか。
202デフォルトの名無しさん:2006/09/01(金) 17:06:08
>201
なに!そんな制限があったのか・・・。
CCではコンパイルも通らなかったよ。
素直にifる事にしました。どうもありがとうございます。
203デフォルトの名無しさん:2006/09/01(金) 19:07:35
ちょっと違うだろ。
case A:
 int n;
 ...
case B:
 ...
みたいなものならまだ良いけど
case A:
 std::string str;
 ...
case B:
だと、Bの時にstrがスコープにあるのに、コンストラクタが呼ばれない
という話のはず。
変数のスコープが、switchの外側にあるとき(>>201)は出ないと思う。
204デフォルトの名無しさん:2006/09/01(金) 19:31:04
一応対処法書いとくか

case A:
{
 std::string str;
 ...
}
case B:
 ...
205デフォルトの名無しさん:2006/09/01(金) 21:31:42
>>193
T1(3) がコンパイルエラーになるのはおかしい。コンパイラは何を使ってるの?
206デフォルトの名無しさん:2006/09/01(金) 21:38:46
>>205
BCC5.82(BDS2006の付属品)です。これ糞コンパイラでしょうか?
207デフォルトの名無しさん:2006/09/01(金) 21:44:20
>>206
糞とは言い切れないが、 T1(3) をエラーにしてるのはバグだと思われる。
ちなみにエラーメッセージは?
208デフォルトの名無しさん:2006/09/01(金) 21:50:20
>>207
ごめんなさい何か勘違いしていたようです。
今やったらエラーが出ません。
209デフォルトの名無しさん:2006/09/02(土) 04:45:07
メモリ256MBのFedora 1なんですが、
ifstreamで3GBくらいのfileがopenできません。
ifstreamで開けるサイズの上限って、どうやって決まってますか?
別にすべてを同時にメモリ上に蓄えるわけではないだろうから、
あんまメモリサイズって必要ない気もするんですが。
210デフォルトの名無しさん:2006/09/02(土) 05:07:17
streamsizeが符号付だからオーバーフローしちゃってるのかも
211デフォルトの名無しさん:2006/09/02(土) 06:39:29
生のシステムコールとstdioなら
_FILE_OFFSET_BITSを64にすれば良いけどね。

これ以上は環境依存だからスレ違い。
212デフォルトの名無しさん:2006/09/02(土) 14:20:05
>>211
_FILE_OFFSET_BITS も標準じゃないよ。
213デフォルトの名無しさん:2006/09/02(土) 14:24:21
だからこれ以上なんじゃないの?
       ~~~~~
214デフォルトの名無しさん:2006/09/02(土) 14:31:27
あーそうか
215デフォルトの名無しさん:2006/09/02(土) 14:50:08
縦書きの文章で「以上」にあたるのは何なんだろうと
ふと気になった。
216デフォルトの名無しさん:2006/09/02(土) 15:18:09
以上
217デフォルトの名無しさん:2006/09/02(土) 15:53:12
位置じゃなくて時系列だと思えばいいんだよ
218デフォルトの名無しさん:2006/09/02(土) 15:55:28
会話で以上って言う奴は
横書きの吹き出しを意識しているのか!!!
219デフォルトの名無しさん:2006/09/02(土) 22:12:14
>>218
その通りです
以上
220デフォルトの名無しさん:2006/09/02(土) 22:36:26
事項な物を並べ上げて
御覧の通りです。
って意味だろ?
221デフォルトの名無しさん:2006/09/03(日) 01:01:17
書かないと途中で切れてるかどうかわからんだろ。
2chじゃ(ry
222209:2006/09/03(日) 10:05:03
>>210-211
あざっす
223デフォルトの名無しさん:2006/09/03(日) 11:30:40
メンバー初期化リストで *this を渡すのは危険ですか? 例えば、
class A;
class B {
A& ref_;
B(A& ref) : ref_(ref) {}
};
class A {
B b;
public:
A() : b(*this) {}
};
みたいに。b に渡される *this は、A 自身の初期化が完了していない状態
で渡されてしまう?
224デフォルトの名無しさん:2006/09/03(日) 12:48:11
>>223
そうだよ。
225デフォルトの名無しさん:2006/09/03(日) 13:20:16
*thisじゃなくて、thisじゃダメなのか?
どういうケースなんだろ?
226デフォルトの名無しさん:2006/09/03(日) 13:24:18
this でも問題は同じ。
227デフォルトの名無しさん:2006/09/03(日) 13:59:43
横槍ごめんなさい。

つまり、bのコンストラクタでAのstatic以外のメンバ・関数にアクセスしたらヤバイってこと?
228デフォルトの名無しさん:2006/09/03(日) 14:08:54
>>227
じつは規格では、メンバの初期化順序まで決まっていて、
すでに初期化されているメンバにアクセスする分には問題なさそうだけどね。

クラスのメンバの初期化順序は、そのまんま、並んでいる順。
initializer listの順ではない。
ただ、それだと、メンバの宣言の位置を変えただけで挙動がおかしくなる、、
奇妙なコードが出来上がる。
229デフォルトの名無しさん:2006/09/03(日) 14:46:36
ヤバイ。宇宙ヤバイ。
純粋仮想関数呼んだりしたら、ヌルポ的ヤバさ。
230こっちも横槍だけど:2006/09/03(日) 14:47:30
>>228
へぇ、初期化順って決まってたんだ。
基底クラスが先、というの以外は不定だと思ってた…

ということはメンバ変数同士が依存してても
宣言順に気をつけてれば問題ないんだ。

グローバル変数も同一コンパイル単位内では宣言順?
231デフォルトの名無しさん:2006/09/03(日) 14:48:50
>>229
純粋仮想関数でも定義部を書けば呼んでもOKなわけだが。
232デフォルトの名無しさん:2006/09/03(日) 14:53:50
vtblの問題じゃなくて?
233デフォルトの名無しさん:2006/09/03(日) 14:58:06
>>232
嘘だと思うなら = 0 の関数に定義を外部で書いて呼び出してごらん。
234デフォルトの名無しさん:2006/09/03(日) 15:09:27
>>230
クラス内は宣言順。クラス外は不定。従って、グローバルオブジェクト同士が依存する場合は工夫が必要。
235デフォルトの名無しさん:2006/09/03(日) 15:11:19
>>230
いや、問題あるない以前に、そんなコードは書くべきではない。
236デフォルトの名無しさん:2006/09/03(日) 15:11:25
>>231,233
やめたほうがいい。

10.4.6
> Member functions can be called from a constructor (or destructor) of an abstract class; the effect of making a virtual call
> (10.3) to a pure virtual function directly or indirectly for the object being created (or destroyed) from such a constructor
> (or destructor) is undefined.
237デフォルトの名無しさん:2006/09/03(日) 15:13:06
>>235
メンバ変数同士の依存は問題ないだろ。クラス作ったやつの責任。
238デフォルトの名無しさん:2006/09/03(日) 15:21:57
>>236 に対して >>233 を合法にする提案もあるみたい。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#230
239デフォルトの名無しさん:2006/09/03(日) 15:25:58
>>237
メンバを宣言する順序を変えるだけで問題が出るコードってどうよ?
240デフォルトの名無しさん:2006/09/03(日) 15:44:07
>>239
宣言順に依存しないほうが安全なのは確かだが、それを全面的に禁止すると
依存関係のある2つのオブジェクトをクラスにまとめるというよくあるシナリオが
解決しづらくなってしまう。

理想的には、宣言順と初期化リストの順番が異なっている場合などは
エラーになってくれればいいんだけど、現状はコンパイラの警告だけが頼み。
241デフォルトの名無しさん:2006/09/03(日) 15:47:04
>>240
確かに、どうしてもやりたいというときも、たまにあるけど。
メンバや継承のときの、初期化の順序が、
規格できっちりきまっているというのも、
そういう理由があることなのかな。
242デフォルトの名無しさん:2006/09/03(日) 15:48:00
>>236
ああコンストラクタやデストラクタから呼ぶって話だろ?メンバ関数から
呼ぶのは全く問題ないよ。
243デフォルトの名無しさん:2006/09/03(日) 15:51:31
>>241
コンストラクタが複数書けるんで、コンストラクタ(初期化リスト)の都合に合わせて
初期化順を変えられるということになると、デストラクタで逆順に破棄するために
初期化順をインスタンス内に憶えておく必要があることになる。
244デフォルトの名無しさん:2006/09/03(日) 15:52:48
>>242
流れ嫁。
245223:2006/09/03(日) 18:05:10
うわー、ショッピングモールで遊んでる間にこんなにレスが。
皆様どうもありがとうございます。危険なことがわかったので、
他の方法を考えます。
246デフォルトの名無しさん:2006/09/03(日) 18:20:33
ショッピングモールwww
ワロタ
247デフォルトの名無しさん:2006/09/03(日) 18:36:36
おりしも自分自身への参照が欲しい状況に遭遇したんだけど、やっぱ駄目か。

それはそうと久しぶりにデパ地下行きたくなってきた。
248デフォルトの名無しさん:2006/09/03(日) 18:39:38
つ ポインタ
249デフォルトの名無しさん:2006/09/03(日) 22:36:47
const int HOGE_SIZE = 10;

void Func1(void)
{
  int x = HOGE_SIZE;
  ....
}

この代入は、アセンブラ レベルでは、
メモリコピー命令になりますか、それとも、定数ロード命令になりますか?
コンパイラ依存になると思いますが、一般にどうなりますか?
250デフォルトの名無しさん:2006/09/03(日) 22:39:19
>>249
定数ロードになるのが一番多いんじゃないかね。
そんな些細なことが問題になるなら C++ 使うべきじゃない。
ここで聞いた答えなんか当てにするのも間違い。コンパイラにコード吐かせて確かめろ。
251デフォルトの名無しさん:2006/09/03(日) 22:59:33
xの使い方によっては最適化で痕跡もなくなる可能性が高いが。
252デフォルトの名無しさん:2006/09/03(日) 23:10:22
>>226
thisの値自体は決定してるぞ。
ポインタをデリファレンスするのは>>228の問題があるだけで。
253デフォルトの名無しさん:2006/09/03(日) 23:11:03
>>252
渡した先でいくらでもデリファレンスされる可能性がある。
254デフォルトの名無しさん:2006/09/03(日) 23:15:20
でも
const_cast<int&>(HOGE_SIZE) = 30;
とできるわけだが、こういうコードがあった場合は、最適化しないというようなことを
コンパイラはやっているわけ?
255デフォルトの名無しさん:2006/09/03(日) 23:26:35
>>254
そのコードは鼻から悪魔が出るんじゃないのか?
256デフォルトの名無しさん:2006/09/03(日) 23:26:44
>>254
それ未定義動作だからコンパイラは面倒見なくていい。
257デフォルトの名無しさん:2006/09/03(日) 23:28:52
>>255 どういう意味だ?
>>256 そうなんかい。しらなんだ。
258デフォルトの名無しさん:2006/09/04(月) 00:20:54
bool b[100];
memset(b, 0xFF, sizeof(b));
int x = b[0];
このとき x は未定義でしょうか?
259デフォルトの名無しさん:2006/09/04(月) 00:32:18
>>258
大抵の実装で 1 が期待できるけど、保証はないだろうねぇ。
260デフォルトの名無しさん:2006/09/04(月) 00:36:46
>>259
そうですか。ありがとうございます。
261デフォルトの名無しさん:2006/09/04(月) 00:43:58
VC を使っているのですが、&& や || って、shortcut をするから、
ジャンプ命令が生成されるんだよね。たとえば、
if (x==y && y==z && z==w)
だと、2つのジャンプ命令が生成される。
そこで、これを bool の整数への昇格を利用して
if ((x==y) & (y==z) && (z==w))
のように実装したほうが、高速なコードが生成されるのだが、
こういうテクニックって一般的ですか?
262デフォルトの名無しさん:2006/09/04(月) 00:44:38
if ((x==y) & (y==z) && (z==w))

if ((x==y) & (y==z) & (z==w))
の間違い。
263デフォルトの名無しさん:2006/09/04(月) 01:02:14
>>261
一般的じゃないだろうね。使うんならコメントが無いと && に「修正」されちゃうよ。

ところで高速だというのは実験したの?
264デフォルトの名無しさん:2006/09/04(月) 01:16:15
>>262
マジレスすると、JavaやC#は & にした方が速いが、CやC++では
何とも言えない。
265デフォルトの名無しさん:2006/09/04(月) 01:24:45
>>263
ごめんなさい。速いと思ったら、3倍ぐらい遅かった。
9個の || を連結した簡単なテストコードで試してみた。
>>264
情報ありがとう。
266デフォルトの名無しさん:2006/09/04(月) 01:29:18
>>265
速度は実測が基本。
やっぱり基本は大事だな。
267デフォルトの名無しさん:2006/09/04(月) 01:30:38
コードが生成される、って言い切ってるから実験はしたんだろうけど……。
「&」と「&&」の微妙な挙動の差には注意しないとアカンよ。
268267:2006/09/04(月) 01:31:10
してへんかったんかい!('д`*)
269デフォルトの名無しさん:2006/09/04(月) 01:41:27
実測もちゃんと最適化しないとダメだし、
分岐予測の影響も考慮しないといけないし、
何で速くなるのかリスティングファイル見て調べないとな。
270デフォルトの名無しさん:2006/09/04(月) 01:54:39
C/C++の条件式は最初にfalseが(Cなら0)検出された時に抜けて
しまうので、なるべくfalseになる確率が高いと思われる条件式から
先に書くようにすると、速くなりやすい。
271デフォルトの名無しさん:2006/09/04(月) 02:07:17
件のコードは、条件を整数(1/0)に直すコードが生成されちゃうんだろう。
普通に&&で書く場合、条件を判定するだけで
その結果を整数に直して代入したりはしないから。

ただ、&だとあまり使えないけど
(x != 0) | (y != 0) を (x|y) != 0 というのは
使い物になる場合があるかもね。
もちろんこれも、コメント必須なトリッキーなやり方だから
本当にそこまでする必要がある箇所なのかは、よーく考えるべきだけど。
272デフォルトの名無しさん:2006/09/04(月) 02:07:42
ショートサーキットも、結局判断式の内容次第だな。
if(a && b && c) で、a式b式c式の間に依存関係が無いなら
if(a&b&c) はパイプラインに上手く乗っかって
判断cのコスト+a&b&cのコスト+アルファ程度で抜けるかもしれない。
だが世の中には分岐予測というものがありましてな。
273デフォルトの名無しさん:2006/09/04(月) 02:07:45
それはJavaもC#も同じはず。
274デフォルトの名無しさん:2006/09/04(月) 02:08:44
× (x != 0) || (y != 0) を (x|y) != 0
○ (x != 0) | (y != 0) を (x|y) != 0
だた。
275デフォルトの名無しさん:2006/09/04(月) 02:10:08
高速になるのであれば、
ショートサーキットしてもしなくても処理が変わらない状況なら
ショートサーキットを無視する可能性もあるのかな? 最適化で。
276デフォルトの名無しさん:2006/09/04(月) 02:18:14
VC8とかintelコンパイラみたいな最適化に異常な執着を見せる
コンパイラなら、やってくれるのかもしれないなー。
試したわけじゃないが。

そうでなくても大体の状況において、どの組み合わせが最速となるかは
コンパイラ様が知っているでFAだろう。
277デフォルトの名無しさん:2006/09/04(月) 02:20:15
まあ、「普通に書く」ことが、
コンパイラの最適化を阻害しないから、
一番いい高速化法なこともあるな。
278デフォルトの名無しさん:2006/09/04(月) 07:17:59
>>253
thisの値を保持するだけなら問題ないので>>226は間違い。
279デフォルトの名無しさん:2006/09/04(月) 07:39:11
>>278
参照を保持するだけなら問題ないので *this も this も危険性は同じ。
280デフォルトの名無しさん:2006/09/04(月) 13:44:10
質問させていただきます。
オーバフローをする部分があるのですが、
そのオーバフローは一体どのように検知すればよろしいのでしょうか?
たとえば、float型でオーバフローらしきことがおこり、
float f; のとき
if(f<0.0000001) {//オーバフロー処理}
といった感じにしたいのですが、オーバフローした場合、
やはりfloat型では検知できない?みたいなのですが、
こういう場合の対策法を教えていただけないでしょうか。
281デフォルトの名無しさん:2006/09/04(月) 13:59:36
とりあえず使っている環境が、
C99 floating point rounding and exception handling
をサポートしているかどうか調べたら?

FE_OVERFLOWとかfegetexceptflag()とかぐぐってみて。
282デフォルトの名無しさん:2006/09/04(月) 14:08:50
単純なので良いなら

最大範囲が100
最初から入ってるのが70
次に加算しようとしてるのが50なら

if 50 > 100-70
 return 警告

とか
283デフォルトの名無しさん:2006/09/04(月) 14:38:06
>>282とnumeric_limitsを使う。
284デフォルトの名無しさん:2006/09/04(月) 16:51:35
wchar_tをcharに変換するにはどうしたらいいでしょうか?
285デフォルトの名無しさん:2006/09/04(月) 18:30:11
wchar_t wc;
char c = (char)wc;
これ以外に方法はない
286デフォルトの名無しさん:2006/09/04(月) 18:49:56
287280:2006/09/04(月) 18:59:14
ありがとうございます。
結局、numeric_limitsでオーバーフロ-や丸め誤差が生じたときに
強引に戻すやり方にしました。
しかし、結局はどこでオーバーフローが生じているのか分からずじまいでした。
難しいものです。
288デフォルトの名無しさん:2006/09/04(月) 20:53:57
>>287
>しかし、結局はどこでオーバーフローが生じているのか分からずじまいでした。
デバッガで調べるとかg++なら
ttp://www.k.mei.titech.ac.jp/~stamura/NumericalComputation-Tips.html#trapFPE
とか参考になるかも
289デフォルトの名無しさん:2006/09/04(月) 23:57:13
>>287
このスレの最初の方でもオーバーフローの話し合ったよ
290デフォルトの名無しさん:2006/09/05(火) 02:54:36
>>287
処理系によっては浮動小数点例外を有効化するだけで
発生箇所でとっ捕まえられるんじゃまいか。
コプロセッサが搭載されてない環境で
floatがソフトウエアエミュレーションされてるとかでないなら、
浮動小数点演算器の設定変えるだけでOK。
大抵の例外は捕まえられるぞ。
291デフォルトの名無しさん:2006/09/05(火) 07:46:50
それは>>281
292デフォルトの名無しさん:2006/09/05(火) 15:59:15
double a[30];
int n = 30;

for(int i=0; i<n; ++i){
a[i] = i*1.4;
if(a[i] != (i*1.4)){
cout<<i<<endl;
}
}

これで出力があるのはどうしてなんでしょうか?
293デフォルトの名無しさん:2006/09/05(火) 16:11:59
>>292
処理系によっては配列に格納するとき浮動小数点数の丸めが起こって、
i*1.4 の結果と比較した場合に違う値になったりするかも知れない。

ちなみに、VC6 では特に問題なかった。
294デフォルトの名無しさん:2006/09/05(火) 16:44:35
>>293
そういうことなんでしょうか。
ちなみにgcc3.3.2のg++(VineLinux)を使ってます。

iの値によって出力されたりされなかったりっていう状態で、
危険だなぁと思ったもので。
295デフォルトの名無しさん:2006/09/05(火) 17:11:21
>>294
#include <cfloat>
の中に入ってる DBL_EPSILON が誤差の最大値だから、
if(abs(a[i] - (i*1.4)) > DBL_EPSILON)
ってすれば回避できるよ
296デフォルトの名無しさん:2006/09/05(火) 17:15:00
fabs() だったorz
297デフォルトの名無しさん:2006/09/05(火) 17:18:44
>>294
80bit 浮動小数点数に格上げして比較してるのかもね。
298デフォルトの名無しさん:2006/09/05(火) 17:50:27
>>295
DBL_EPSILON は 1 に足したとき値の変わる最小値だから、
if(fabs(a[i] - (i*1.4)) > DBL_EPSILON * fabs(a[i]))
みたいにオーダー揃えないとダメだよ。
299295:2006/09/05(火) 18:03:46
そいつはどーも知らんかった
300292:2006/09/05(火) 20:36:38
>>294-298
なるほど、そういうやり方があるんですね。
参考になりました。ありがとう
301デフォルトの名無しさん:2006/09/05(火) 22:18:26
struct foo {
char c;
};

このとき、static_cast で foo* を char* に変換できるようにするには、
どうしたらいいですか?↓こんなことできますか?

template<>
char* static_cast<char*>(foo* p) { return (char*) p; }
302デフォルトの名無しさん:2006/09/05(火) 22:20:16
operator char*
303デフォルトの名無しさん:2006/09/05(火) 22:21:33
>>302
それだと foo を char* に変換することになりますよね。
やりたいのは foo* を char* にしたいんです。
304デフォルトの名無しさん:2006/09/05(火) 22:35:21
>>301
思いつかないなぁ。
なんでそんなことしたいの?
305デフォルトの名無しさん:2006/09/05(火) 22:38:20
return &p->c

って事?
reinterpret_castじゃだめなん?
306デフォルトの名無しさん:2006/09/05(火) 22:47:01
>>304
うーん。理由は聞かないでってのじゃだめ?
>>305
そうそう。reinterpret_cast でもいいけど、
char* に変換可能なことを前提として作られているよ、ということを強調したい。
reinterpret_cast は外道だからね。
307デフォルトの名無しさん:2006/09/05(火) 23:01:52
reinterpret_cast自体が外道なのではなくて、
reinterpret_castを使わざるを得ない状況が外道

つまり>>306、君のやろうとしてることが外道

>char* に変換可能なことを前提として作られているよ、ということを強調したい。
なら、まさにoperator char*が本道
308デフォルトの名無しさん:2006/09/05(火) 23:02:04
>>306
static_cast で変換できても、そういう意図は伝わらないと思う。
外道とか正道とか考えるんなら、メンバ関数が正道じゃないか?
309デフォルトの名無しさん:2006/09/05(火) 23:05:38
char*に正しく変換出来るのであれば、reinterpret_castをラップした
operatorなりなんなりを作ればいい
使う側は汚いキャストをしなくて済むし
310デフォルトの名無しさん:2006/09/05(火) 23:10:04
>>306
伝わらないことないだろ。

>>307 >>309
だからー、foo を char* に変換したいんじゃなくて、
foo* を char* に変換したいの。

foo* pFoo = new foo[100];
char* pChar = static_cast<char*>(pFoo);
311ららら:2006/09/05(火) 23:11:50
>>307
> reinterpret_cast自体が外道なのではなくて、
> reinterpret_castを使わざるを得ない状況が外道
それは分かるのら。しかし、

> つまり>>306、君のやろうとしてることが外道
ここの論理的つながりがないのら。
私は reintrepret_cast を使わないようにしたいのら。
312デフォルトの名無しさん:2006/09/05(火) 23:13:09
static_cast<foo*>(static_cast<void*>(...))
313デフォルトの名無しさん:2006/09/05(火) 23:15:44
T*からU*に変換するテンプレート書くとか
中身はreinterpret_castで書いて
314デフォルトの名無しさん:2006/09/05(火) 23:19:32
foo*もらってchar*出す関数を別に作ればいいじゃん
315ららら:2006/09/05(火) 23:19:50
>>313
これは、普通の関数で書くということですか?
char* ConvFooToChar(foo* p) { return reinterpret_cast<char*>(p); }
うーん、変換するたびにこれを呼ぶのは、ちょっとなー。
できれば static_cast にしたいなー。
316デフォルトの名無しさん:2006/09/05(火) 23:22:56
>>310
どうして自分の意図が伝わると思うの?

全然別の目的で static_cast や C スタイルキャストを使っている template や
マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。
317400:2006/09/05(火) 23:24:12
foo_cast<char *>(p)とでもかけるようなテンプレ関数をこさえるとか。
318デフォルトの名無しさん:2006/09/05(火) 23:25:49
香ばしい奴が一人来てるな。
319デフォルトの名無しさん:2006/09/05(火) 23:27:05
ポインタから char* への static_cast にユーザー定義コードの介入する余地は無い。
あきらめれ。
320ららら:2006/09/05(火) 23:28:30
>>316
> 全然別の目的で static_cast や C スタイルキャストを使っている template や
> マクロの中でもコンパイルが通ってしまうことが考えられる。やめたほうがいい。

意味が分からないのら。何がまずいのか分からないのら。
サンプルコードを示してくれないかなのらー。
321デフォルトの名無しさん:2006/09/05(火) 23:29:00
>>310
ソースで自分の意図を伝えたいと言い出す前に、
日本語で自分の意図が上手く伝えられそうになってください。
322ららら:2006/09/05(火) 23:29:12
>>319
やぱーりそうかー。無理かー。
じゃー、あきらめるのらー。
323デフォルトの名無しさん:2006/09/05(火) 23:31:11
らららはアレだな。


そう、えーっと・・・ぬるぽ。
324デフォルトの名無しさん:2006/09/05(火) 23:31:19
>>310
ちなみにfoo*からchar*への変換演算子を定義することができないのは、foo*もchar*もポインタという組込型だから。
325デフォルトの名無しさん:2006/09/05(火) 23:40:57
>>324
あ?
326デフォルトの名無しさん:2006/09/05(火) 23:45:18
>>325
い?
327デフォルトの名無しさん:2006/09/05(火) 23:52:15
>>326
Wooooooooooo!!!!
328デフォルトの名無しさん:2006/09/06(水) 00:01:14
#define static_cast reinterpret_cast
329ららら:2006/09/06(水) 00:41:45
>>328
ばかはおよびでないのらー
330デフォルトの名無しさん:2006/09/06(水) 01:15:23
>>329
オマエモナー
331デフォルトの名無しさん:2006/09/06(水) 03:42:51
のらーとかキモイ。
332デフォルトの名無しさん:2006/09/06(水) 19:36:41
めんどくせーこといってんな。
普通は、>>306 みたいなのは、foo のインターフェイスとして用意しておくべきだろ。
速度面は inline 展開されるから、reinterpret_cast と同等の速度になるはず。

class foo {
 template< typename Dest >
 friend inline Dest * valid_cast( foo * p ) {
  STATIC_ASSERT( boost::is_same< Dest, char >::value );
  return reinterpret_cast< Dest * >( p );
 }
};

//foo * pSrc;
//char * pDest = valid_cast< char * >( pSrc );
333デフォルトの名無しさん:2006/09/06(水) 20:03:48
コンパイラにエスパーを求める奴が馬鹿なんだよ
334デフォルトの名無しさん:2006/09/06(水) 21:06:46
それを言ったらおしめえよ
335デフォルトの名無しさん:2006/09/07(木) 01:46:23
>>333
エスパーなコンパイラ...
欲しいな
336デフォルトの名無しさん:2006/09/07(木) 06:56:19
>>335
未定義な操作を検出すると自動的かつ瞬時に上司に報告するコンパイラですか?
337デフォルトの名無しさん:2006/09/07(木) 14:41:37
時々サンプルコードで、
std::ofstream のインスタンスを作成するときに次のように

std::ofstream ofs("aaa", std::ios::out | std::ios::binary);

std::ios::out フラグを立てているものを見かけるのですが、
何か意味があるのでしょうか?
そもそも std::ios::in フラグとかまで立てられてしまうので、
気持ち悪いです。
338デフォルトの名無しさん:2006/09/07(木) 14:55:13
ofstreamにおけるios::inは、入力用って意味じゃなく、
「同名ファイルを削除しない」って意味らしいが…。
ttp://www.microsoft.com/japan/developer/library/vclang/_iostream_ofstream.3a3a.ofstream.htm
これは標準なのかね。
339デフォルトの名無しさん:2006/09/07(木) 15:12:48
>>338 あ、あれ?ほんとだ・・・
なんか俺根本的に標準ファイルストリームの
フラグについて間違った認識してるのかも。
fopen のフラグとの対応がわからん。
340デフォルトの名無しさん:2006/09/07(木) 15:32:32
>>339
fopen()は割りと変態仕様だから、対応で考えない方がいいよ。
341デフォルトの名無しさん:2006/09/07(木) 16:21:58
>>338
違う。マイクロソフトの勝手な拡張。

>>339
規格のtable 92に対応が書いてある。
342デフォルトの名無しさん:2006/09/07(木) 16:49:43
>>337
std::ofstreamのデフォルトのフラグはstd::ios::out。
バイナリ出力を行うためにstd::ios::binaryとORをとってるだけ。
std::ios::inは立たない。
343338:2006/09/07(木) 23:25:45
>>341
まじっすか。
MSってこんなとこまで独自拡張してんのかよ('A`)

企画表実際見てみたら、ios_baseフラグとfopenのモードとの対応表があった。
ios::in | ios::outでは"r+"や"w+"と同じ扱いになるらしい。

>>342
立てられる=受身の意味ではなく可能性があるという意味では。
344デフォルトの名無しさん:2006/09/08(金) 00:00:06
>>343
しかしなぁ、r+とw+では動作が異なるのだが。
345デフォルトの名無しさん:2006/09/08(金) 00:15:26
知ったかぶりしてんだよ。
346デフォルトの名無しさん:2006/09/08(金) 00:26:27
MS独自拡張といえば、fopenに"R"や"S"とか。
347デフォルトの名無しさん:2006/09/08(金) 00:33:11
>>343
ios::in | ios::out = "r+"
ios::in | ios::out | ios::trunc = "w+"
まで書けっていうんかい。
それぐらい自分で確認してくれ。
348デフォルトの名無しさん:2006/09/08(金) 09:55:18
>>346
新たにフラグ作るのはいいけど、
既存のフラグに意味を付け足すのはまずいわな。
349デフォルトの名無しさん:2006/09/08(金) 12:10:17
Javaとの戦いに懲りて、MSの拡張もまともになったかと思ったけど、
C#でのMS色の具合を見ると、まともになっているわけでもでもないなぁ・・
350デフォルトの名無しさん:2006/09/08(金) 13:22:22
別にC#で何やってもいいじゃね
351デフォルトの名無しさん:2006/09/08(金) 13:29:50
C#ってjisとかで規格になってるんでしょ?
何やってもいいとかは言いすぎな感じ・・

それも規格になってないjavaは www.jcp.org コミュニティーで慎重に話し合って
合意を取り付けている。

そういうのからすると、だいぶ異色に映る。
352デフォルトの名無しさん:2006/09/08(金) 13:51:51
ECMAにversion 1だけ規格通して、
後はやりたい放題ってのは、
以前からMSがやっている手法です。
オープンだそうですw
353デフォルトの名無しさん:2006/09/08(金) 16:00:50
漏れは無駄に時間を食う java のやり方が一義的に優れてるとは思わないけどなぁ・・
次世代 Cobol という位置づけを考えると、確かにそれで良いのだろうけど。
354デフォルトの名無しさん:2006/09/08(金) 16:48:50
>>353 無駄に時間を食うってどういうこと?
バイトコードでってのを指して言ってるのかな?

で、俺は何に期待しているかというと、
断然 C++/CLI ちゃん!
355デフォルトの名無しさん:2006/09/08(金) 16:56:39
>>354
仕様策定にかかる時間の話。
356デフォルトの名無しさん:2006/09/08(金) 17:11:26
>>355 あ〜そういうことか。
ごめんな、Java の仕様策定のやり方ってのが
全然分かってないや、俺。
357デフォルトの名無しさん:2006/09/08(金) 17:31:29
jcp.org行けば分かるよ。
358デフォルトの名無しさん:2006/09/08(金) 19:41:25
一致団結して力を見せつけるのか
独走で唯我独尊を見せつけるか

あなたは、どっちがお好みってことよ♪
359デフォルトの名無しさん:2006/09/08(金) 19:50:59 BE:34939229-2BP(200)
一致団結すればいいんだけどね。
360デフォルトの名無しさん:2006/09/08(金) 20:05:08
C#でそれはナンセンス。C++ならなおさら
いっちゃだめ!
361デフォルトの名無しさん:2006/09/08(金) 20:06:25
362デフォルトの名無しさん:2006/09/08(金) 21:13:42
C#はどうせMS独占言語なんだからMSが勝手にさっさと
突っ走ってくれればいいんじゃね
363デフォルトの名無しさん:2006/09/08(金) 21:31:44
>>361
開発中のデバドラ落ちと混ざって赤紫になっちゃったけどどうしてくれるのよ!
364デフォルトの名無しさん:2006/09/08(金) 21:39:23

はんたーい!

かくめー!かくめー!

かいかくー!

とういつー!

どくそー!
365デフォルトの名無しさん:2006/09/09(土) 00:00:29
#include<windows.h>

class cwindow
{
int kazu;
int x;
public:
HWND * hWnd;
cwindow(int x) :kazu(x){HWND *hWnd = new HWND[kazu];};
void STATIC_screen(HINSTANCE *);
~cwindow(){delete hWnd;};
};

void cwindow::STATIC_screen(HINSTANCE *hInstance)
{

*hWnd = CreateWindow(
TEXT("STATIC") , TEXT("Kitty on your lap") ,
WS_CAPTION ,
100 , 100 , 200 , 200 , NULL , NULL ,
*hInstance , NULL
);

ShowWindow(*hWnd , SW_SHOW);
}
コンパイルはできますが実行するとCreateWindowのところでエラーを起こしてしまいます。
この部分のどこかが間違っているようですが何処が間違っているのかわかりあmせん
Visual C++ 2005 Express Edition
366デフォルトの名無しさん:2006/09/09(土) 00:07:53
>>365
cwindow のコンストラクタでメンバの hWnd じゃなくて
ローカル変数 hWnd に new の戻り値を入れているので、
メンバ変数 hWnd の値は不定。そのまま STATIC_screen を
呼び出せば *hWnd が不定なポインタを使うことになって
不正な処理となる。
367デフォルトの名無しさん:2006/09/09(土) 00:09:38
>>365
環境依存で初心者はスレ違い。↓逝け。

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145524/
368デフォルトの名無しさん:2006/09/09(土) 00:37:25
class Test{
static list<Test*> s_list;
Test()
{
369デフォルトの名無しさん:2006/09/09(土) 00:39:16
class Test
{

static list<Test*> s_list;
Test()
{
s_list.insert(this);
}


}
と書いて別のところで
グローバルにTest のオブジェクト宣言すると
Testのコンストラクタでs_listが出来取らんのでエラーが出ます
どうしたらいいですか?
370デフォルトの名無しさん:2006/09/09(土) 00:45:56
>>369
エラーの内容書けよ。

グローバルオブジェクトの初期化順が問題になっているんだろう。
両方ポインタにして、最初に使うときに new で生成するような関数で
ラップするとか?
371デフォルトの名無しさん:2006/09/09(土) 00:52:34
>>370
エラーは、ヌルポの予感
順番の問題はわかってるけど
順番って制御できないのかな

Testクラスは、グローバルで気軽に作りたいので
listをshared_ptrとかでやってもいいけどboost入れないといけないし
ぬうう
372デフォルトの名無しさん:2006/09/09(土) 00:53:55
>>371
いや、普通のポインタでも auto_ptr でもいい。
むしろ private な static ポインタ変数に shared_ptr 使う意味がわからん。
373デフォルトの名無しさん:2006/09/09(土) 00:57:28
それはまったくもってごもっとも。
374デフォルトの名無しさん:2006/09/09(土) 01:00:10
>>371
static list<Test*>& Test::global_list()
{
 static auto_ptr< list<Test*> > p;
 if(!p.get()) p.reset(new list<Test*>);
 return *p;
}

Test::Test()
{
 global_list().insert(this);
}
375デフォルトの名無しさん:2006/09/09(土) 01:07:18
普通ポインタだとdeleteタイミングが特定しづらい
auto_ptrでやってみたけど
auto_ptrが作成される前にアクセスしてしまう
auto_ptrは、=で代入できないし(初期のinsert直前でnewで作った物を代入できない)
376デフォルトの名無しさん:2006/09/09(土) 01:08:15
うお
>>374でやってみます。
ありがとうございます
377374:2006/09/09(土) 01:09:01
static 付けた定義はエラーになる。適当に宣言と定義に分けてね。
insert(this) も通らんな。
378デフォルトの名無しさん:2006/09/09(土) 01:09:54
if( !s_list.get() )
s_list.reset(new ResourceList );
s_list->insert(this);

でいけました。
お騒がせしました。
dクス
379デフォルトの名無しさん:2006/09/09(土) 02:25:08
>374
static list<Test*>& Test::global_list()
{
 static auto_ptr< list<Test*> > p(new list<Test*>);
 return *p;
}
もっと言うなら
static list<Test*>& Test::global_list()
{
 static list<Test*> l;
 return l;
}
じゃ駄目なの?
380374:2006/09/09(土) 02:56:17
>>379
生ポインタをベースにして考えていったんで、面倒なことになってた。
そっちのがいいな。
381デフォルトの名無しさん:2006/09/09(土) 06:31:46
ところで、コンテナに入れることができるための要件って、
代入演算子とデフォルトコンストラクタが定義されていることだっけ?
382デフォルトの名無しさん:2006/09/09(土) 09:23:51
>>381
いや。コピーコンストラクタが使えれば要件は満たす。
代入演算子もデフォルトコンストラクタもいちおうオプションだが、
多くの操作で必要とされる。
383デフォルトの名無しさん:2006/09/09(土) 09:34:38
>>382 あれ、コピーコンストラクタだけでよかったのか。
「一応オプションだが多くの操作で必要とされる」
というのは resize() しようと思ったら、とかいうこと?
384デフォルトの名無しさん:2006/09/09(土) 09:37:13
Containerの要素の要件のCopyConstructibleは、
「コピーコンストラクタを持っている」だけじゃないので注意してね。

t is a value of type T, and u is a value of type const T.

Table 4 -- CopyConstructible requirements

+----------------------------------------------------+
|T(t) t is equivalent to T(t) |
+----------------------------------------------------+
|T(u) u is equivalent to T(u) |
+----------------------------------------------------+
|t.~T() |
+----------------------------------------------------+
|&t T* denotes the address of t |
+----------------------------------------------------+
|&u const T* denotes the address of u |
+----------------------------------------------------+

が必要。
385デフォルトの名無しさん:2006/09/09(土) 09:40:31
>>383
T::value_typeがAssignableでなければいけません。
Associative containerのキーもAssignable。
386デフォルトの名無しさん:2006/09/09(土) 09:50:56
ううむ、ちゃんとSTLの規格を読まなきゃ駄目だな、俺。
今までエラーがでたらエラーはいてるテンプレートの定義を見て

「おお、このテンプレートを特殊化しようとしてエラーか。
 じゃ、このメソッド(もしくは演算子)宣言しておかなきゃな」

なんて行き当たりばったりでやってたからなぁ。

「ええい、めんどくさい、無意味に boost::shared_ptr でくるんでやれ」

とか逃げたこともしばしば。
387デフォルトの名無しさん:2006/09/09(土) 10:54:28
fstreamのファイル名がstd::stringというのはイヤガラセですかねえ
388デフォルトの名無しさん:2006/09/09(土) 11:17:25
389386:2006/09/09(土) 12:14:17
すんまそん、よく考えたら STL のスレッドがあったんですよね。
なんかスレ違いっぽいんでそっちいきますは。
390デフォルトの名無しさん:2006/09/09(土) 12:43:38
全然スレ違いじゃない
391デフォルトの名無しさん:2006/09/09(土) 12:52:45
C++ は初心者スレとかいろいろあって、
「これはコンパイラ依存の話だから」
「これは初心者っぽいかなぁ」
とかかんがえるのがマンドイ
392デフォルトの名無しさん:2006/09/09(土) 12:58:53
まんどいだけならともかく、初心者にはそもそも区別がつかないっぽい。
393デフォルトの名無しさん:2006/09/09(土) 14:17:48
JavaやRUBYなら簡単なのに!!!
394デフォルトの名無しさん:2006/09/09(土) 14:26:00
キミにはお似合いだよ。
395デフォルトの名無しさん:2006/09/09(土) 15:45:20
C++書くマになりたいんですが、
どんな仕事でC++使うんですか?
396デフォルトの名無しさん:2006/09/09(土) 15:46:41
比較的パフォーマンスが要求されるシステム
397デフォルトの名無しさん:2006/09/09(土) 18:14:18
>>395
昔はC=マイコン系、C++=GUIなイメージだけど
C++=工場系(漏れの仕事もそうだが、工場の機械をWinで操る、組み込みC++も増える希ガス)
スクリプト=プログラマ
ブログ、Wiki、サーバ作る=SE
ネットわからない=ITこんさるたんと

てなると思う。初めHTMLは素人用だったが、いまややこしくなってきたね
398365:2006/09/09(土) 21:22:47
cwindow(int x) :kazu(x){hWnd = new HWND[kazu];};
dクス
399デフォルトの名無しさん:2006/09/10(日) 00:47:23
C++を勉強しようと思うんですけど
まずCからちゃんと覚えたほうがいいですかね?
400デフォルトの名無しさん:2006/09/10(日) 00:57:37
仕事ではPHP+DBとかだけのヘタレプログラマだけど
時々趣味で自作アプリとかC++(VC++&MFC)で作ってるけど
流石に仕事で使うのは大変そうだなーと思うよ。
とても自分には無理そう。というかC++で仕事してる人尊敬するよ。
401デフォルトの名無しさん:2006/09/10(日) 01:02:29
個人的にはいきなりC++でもいいと思うけど、
構造化手法のことはよく理解しといたほうがいいような気がする
402デフォルトの名無しさん:2006/09/10(日) 01:19:00
C++がある程度分かる様になったら、他の言語を勉強した時、本当にすんなり覚えられる。
Rubyなんか楽しくて仕方ないし、PHPは普通にいきなり使えた。まぁスクリプト言語を引き合いに出してもアレだが。
でも高級言語でC++程難解な言語は無いでしょう?
403デフォルトの名無しさん:2006/09/10(日) 01:46:42
C++使いだけど、Haskellに苦労してる。
404デフォルトの名無しさん:2006/09/10(日) 01:47:14
>>402 高級言語と思うから難解なのでは?
オブジェクト指向アセンブラと思えばどうだろうか。
405デフォルトの名無しさん:2006/09/10(日) 01:49:46
イベントの種類とパラメータと戻り値をひとまとめにしてクラスで
表現しようと思い、以下のようにしてみました。
template <class paramType, class resultType>
class Event {
int type_;
paramType param_;
mutable resultType result_;

public:
// paramType を取るコンストラクタとかもろもろ...
const paramType& Param() const { return param_; }
const resultType& Result() const { return result_; }
void SetResult(const resultType& result) const { result_ = result; }
};
イベントを受け取るハンドラー側は、
void Handler(const Event& event) {
resultType foo;
// ... 処理 ...
event.SetResult(foo);
}
となるのですが、あんまり直感的じゃないですよね。かと言って、
ハンドラーを void Handler(Event& event); とするのは気持ち悪いなぁ
というところで悩んでます。妙案はござらぬか。
406デフォルトの名無しさん:2006/09/10(日) 01:56:04
>>405
そもそも戻り値までまとめるところがダメだと思う。
407デフォルトの名無しさん:2006/09/10(日) 02:45:32
>>405
なんで無理矢理constにしたいのかが分からん。
Eventは純粋に起きた出来事を記述するだけにとどめるべき、と考えるなら、

template<class eventType, class resultType>
class EventArgs
{
const eventType event_;
resultType result_;
//略
};

void Handler(EventArgs &args)
{
resultType foo;
//処理
args.setResult(foo);
}

くらいじゃダメ?
408デフォルトの名無しさん:2006/09/10(日) 04:01:57
そこまで無理やりconstにして、結局返り値がmutableなのは典型的な駄目コードだろう。
constの前提が全部ぶっ壊れるんだから、クラス外部に影響の出ない本当に一部の例外以外は
使っちゃ駄目ぽだよ。
非constと同じコードが生成されるから、性能面でもまったくメリットないし。
>>407程度でいいと思う。

受け取ったイベントに返り値を運ばせるのは賛否が分かれそうだけど、
イベントの種類によっては、それなりに現実的なんじゃないかな。
実は全部intか、もっと言うとboolで十分だったなんてオチは、いかにもありそうだけど。
409デフォルトの名無しさん:2006/09/10(日) 08:21:59
>>403 パラダイム違いすぎ

それはそうと、 const だけで3杯くらいご飯食えるよな。
const のおかげで不用意な代入のバグを回避できたことも多いし。
BOOST_STRONG_TYPEDEF も不用意な代入によるバグを回避するのに
ずいぶん役だってくれたな。実際にはそれをちょっと自分用に
カスタマイズしたマクロを使ってるけど。

とかくと、boost 厨死ね、このクズが、ってののしられるんだろうな。
快感。
410デフォルトの名無しさん:2006/09/10(日) 08:26:45
>>407
引数から const を外すなら、そうするしかないですよね、やっぱり。
どうも const に拘りすぎて、const 馬鹿になっていたようです。

>>408
mutable なメンバ変数がインタフェースになってるってのも、確かに
気持ち悪いんですよね。>>407 の方向でやってみます。
411デフォルトの名無しさん:2006/09/10(日) 08:53:04
std::auto_ptr<int> func(void){
   std::auto_ptr<int> p(new int);
   return p;
}

void test(void) {
   std::auto_ptr<int> p = func();
}

こうやったとき、new で確保したオブジェクトの所有権は
戻り値用の一時オブジェクトを介して(実際はRVOが働く?)
ちゃんと移動されて test() から抜けた時点で解放されるんですよね?
412デフォルトの名無しさん:2006/09/10(日) 09:24:42
>>411 うん。
413デフォルトの名無しさん:2006/09/10(日) 09:32:13
>>412 よかった。これで心おきなく
auto_ptr<T> を戻り値として使えます。
ポインタを生のまま返すと、
「たのむ〜、このポインタ、ちゃんと解放してくれよ」
って祈るしかないし。
414デフォルトの名無しさん:2006/09/10(日) 10:49:27
文字列の$と$で囲まれた部分(「あいうえお$かきくけこ$さしすせそ」の「かきくけこ」)を取り出したいのですが
「最初の$以降の文字列」はstrstrで取り出すとして
「後の$以降の文字列」をそれから取り除くにはどうしたらいいでしょうか?

mbsnbcpy使うのかな?
415デフォルトの名無しさん:2006/09/10(日) 10:54:43
>>414
自分で試せ。それ C++ なのか?
416414:2006/09/10(日) 11:01:02
追記
もとの文字列、切り出し後の文字列ともにchar*型ですが
双方unsigned char*にキャストしてmbsnbcpy使うとなぜか
切り出し後の文字列が空文字列になってしまいます。
417デフォルトの名無しさん:2006/09/10(日) 11:03:33
>>416
エスパー募集じゃなければソース貼れ。
C++ 関係ないなら別スレに逝け。
418デフォルトの名無しさん:2006/09/10(日) 11:06:43
>>411
その辺の話はExceptional C++に詳しく載ってるよ。
全く同じことやってる例がある。
419414:2006/09/10(日) 11:10:05
char[100] motobun;
strcpy(motobun,"あいうえお$かきくけこ$さしすせそ")
char[100] kiribun;

kiribunにmotobunの中の「かきくけこ」を入れるということでお願いします。
420デフォルトの名無しさん:2006/09/10(日) 11:13:24
>>419
エスパー募集じゃなければソース貼れ。
C++ 関係ないから別スレに逝け。
421デフォルトの名無しさん:2006/09/10(日) 11:24:07
memcpyの質問というより「NULL+6がどうなるか」という質問になるかもしれませんが
memcpy(NULL + 6, "abc", 4);
これはどうなりますか?
memcpy(NULL, "abc", 4);
と解釈されますか?
422デフォルトの名無しさん:2006/09/10(日) 11:29:54
>>421
解釈されない。
何が起きるか分からない。

423デフォルトの名無しさん:2006/09/10(日) 11:30:03
>>421
ヌルポインタ + 6 なら未定義動作。
NULL + 6 は 0 + 6 で、ただの整数 6 になってコンパイルエラーになる。
424デフォルトの名無しさん:2006/09/10(日) 11:30:04
いやアドレス0x00000006へコピーしようとする。
いずれにせよ、不正アクセスであぼーん。
425デフォルトの名無しさん:2006/09/10(日) 11:31:46
>>424 でたらめ言うな。
426デフォルトの名無しさん:2006/09/10(日) 11:35:00
>>419
char *p = strchr(s1, '$');
char *q = strchr(p+1, '$);
memcpy(buf, p, q-p);
buf[q-p] = '\0';
427デフォルトの名無しさん:2006/09/10(日) 11:37:35
425の考えをキボン。
428425:2006/09/10(日) 11:40:09
>>427 ん? >>423 に同意だな。コンパイルエラーも確認した。
429デフォルトの名無しさん:2006/09/10(日) 11:40:53
>>423-425
C++でNULLが0にdefineされているというのは、実際にはほぼ間違いないけど
規格的にはどうなの?
Cでは(void *)0もアリでしょ。

で、もし、(void *)0な処理系が存在するなら
(void *)0 + 6 という値になって、(gcc以外なら)voidへの演算エラーになるよね。
いずれにしろ、(gcc以外では)>>424にはならない。
もちろん、ほぼ全ての処理系は>>423だろうけど。
430デフォルトの名無しさん:2006/09/10(日) 11:41:07
423は矛盾がある。
NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。
もし NULL + 6 が 0 なら、アドレス0x00000000へコピーしようとするよ。
431デフォルトの名無しさん:2006/09/10(日) 11:41:14
>>427
425じゃないけど
C++だとNULLは#define NULL 0と定義されているのが普通。
だからNULL + 6 は0 + 6となり、整数畳み込みで6になる。
で、6からポインタへの暗黙の変換は存在しないのでエラー。
ようするに>>423
432デフォルトの名無しさん:2006/09/10(日) 11:44:10
>>430
> NULL + 6 は 0 だと言い張るのにmemcpy(0, "abc", 4);が未定義動作だと言う。

だれもそんなこと言ってない。
433デフォルトの名無しさん:2006/09/10(日) 11:44:49
>NULL + 6 は 0 だと言い張るのに
誰がそんな妄言、言い張ってるんだ?
434デフォルトの名無しさん:2006/09/10(日) 11:46:16
>>429
C++ では (void*)0 は NULL の中身にはなり得ない。
435デフォルトの名無しさん:2006/09/10(日) 11:48:32
>>421がなんでこんな事を聞きたかったのかに話を戻そう
436デフォルトの名無しさん:2006/09/10(日) 11:52:54
>>434
仕様に書いてある?
437デフォルトの名無しさん:2006/09/10(日) 11:53:40
出くわした場面は以下です。memcpy()の前にif(buf)が必要ですか?
main(){
 char *buf = NULL;
 if(何か){
  buf = (char*)malloc(8);
 }
//ここにif(buf)が必要?
 memcpy((void*)(buf + 6), "\r\n", 2);
 free(buf);
438デフォルトの名無しさん:2006/09/10(日) 11:54:37
C は void* から別のポインタへの暗黙のキャストがあるから NULL は (void*)0 の定義も許されてる。
C++ はそれができないから NULL は 0 と定義するしか無いという仕様に変更された。
439デフォルトの名無しさん:2006/09/10(日) 11:57:07
「何か」の部分に0を入れてテストしたら実行時エラーになりました。
アドレス0x00000006へコピーしようとする の説が正しいように思いました。
440デフォルトの名無しさん:2006/09/10(日) 11:57:44
>>436
18.1.3 が NULL マクロについての記述。
"The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10)."
これに注釈で
"Possible definitions include 0 and 0L, but not (void*)0."
と明記されている。
441デフォルトの名無しさん:2006/09/10(日) 12:00:21
>>437 必要。
>>439 それは気の迷いということにしておけ。
442デフォルトの名無しさん:2006/09/10(日) 12:02:28
>>440
ありがとう。
443デフォルトの名無しさん:2006/09/10(日) 12:02:30
441そうだね。
444デフォルトの名無しさん:2006/09/10(日) 12:06:13
>>439
「NULL + 6」と
「(char *)NULL + 6」は
全然違うだろ。

皆、おまえが最初に書いた前者を前提に話していたのに。
最初からそう書けよ。
445デフォルトの名無しさん:2006/09/10(日) 12:07:08
>>438
C では (void*)0 がヌルポインタ定数として( 0 と同等に)機能すると特別扱いされている。
そのおかげで、データポインタからの変換が認められていないはずの
関数ポインタも (void*)0 でヌルが設定できたりする。
446デフォルトの名無しさん:2006/09/10(日) 12:07:55
> 「(char *)NULL + 6」は

なんだか目の悪いやつがいるようだな。
447デフォルトの名無しさん:2006/09/10(日) 12:14:05
>>446
それはおまえのことか?
>>437をちゃんと見てるんだよな?
448デフォルトの名無しさん:2006/09/10(日) 12:17:10
スマンカッタ
449デフォルトの名無しさん:2006/09/10(日) 12:18:27
まあ初心者がヌルポインタと NULL (ヌルポインタ定数)を混同するのはわからんでもない。
450デフォルトの名無しさん:2006/09/10(日) 12:37:18
意味があるのかわからん議論だな
451デフォルトの名無しさん:2006/09/10(日) 12:56:20
どっちでもいーっしょじゃーん
452デフォルトの名無しさん:2006/09/10(日) 13:30:31
確かにCだとNULLは(void *)0なので
ポインタに対する整数加算は
ポインタの指す型のサイズ倍のアドレス増加となり
sizeof (void)は得られないので
NULL+6はエラーだが

C++だとNULLは0だからNULL+6は整数6で、ポインタではなくなるな
453デフォルトの名無しさん:2006/09/10(日) 13:36:39
だから何?
454デフォルトの名無しさん:2006/09/10(日) 13:40:18
>>452
C でも NULL を 0 と定義するのは可能。
455デフォルトの名無しさん:2006/09/10(日) 13:47:27
>>452
てか、ちょっと前のレスで既に何度も言われてることなんですけど。

お前のような奴を知識披露厨と言うんだろうな。
職場等でウザがられてない?
456452:2006/09/10(日) 14:00:52
>>437以降を見ずに書いてたが
なんだ、質問自体が違ったのか
457デフォルトの名無しさん:2006/09/10(日) 14:16:59
>>437以前に、既に何度も同じ事がかかれているわけだが。
458452:2006/09/10(日) 14:24:27
>>457
だから「確かに」で単にまとめてただけなんだが。必然的に繰り返しになる。
それにこのスレはそもそも殆どの話題が以前出たことがあることばっかりで
繰り返しを楽しむスレなんじゃないの?w
459デフォルトの名無しさん:2006/09/10(日) 14:28:52
まあどうでもいい
460デフォルトの名無しさん:2006/09/10(日) 14:30:18
STLつかうと一気に実行ファイルサ(ry
461デフォルトの名無しさん:2006/09/10(日) 14:33:19
>>458
まとめると言うほどの内容は無いようですが。
462デフォルトの名無しさん:2006/09/10(日) 14:36:01
がんばって素直にごめんなさいが言える大人になろうね。
463452:2006/09/10(日) 14:54:10
ごめんなちゃい
464デフォルトの名無しさん:2006/09/10(日) 15:05:20
ごめんね
465デフォルトの名無しさん:2006/09/10(日) 16:48:36
無理やり話題のレベル上げようとするの禁止
466デフォルトの名無しさん:2006/09/10(日) 17:10:19
じゃあ以降レベルは腹ばい気味で。
467デフォルトの名無しさん:2006/09/10(日) 17:45:06
C++ でクラスを書いて、コピーができないようにした。
そんで、本当にコピーできないことを確認するために、
テストコードを書いて、そのテストを自動化したい。
そんなこと C++ だけでできるぅー?
468デフォルトの名無しさん:2006/09/10(日) 17:51:29
質問したい事があります。
file1.h
file2.h
file3.h
とヘッダを作成し、
--file1--------
#include "file2.h"

--file2--------
#include "file3.h"

--file3--------
#include "file1.h"

--main-------
#include "file1.h"
#include "file2.h"
#include "file3.h"
とインクルードさせるとfile1で宣言した型がfile3でintと仮定されてしまいます。
file1,2,3ともお互いに宣言した型をメンバ内で使っている状態です。
多重インクルードは回避してあります。
なんとなく、型を認識する前に別のファイルでの型が書かれている部分を認識しようとしているのかなぁ…と思うのですが、
これを何とか通したいのですが何か方法があれば教えていただきたいです。
469デフォルトの名無しさん:2006/09/10(日) 17:52:04
>>467
コンパイルエラーを捕らえることになるから C++ だけじゃできなさそうだねぇー。
470デフォルトの名無しさん:2006/09/10(日) 17:54:36
>>468
C++ では int の仮定なんてしないはず。何を見てそう思ったの?
「宣言した型」ってのもよくわからん。 class か enum か typedef か、とか。
問題が再現するコード貼ってくれると話が早い。
471デフォルトの名無しさん:2006/09/10(日) 18:04:47
ファイル入出力を<<演算子で行うと、どうにも遅くて困ってます。
結局大きめのファイルを扱うとなると、Cに戻るか、小細工が必要なんでしょうか?

<<演算子による操作自体は、読みやすくて好きなのですが
472デフォルトの名無しさん:2006/09/10(日) 18:07:01
>>471
自分で<<を定義し、その中でCのfprintf()とか使えば速くなるじゃん。
sync_with_stdioとか必要になるが。
473デフォルトの名無しさん:2006/09/10(日) 18:13:06
ありがとうございます。ちょっと残念ですが、fprintf等、Cの関数を使うことにします。
474デフォルトの名無しさん:2006/09/10(日) 18:16:04
>>470
VS2005を使ってまして、エラーで
[ 型指定子がありません - intと仮定しました。 メモ: C++は int を既定値としてサポートしていません ]
と、出ています。よくみたら>>470さんの言うように仮定してないみたいです。

--file1.h-------
#include "file2.h"
class FILE_1 { void func(FILE_2& _file){ ... } };

--file2.h-------
#include "file3.h"
class FILE_2 { ... };

--file3.h-------
#include "file1.h"
class FILE_3 { ... };

file1でFILE_2が型として認識されていない状態です。

475デフォルトの名無しさん:2006/09/10(日) 18:23:31
その手のエラーはたいてい
型情報が必要な所でエラーになってる
(関数の戻り値の型を書くのを忘れているとか)事が多い
Cの規格では省略時はintとみなされる→C++はダメ
476デフォルトの名無しさん:2006/09/10(日) 18:28:24
>>474
参照を使うだけなら、ヘッダのインクルードを前方宣言で置き換えるといい。
- #include "file2.h"
+ class FILE_2;
477デフォルトの名無しさん:2006/09/10(日) 18:35:47
>>474
なんだこれ
循環includeで
include guardなし?
どうしてFILE_2を参照してるところに到達できてるんか
478デフォルトの名無しさん:2006/09/10(日) 18:37:40
いちおう >>468 で「多重インクルードは回避してあります。」と言っている。
コードに対してコンパイルエラーが出るってことは、循環 include にはなっていないんだろう。
479デフォルトの名無しさん:2006/09/10(日) 18:48:40
>>474
#include "file2.h"をすると
file2でまず多重インクルード防止のdefineでもされてから
(まだclass FILE_2宣言に到達していない)
#include "file3.h"が実行され
その中で#file include "file1.h"が実行され
file1.hの中の#include "file2.h"は
すでにdefine済みということで通過。
class FILE_1に来たときはFILE_2はまだ宣言されてない。

>>476方式で。
直接宣言が嫌なら<iosfwd>みたいに参照のみ用ヘッダ書くってのもありか
480デフォルトの名無しさん:2006/09/10(日) 18:58:42
[ 認識できない型 'name::Class_name ' が使われています。 ]
とエラーになってしまいました。

あーもう、こんがらがってきました('д')
そもそもこんな設計になる時点で良くない気がします。
全部見直してみます。どうもお騒がせしました。
481デフォルトの名無しさん:2006/09/10(日) 19:04:38
>>480
それがいいだろうね。
整理し直してヘッダを書き直してみるのが、結果的に一番よさげな希ガス。
482デフォルトの名無しさん:2006/09/10(日) 19:06:48
namespace を超える前方宣言は、 namespace name { class Class_name; } って感じに
しないと駄目だよ。
483デフォルトの名無しさん:2006/09/10(日) 19:09:05
namespace::Class_nameじゃダメなん?
484デフォルトの名無しさん:2006/09/10(日) 19:10:46
つーか、
class name::Class_name;
でいい
485デフォルトの名無しさん:2006/09/10(日) 19:11:40
>>480
相互依存の排除には interfaceと派生した実装クラスに分離するって手があるよ
今回の場合に当てはまるか分からんけど

ifile2.h:
class IFILE_2 {};

file1.h:
#include "ifile2.h"
class FILE_1 { ... IFILE_2を参照 };

file2.h:
#include "ifile2.h"
class FILE_2: public IFILE_2 {};
486デフォルトの名無しさん:2006/09/10(日) 19:44:21
namespace name {

class FILE_1;

class FILE_2 { ... };

}

FILE_1も同じ name でnamespaceしてます。
こんな感じで前方宣言してたのですが、よろしくないでしょうか?
487デフォルトの名無しさん:2006/09/10(日) 19:48:23
>>486
コンパイルできるんならいいんじゃね?
コンパイルできないならエラーメッセージ貼れ。
488デフォルトの名無しさん:2006/09/10(日) 19:55:51
>>487
エラーは>>480で怒られたものです。
[ 認識できない型 'name::Class_name ' が使われています。 ]

そして以下のようにすると、

class name::FILE_1;

namespace name {

class FILE_2 { ... };

}

[ 'name' : 識別子がクラス名でも名前空間でもありません。 ]
と怒られてしまいます。
VS使っているのですが、:: でインテリセンス出てくるんですが…
489デフォルトの名無しさん:2006/09/10(日) 20:02:15
そりゃnameがnamespace名であることを知らなきゃ、そういうメッセージになるわな。

つーか、>>482がやり方説明してるだろ。
490デフォルトの名無しさん:2006/09/10(日) 20:05:40
>>482でやると>>486と同じエラーになります。
となると、>>486でもコード的には間違いではないと思うのですが。

やっぱり設計しなおしてみます。書き込んでくださったみなさん、お手数おかけしました。
491デフォルトの名無しさん:2006/09/10(日) 20:09:33
それ絶対別の場所なりでなんか変なことしてるだろ。
そうじゃなきゃ、そんなエラー出るわけないし。

あ、関係ないとは思うけど、
(たぶん今の言語仕様では) typedef名とclass内classは
どうやっても先行宣言できないから。
492デフォルトの名無しさん:2006/09/11(月) 03:17:08
namespace name1{
 class FILE_1;
}

namespace name2{
 class FILE_2{ name1::FILE_1* f1; };
}

namespace name1{
 class FILE1{ };
}

上はVC2005でやったら通るけど、こういうことじゃない?
493デフォルトの名無しさん:2006/09/11(月) 09:21:07
>>452
> 確かにCだとNULLは(void *)0なので

違う。0です。
(void *)0とすることも可能と併記されている。
494デフォルトの名無しさん:2006/09/11(月) 09:25:08
>>449
あなたのは見当違いです。

規格では、
null pointer constant
null pointer value
しかインデックスには出てこない。

null pointer constantの話をしているところに
"null pointer"という単独の単語は出てこない。

NULLマクロとの関係は>>440にある通り。
495デフォルトの名無しさん:2006/09/11(月) 09:25:41
>>493 >>445,>>454 で既出。「0です」と言い切るのも間違い。
496デフォルトの名無しさん:2006/09/11(月) 09:29:50
>>492
それで問題ない。VC2005以外でも。
497デフォルトの名無しさん:2006/09/11(月) 09:30:19
このスレどころか世界中でさんざん既出なので、
もうこれでぬるぽのはなしはおしまいにしてもらえませんか?
http://www.kouno.jp/home/c_faq/c5.html
498デフォルトの名無しさん:2006/09/11(月) 09:40:59
>>495
規格上、0です。
(void *)0も可能と併記。
499デフォルトの名無しさん:2006/09/11(月) 09:46:00
>(void *)0
だーかーらぁー
500デフォルトの名無しさん:2006/09/11(月) 09:47:27
>>498
C99 の定義は以下のとおり。
"An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant."

たとえば 0L も、 gcc の __null もヌルポインタ定数であり、 NULL の中身になれる。
501デフォルトの名無しさん:2006/09/11(月) 12:17:45
long に NULL 代入しようとしたら void* は long にキャスト出来ませんというエラーが・・・
502デフォルトの名無しさん:2006/09/11(月) 12:19:42
それはよかったじゃない。
503デフォルトの名無しさん:2006/09/11(月) 20:13:27
#define NULL 0 の実装は C++ でしか見た事無い。
C でわざわざ 0 に定義する利点も無いし。
504デフォルトの名無しさん:2006/09/11(月) 20:27:42
>>503
修行が足りません。
505デフォルトの名無しさん:2006/09/11(月) 20:49:06
NULL と '\0' の違いについて
506デフォルトの名無しさん:2006/09/11(月) 20:54:38
>>498
「可能」 って表現に違和感を持たれてるんじゃないか?

たとえば

#undef NULL
#define NULL ((char *)0)

が不能でなければ規格合致処理系ではないということではなかろう
507デフォルトの名無しさん:2006/09/11(月) 20:59:57
まぁCの話はスレ違いなんだけどね。
508デフォルトの名無しさん:2006/09/11(月) 21:37:56
char型の配列の中身をダンプしようと16進数で表示する様に
char buf[20];
cout << hex << buf[0];
とやってみたんですが、文字として表示されてしまいます。
intでキャストすれば正の数なら表示されるんですが、負の数になると
0xFFFFFFF と表示されてしまいます(intにキャストしているので当たり前なんですが)
buf[0] = 0xFF;
cout << hex << buf[0]; //FFと表示させたい
509デフォルトの名無しさん:2006/09/11(月) 21:44:49
>>508
signed charにキャストすればいいのでは?
510デフォルトの名無しさん:2006/09/11(月) 21:47:19
いや、unsigned intの方が良くないか?
511デフォルトの名無しさん:2006/09/11(月) 21:49:51
cout << static_cast<unsigned>(buf[0]);
512508:2006/09/11(月) 21:57:19
>>511

char buf=0xFE;
cout << hex << static_cast<unsigned>(buf);

でやってみたんですが、fffffffeと表示されてしまいます
ちなみにVC++2005でやってます

バイナリエディタの様に 00 23 BE FE
みたいな表示はみなさんどうやって出力してます?
printfなら余裕なんですが・・iostream難しい
513デフォルトの名無しさん:2006/09/11(月) 22:00:21
char c = '\xab';
cout << hex << static_cast<unsigned>(static_cast<unsigned char>(c));
バイナリデータはunsigned charで扱う癖をつけておいたほうがいいと思う。
514デフォルトの名無しさん:2006/09/11(月) 22:00:25
static_cast<unsigned>(buf) & 0xffu
515デフォルトの名無しさん:2006/09/11(月) 22:01:43
おめーら、整数格上げの規則ぐらい覚えとけよ。

signed charをunsignedにしたって駄目
unsigned charにしてからintに代入しろ。
516デフォルトの名無しさん:2006/09/11(月) 22:04:06
>>513
>>514
おぉできますた!

ポイントはunsigned charで扱う事なんですね
ありがとうございました

517デフォルトの名無しさん:2006/09/12(火) 00:48:31
C++というより設計の質問かもしれないんですが、
インターフェースクラスをテンプレートクラスにするのはありですか?

template <class T> class Foo
{
public:
virtual voie Hoge(const T&) = 0;
};

template <class T> class Bar : public Foo<T>
{
public:
void Hoge(const T&);
};

って感じにして使うと、コンパイル時に好きなように
インターフェースを決定できるので汎用的に使えると思うのですが、
一方でインターフェースは型も含めて明示しないと他人が使いづらいかとも思うのです。
みなさんはどう思いますでしょうか?
518デフォルトの名無しさん:2006/09/12(火) 00:49:29
>>517
デフォルトの型を入れておけば?
519デフォルトの名無しさん:2006/09/12(火) 01:16:51
>>517
言語的にはもちろんアリ。
設計の是非については、それだけの情報では検討不能。
520デフォルトの名無しさん:2006/09/12(火) 01:20:34
何でも入るインターフェイスなんて、結局何にも定まってないようなもんだしなー。
521デフォルトの名無しさん:2006/09/12(火) 01:36:58
メソッドのシグネチャ固定したいだけだろ?
たぶんそのメソッド名を仮定したvisitorとかがあるのでは。
522デフォルトの名無しさん:2006/09/12(火) 02:06:23
>>517
例えばCOMのIEnumXXXなんていうインタフェイスはそういう感じのが似合ってるような気がする。

template <class T> class IEnumGeneric
{
public:
virtual void Reset(); // 先頭に戻す
virtual bool Next(T* &pNextItem); // 次の1つを取得
};

てな感じか。

あとは C# で多用されてるような ICollection<T> のようなコンテナを抽象化したインタフェイスとか。

「好きなようにインターフェースを決定できる」というよりは、Generic なコンテナが実装/提供
するインタフェイスなので必然的にGenericになってるだけのような気もするけど。
523デフォルトの名無しさん:2006/09/12(火) 02:27:27
ちなみに手元にあるC++CodingStandardって本には
「静は動を助く:静的ポリモフィズムを使って動的ポリモフィズムのインターフェースを実装しよう。
たとえば抽象基本クラスCommandがあり、様々な実装を
template</*...*/> class ConcreteCommand : public Command
として定義するとしよう。」
って書いてあるが、いまいち意味がわからん。
複数の型に対して同一のアルゴリズムを提供するつもりでインターフェースをテンプレートクラスにしてるならアリで、
全然違うアルゴリズムに対してインターフェースが似てるからって理由でテンプレートクラスのインターフェースを使うのがナシだと
個人的には思う。
524デフォルトの名無しさん :2006/09/12(火) 09:17:27
Return-Path: <[email protected]>
Received: from kiyesrbuetekiotlreitbtiorne571671867716.com
(OFSfa-02p5-5.ppp11.odn.ad.jp [61.209.164.5])
Message-ID: 20060911234553.19067mail@mail.kiyesrbuetekiotlreitbtiorne571671867716.com
From: [email protected]

このメールは指名女性のご希望により※再配信※させていただきました。

20歳になったばっかのまいこ姫でしゅ。。
優しい優しいご主人様がほしくて噂のココに辿り着きましたぁぁ★
まいこ姫は見た目はオコチャマだけどぉ一生懸命、ご主人様を満足させるんでお返事下さいなぁ♪
ご主人様の大好きなコスプレで甘い甘いエッチがしたいなりィ★★
恥かしがりやなまいこ姫をリードしてくれる優しいご主人様からのメッセージ待ってましゅ!!
525デフォルトの名無しさん:2006/09/12(火) 09:44:19
そんなことより、一駅毎に説教たれる車掌をナントカしてくれ。
ラッシュアワーでぎゅうぎゅう詰めでいらいらしているのに、
一駅ごとに延々としゃべり続ける。同じことを。周りの乗客もうんざり顔。

「毎度ご乗車ありがとうございます。次の停車駅は○○です。車内混み合いまして大変ご迷惑おかけしておりますが、ご了承下さい。
 当社では現在、土日祝日もご利用いただける2dayチケットを発売しております。沿線施設の割引入場券としてもご利用いただけますので、
 行楽シーズンに、ぜひご利用下さい。なお、各車両にはに優先座席を用意しております。体の不自由な方、体調のお悪い方、妊婦の方、
 その他座席を必要とされる方がおられましたら、ぜひお譲り下さい。この列車の前から4両目は女性専用車両となっております。
 男性のお客様はご利用いただけませんので、ご了承下さい。あやまってお乗りの男性のお客様がおられましたら、隣の車両にお移り下さい。
 また、車内での携帯電話は電源をお切りになるか、マナーモードにしていただき、通話はご遠慮下さい。優先座席付近では、医療機器への
 影響のおそれもありますので、必ず電源をお切り下さい。この列車の一番前、および一番後ろの車両は携帯電話終日電源オフ車両です。
 座席位置にかかわらず、携帯電話の電源はお切り下さい。なお、車内および駅構内、駅ホームは全線禁煙となっております。
 おタバコはご遠慮下さい。当社ではただいまさわやかマナーキャンペーンを実施中です。快適な車内空間作りに皆様のご協力をお願いいたします。
 まもなく○○に到着します。お出口は進行方向右側です。ホームとの間が広くあいている場所がございますので、お足下にご注意下さい。
 お降りの際は傘などお忘れ物の無いよう、お気をつけ下さい。本日も○○電鉄をご利用いただき、誠にありがとうございました。まもなく○○です。」

これが全駅続く。延々と。もうね、アホかと。うんざり。
526デフォルトの名無しさん:2006/09/12(火) 17:29:33
本日も桃太郎電鉄をご利用いただき、誠にありがとうございました。
527デフォルトの名無しさん:2006/09/12(火) 20:36:32
下記コードの実行結果が"ab"ではなく"aa"となってしまうのは何故なのでしょうか?
ポインタと同じように、ベースクラスの参照に色んなサブクラスの参照を代入して処理を切り替えられないのでしょうか?

#include <iostream>
#include <string>

class Iface
{
public:
 virtual ~Iface() {};
 virtual void method() = 0;
};

class Impl : public Iface
{
public:
 Impl(const std::string& s) { s_ = s; }
 virtual void method() { std::cout << s_; }
private:
 std::string s_;
};

int main()
{
 Impl a("a");
 Impl b("b");
 Iface& c = a;
 c.method();
 c = b; // ここで何が起きているのかいまいち分かりません。
 c.method();
 return 0;
}
528デフォルトの名無しさん:2006/09/12(火) 20:38:56
暗黙的にアレ
529デフォルトの名無しさん:2006/09/12(火) 20:41:33
スライシング
530527:2006/09/12(火) 21:05:39
>>528,529
ありがとうございました!勉強し直して来ます。
531デフォルトの名無しさん:2006/09/13(水) 00:52:13
>>527
参照はポインタと違って一度設定された参照先を後から変更することはできない。

つまり例文のc = b;はcの参照先aを(cがIface型と宣言されているので)
Ifaceにキャストして、暗黙の代入演算子(operator=(const Iface& rhs))
を呼んでいるのと同じ事をしている。
そしてIfaceにはメンバフィールドが無いので代入演算子は何もしない。

参照先の変更が禁止されているので代入演算子が呼ばれるというのが
>>528の言う暗黙的にアレ。
cがIface型と宣言されているので何もしない代入演算子が呼ばれるというのが
>>529の言うスライシング(による弊害)。
532デフォルトの名無しさん:2006/09/13(水) 08:59:33
スマートポインタ使え
533デフォルトの名無しさん:2006/09/13(水) 11:57:01
std::ifstream とか std::ofstream って、
ファイルが開けないときに例外出したりします?
そもそもストリームって何らかの操作に失敗したとき、
フラグで表現するだけ?例外を出すときもある?
534デフォルトの名無しさん:2006/09/13(水) 12:13:05
>>533
ストリームライブラリはC++に例外機構が取り入れられる前から広く
使われていた。従ってデフォルトでは例外を送出しない。

しかし、メンバ関数exceptions()を適宜設定する事により、ある状態
フラグが立った時に例外を投げさせる事は出来る。投げる例外は
std::ios::failureである。

後は適当に調べてちょ。
535デフォルトの名無しさん:2006/09/13(水) 12:16:25
http://www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/8_3.htm

ここ辺りが参考になるかも。他にも"exceptions ストリーム"でぐぐればいろいろ
ヒットする。
536デフォルトの名無しさん:2006/09/13(水) 12:42:26
>>534-535 THX
537デフォルトの名無しさん:2006/09/13(水) 15:38:45
lokiって本当に役立つライブラリーなのでしょうか?
勉強する価値ありますか?

skypeのアドオンを作るための
++skypeとかいうライブラリーがlokiを使っていて
どうしようかと思ってる
538デフォルトの名無しさん:2006/09/13(水) 15:42:46
>>537
イディオムとしては面白いライブラリだけれど、
もはや古臭くて、モダンではない実装をしている。
これからはBoostを学ぶべき。
539デフォルトの名無しさん:2006/09/13(水) 15:59:22
>>537
そりゃ学んだ方がskypeのアドオン作りやすいと思うけど、
lokiがどんな風に実装されているかは学ぶ必要ないでしょ。
そんなこと知らなくても実装できるようになっているはずだから。

<loki/AssocVector.h>
<loki/Functor.h>
<loki/Singleton.h>
<loki/SmartPtr.h>
<loki/TypeTraits.h>
<loki/Typelist.h>
<loki/static_check.h>

使っているのはこれだけだね。

まあコンパイラのエラーメッセージを理解するのに、
ちょっと実装を知る必要もあるけどw
540539:2006/09/13(水) 16:00:24
ざっと見た感じ、lokiをaddon作成者が利用することはないみたい。
541デフォルトの名無しさん:2006/09/13(水) 22:40:35
>>409
> それはそうと、 const だけで3杯くらいご飯食えるよな。
昔そんな名前のスレがあったな…
542デフォルトの名無しさん:2006/09/13(水) 23:15:57
>>537
Lokiというか、Modern C++ Design読んだことないなら読む価値はあると思う。
日本語でC++メタプログラミング系の本って他に出てないよね…。
543デフォルトの名無しさん:2006/09/14(木) 01:36:26
>>541
typedef enumのためなら死ねるってスレもあった気がする。

その結果立ったのが「わたしとC++とどっちが大事なの!?」スレだったりもするわけだが。
544デフォルトの名無しさん:2006/09/14(木) 17:46:15
try - catch以外で呼び出し元の特定の位置に移動する方法ってありますか?

void test()
{
while(1){
...
if( flag ) throw 0;
}
}

void main()
{
try{
test();
}catch( int e ){
... // 特定の位置
}
}
545デフォルトの名無しさん:2006/09/14(木) 17:52:23
意味分からん
546デフォルトの名無しさん:2006/09/14(木) 18:02:40
>>544 longjmp とか。
もう10年くらい使ってない気がする。
goto は一年に数回使ってるのに。
547デフォルトの名無しさん:2006/09/14(木) 18:08:36
戻り値で判断すればいいんじゃね?
548デフォルトの名無しさん:2006/09/14(木) 18:21:36
C++じゃsetjmp/longjmpは使わないほうがいいよ。(何もかも承知で使うのはかまわないけど)
リソースリークが起こりやすい。
549デフォルトの名無しさん:2006/09/14(木) 19:30:22
引数つきコンストラクタから引数無しコンストラクタを呼ぶと、
引数無しコンストラクタの動作がおかしくなってしまいます。
仕様的にできないようなかすかな記憶もあるんですが、
gcc4.1ではwarningも出さないし、(おかしいけど)一応実行はされているようです。
再帰的にコンストラクタを呼ぶのは規格&GCC拡張的にダメなんでしょうか?
それともバグでしょうか?
550デフォルトの名無しさん:2006/09/14(木) 19:35:34
>>549
引数無しコンストラクタを呼ぶ、とはどう記述するんですか?
CHoge::CHoge(int)
{
this->CHoge();
}
みたいに書いてみたってこと?
単なるCHoge();は一時オブジェクトを作っておしまいだしなあ
551デフォルトの名無しさん:2006/09/14(木) 19:47:36
>>550
ぐは。思いっきりCHoge();でよびだしてました。。
基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
552デフォルトの名無しさん:2006/09/14(木) 21:46:57
classが勝手に呼ぶやつは
printfかOutputDebugString使って
挙動調べるなりして自分で勉強した方がいいと思うよ
virtualなデストラクタ関連も
553デフォルトの名無しさん:2006/09/14(木) 21:53:25
>>549
引数無しコンストラクタを呼ぶなら、new 使わないと駄目だ。

CHoae( Arg arg )
{
 new (this) CHoge;
 this->member = arg;
}

ただ、デフォルトコンストラクタを持つメンバ変数が合った場合、
なんか微妙なことになりそうな気はする。
554デフォルトの名無しさん:2006/09/14(木) 22:01:24
*this = CHoge();

でもいいらしい。ケースバイケースだけど。
555デフォルトの名無しさん:2006/09/14(木) 22:06:17
デフォルトコンストラクタをだけを行うpimpl作ればいいんじゃないの。
class CHogeImpl{CHogeImpl(){...}};
class CHoge : private CHogeImpl {
    CHoge(){}
    CHoge(int n){}
};
556デフォルトの名無しさん:2006/09/14(木) 22:11:41
>>554
コンストラクタ内では、thisは const T *this ではなく、T *this なの?
557556:2006/09/14(木) 22:12:40
あ、ごめん、俺の勘違い。
T * const thisだね。
だから文法的には問題ない。
558デフォルトの名無しさん:2006/09/14(木) 22:13:24
>>556
const属性は付かないよ。やってみ。
559デフォルトの名無しさん:2006/09/14(木) 22:15:04
どちらにしろコンストラクタからコンストラクタを呼び出すのは、
例外安全などを考えるとあまり好ましくないね。

何も考えないと結果も残らないしw
560デフォルトの名無しさん:2006/09/14(木) 22:16:23
>>553
そんな絶対に使っちゃダメな糞コードを晒したらダメだろバカか。

>>551
>基底クラスのコンストラクタはそれでいけるので、いけると思ってました。。
基底クラスだってそれでいけねーよ。
561デフォルトの名無しさん:2006/09/15(金) 01:26:36
C#ならpublic CHoge(int i) : this() {}と簡単なんだが、
C++なら引数なしコンストラクタの実装を
privateメンバ関数にするとかが一般的じゃね。
562デフォルトの名無しさん:2006/09/15(金) 02:03:22
ちょっとまて。
お前らコンストラクタ内からコンストラクタ呼び出すのを
本気で正気なコードだと思ってるのか??
煽りでなくマジで。

組み込み型しか使ってない単純クラスなら
特に問題になることは無いのかもしれんが、
それでも普通は各コンストラクタで共通の初期化部分を
関数としてくくりだして、使いまわすのが普通だろ?
それとも俺の気が狂ってるのか???
563デフォルトの名無しさん:2006/09/15(金) 02:23:08
仕様を確認してるだけで
是非を話し合ってるわけじゃないっしょ
564デフォルトの名無しさん:2006/09/15(金) 02:25:41
Javaでいえば、
TestClass(int a)
{
this.val=a;
}
TestClass() {
this(32);
}

>>562
ってことじゃないか?
565デフォルトの名無しさん:2006/09/15(金) 02:32:41
>>562
もちろんまともなプログラミングとは思っていない。作法としても
間違ってる。
ただ、こんな書き方ができるというだけで。お遊び程度。
566デフォルトの名無しさん:2006/09/15(金) 02:42:53
ネタ的に遊んでただけなんだよね。
いや、よかった。
俺の気がフれたのかと思って激しく動揺しちまったよ。
567デフォルトの名無しさん:2006/09/15(金) 03:33:25
質問なのですが、以下のようなコードでCharTがcharまたはwchar_tを表すときにCharTタイプのヌル文字を関数内で取得したいのですが何か良い方法はありませんでしょうか?

template <typename CharT>
void hoge(){
  // ここで CharT タイプのヌル文字を取得したい
}
568デフォルトの名無しさん:2006/09/15(金) 03:46:41
CharT c = CharT(0); で、大抵は大丈夫だと思うけど
569デフォルトの名無しさん:2006/09/15(金) 09:07:55
CharT()
570デフォルトの名無しさん:2006/09/15(金) 09:17:16
あ....なるほどorz
どうもありがとうございましたorz
571デフォルトの名無しさん:2006/09/15(金) 10:28:59
厳密にやるなら
  std::char_traits<CharT>::eos()
かね
572デフォルトの名無しさん:2006/09/15(金) 13:54:58

  可愛い女子高生の彼女の家に夕食お呼ばれされて彼女と妹さんとお父さんとで話してた
  「○○くんは毎日インターネットしすぎだよ」
  「うわ、おにいちゃんやらしい!」
  「ほほう、なんでネットがやらしいんだ?」
  「だってアダルトサイトとか」
  「そんなサイトばかりじゃないだろ。というかネットと聞いてすぐそんなサイトを
  思い浮かべるおまえのほうが怪しい」
  「なっ!……」
  「ところでブラウザって閲覧の履歴が残るんだけどさ」
  「それがどうしたってわけっ?」
  「俺がいない間に勝手に部屋にきてPCいじるのは許すとしても、
  ネットの巡回履歴は消しとけよ。特に『あの手』のサイトをみた後くらい」
  「ひっ!?ち、違っ、わたしはただその下着の通販サイトを…見てたら…」
  「下着……必要なの?おまえの大きさで? ああ補正用とか?ビッグにみせるアレとか?」
  「もう!○○くん、女の子にそんな事いっちゃ駄目だよ。でも…まあトップを隠すだけなら
  ばんそうこうでも…」
  「もうおねえちゃん!! おとうさん何かいってやってよ!」
  「下着を買うより牛乳を飲みなさい」
  酷い家族だ 助けて(;´Д`)

573デフォルトの名無しさん:2006/09/15(金) 23:43:07
調子に乗ってtemplate使いまくってたら、参照の参照をやってしまってエラーを出してしまいました。
C++でもJavaみたいに参照の参照もただの参照のように扱う方法を教えていただけないでしょうか。
またもしC++でそれが実現できないなら、オブジェクトのやり取りはポインタで行うようにしていくべきですか?
574デフォルトの名無しさん:2006/09/15(金) 23:44:38
>>573
そうでもない。
575デフォルトの名無しさん:2006/09/15(金) 23:47:06
>>573
template<typename T>
struct ref{typedef T&type;};
template<typename T>
struct ref<T&>{typedef T&type;};
576デフォルトの名無しさん:2006/09/16(土) 00:13:58
ゲームのイベントシーンの文章を返す関数で
char* text(int eventsyurui){
switch (eventsyurui){
case 0:
return "(イベントシーン一つ分のメチャ長い文字列)";
break;

}
}
なんてのを作ったんですがC2026エラー(文字列が長すぎて後ろが切り捨てられる)の壁にぶち当たりました。
いい解決法あったら教えてください。
577デフォルトの名無しさん:2006/09/16(土) 00:16:53
プログラムに直接書くのは止めようぜとしか言えない。
578デフォルトの名無しさん:2006/09/16(土) 00:18:03
全部が1行ってことはないだろうから
改行毎に分けて配列にでもしたら
579デフォルトの名無しさん:2006/09/16(土) 00:45:02
そんなプログラムを書く奴は氏ねばいい
580デフォルトの名無しさん:2006/09/16(土) 01:08:26
どうでもいいが具体的にどんなアプリケーションに使うコードなのか
書くのってなんか恥ずかしくない?特に>>576とかどうみてもエロゲ
581デフォルトの名無しさん:2006/09/16(土) 01:10:35
return "(イベントシーン"
 "一つ分の"
 "メチャ長い文字列)";
って感じで一応回避可能。
あと、戻り値はconst char *にしる。
582デフォルトの名無しさん:2006/09/16(土) 01:15:50
>>580
むしろエロゲでこんな作り方はしないだろ。
こういう実装でなんとかなりそうなのは、RPG辺りかと。
……RPGのエロゲ、というのは無しの方向で。
583デフォルトの名無しさん:2006/09/16(土) 01:24:20
>>573
つremove_reference
584576:2006/09/16(土) 01:56:18
あ、いえエロゲではないです…ということで。

>>578
以前それやってたんですが
strcpy(text[0],"今日は");
strcpy(text[1],"いい天気だ");
と書いてから気が変わって行を追加したり逆に行を削ったりとかするの
とっても面倒なんです。(特に追加時は以降の全部の行の配列を+1しないといけない)
585576:2006/09/16(土) 02:00:11
>>581さんありがとうございます。
とりあえずそのやり方でやってみます。
586デフォルトの名無しさん:2006/09/16(土) 02:47:32
>>584
分かっててネタで釣ってるんだろうけど
ここは初心者も見てるだろうし混乱防止のため言って置く。
きみの考え方はかなりVBに影響を受けて毒されている。

char *text[] = {
"今日は",
"いい天気だ",
"イベントシーン",
"一つ分の",
"メチャ長い文字列",
"" /* 終端 */
};

これなら気が変わっても大丈夫だ。
587デフォルトの名無しさん:2006/09/16(土) 02:53:45
Lつけなくてよかったっけ
588デフォルトの名無しさん:2006/09/16(土) 06:17:22
そりゃwide charにする場合だろ > L

ところでさ、終端ってNULLにしない?

なんかC++というよりCっぽいな・・・
589デフォルトの名無しさん:2006/09/16(土) 09:00:41
>586だと空行作れなくて不便だとかいろいろあるから、普通はNULLだろうなぁ。
590デフォルトの名無しさん:2006/09/16(土) 09:01:16
つーか、std::vector<std::string>返すようにすれば終端要らないけど。
591デフォルトの名無しさん:2006/09/16(土) 09:05:42
>>590 激しくコピーが発生しそうだな。
あ、でも string の実装によっては、
ポインタだけのコピーですむのか??
592デフォルトの名無しさん:2006/09/16(土) 09:37:23
無駄が多いな
593デフォルトの名無しさん:2006/09/16(土) 09:50:06
>>591
( ゚д゚)ポカーン
594デフォルトの名無しさん:2006/09/16(土) 09:54:43
>>593 え?なんか間違ってたっけ??
string の実装ってまちまちだとおもうんだけど、
リファレンスカウントとかCOWとか使ってるんじゃないの?
595デフォルトの名無しさん:2006/09/16(土) 10:17:22
string の値渡しって、文字列丸ごとコピーしてるんだよね?違ったっけ?
596デフォルトの名無しさん:2006/09/16(土) 10:18:56
>>595
基本的にはそう。
>>594みたいな実装はマルチスレッドが絡むとパフォーマンスの低下が著しいので近年ではあまりやらない。
597デフォルトの名無しさん:2006/09/16(土) 10:18:57
あってる
598デフォルトの名無しさん:2006/09/16(土) 10:19:53
1秒違いで負けたww
599デフォルトの名無しさん:2006/09/16(土) 10:36:39
std::vector<std::string>ってだけで、
> 激しくコピーが発生しそうだな。
にポカーンですが…
使い方によるでしょ…
600デフォルトの名無しさん:2006/09/16(土) 10:40:22
>>596 そういうものなのか、実は恥ずかしながらいままで
マルチスレッドというものを意識したことがなかった。
ファイルやDBのロックはマルチプロセスの話だしね。

string 自体がリファレンスカウントの機能を持たず、
言語としてガベコレの機構を持つ場合にはマルチスレッド
性能の低下は招かないの?たとえばC#とか。

C++ では std::auto_ptr とか boost::sahred_ptr
なんかで受け渡すべき?
601デフォルトの名無しさん:2006/09/16(土) 10:41:43
>>599 std::vector<std::string>返すっていうことなので、
一時オブジェクトが生成されてコピーが発生しそうだな、
と思いました。RVO がうまく働くのかもしれませんが。
602デフォルトの名無しさん:2006/09/16(土) 10:46:49
たとえ無駄が生じることが予想できようと、
それが実際に問題になるまでは気にすることはない。

こういう考えはだめか?
603デフォルトの名無しさん:2006/09/16(土) 10:49:24
ま、最終的にはバランス感覚の問題でしょうな。
パフォーマンス周りは実測を基本とする考え方からしたら間違っていないし、
かといって確実に無駄といえる状況を放置するのは感心しない。
604デフォルトの名無しさん:2006/09/16(土) 11:31:52
> string 自体がリファレンスカウントの機能を持たず、
> 言語としてガベコレの機構を持つ場合にはマルチスレッド
> 性能の低下は招かないの?たとえばC#とか。

ちょっとチラシの裏借りますね

C#(というか.NET)やJavaの最近の実装は、若いオブジェクトのための
ヒープのようなものをスレッドごとに持つ。
ガベコレが動作しない間はこのヒープ状のものはロックされない。
だからstringを作って足してコピーして・・・なんかを繰り返しても、
他スレッドの動作を(同期機構を使わないという点で)妨げることはない。
ただし、live objectが超大量になると、ガベコレ期間が悲惨なことになる。
大規模アプリ、Eclipseなんかが苦労してる。

一方、C/C++は通常はヒープがスレッドごとじゃないから、new/delete/
malloc/freeするたびにヒープのロックが発生する。複数スレッドが
new/deleteをガンガンやるとひどいことになりかねない。
std::mapをコピーすると結構起こってそうなんだがどうだろう。
スレッドごとに独立していることが保証されているなら、カスタム
アロケータの利用を考えてもよいかもしれない。でも、スレッド間で
安全に受け渡すのが難しくなるという諸刃の剣。素人にはおすすめしない。

オブジェクトのサイズや個数、ライフサイクルなんかに依存しまくる話だから
一般的にこうすべし、というのは言いにくいんだよね。
逆にいうとC#やJavaが取っている手法法は「使いすてオブジェクト多杉」
という一般的な傾向から導かれたものだから、参考にしてもよいと思う。

2年以上前の知識ゆえ間違ってたら指摘夜露死苦

以上、チラシの裏でした。
605デフォルトの名無しさん:2006/09/16(土) 15:12:18
>>602
最初の相談を見る限りじゃ絶対やらない方がいい希ガスw
606デフォルトの名無しさん:2006/09/16(土) 16:09:50
質問です

class abc
{
public:
 virtual void uuu()=0;
}

class def:abc
{
public:
 void uuu();
}

abc *po;
def hoge;

po=&hoge;
hoge->uuu();

こんな感じのプログラムなんですが、エラーが出ます
親クラスのポインタが子クラスを示すことはできないんですか?
ttp://d.hatena.ne.jp/kenmo/20050705
このサイトを参考にしたんですが、ここではできてるみたいなんです
607デフォルトの名無しさん:2006/09/16(土) 16:11:40
>>606
とりあえずエラーメッセージを晒そうな、な?
608デフォルトの名無しさん:2006/09/16(土) 16:14:16
>>607
'type cast' : 'class def *' から 'class abc *' の変換は存在しますが、アクセスできません。
609デフォルトの名無しさん:2006/09/16(土) 16:28:41
>>606
class では継承関係もデフォルトで private だよ。
public 付けないと、クラス外からは継承関係を利用できない。
610デフォルトの名無しさん:2006/09/16(土) 16:29:40
>>606
そのサイトは間違っている。
コンパイルしてないんだろう。よくあるこった。

class def : public abc

とすればいい
611デフォルトの名無しさん:2006/09/16(土) 16:30:39
>>606
class def: public abc {
612デフォルトの名無しさん:2006/09/16(土) 16:35:08
>>609-611
ありがとうございました
613デフォルトの名無しさん:2006/09/16(土) 16:44:27
もう話終わってるみたいだけど

po=&hoge;
hoge->uuu();

これ意味あんの?

po=&hoge;
po->uuu();

こうじゃないの?
614デフォルトの名無しさん:2006/09/16(土) 16:48:07
>>613
書き間違えてました
その通りです。すみません
615デフォルトの名無しさん:2006/09/16(土) 17:19:02
すみません、また質問です。
class Cdote
{
public:
Cdote();
void run();
};

class Cmain
{
private:
static Cmain singleton;
static Cdote *pdote;
Cmain();

public:
static void cont()
{
Cdote dotei;
pdote=&dotei;
pdote->run();
}
};

int main(void)
{
Cmain::cont();
return 0;
}

さっきのコードの別の部分みたいな感じなんですが、エラーが出ました
外部シンボル ""private: static class Cdote * Cmain::pdote" (?pdote@Cmain@@0PAVCdote@@A)" は未解決です
616デフォルトの名無しさん:2006/09/16(土) 17:25:18
( ゚д゚) ポカーン
617デフォルトの名無しさん:2006/09/16(土) 17:33:03
Cmain Cmain::pdote = うんたらかんたら;
618デフォルトの名無しさん:2006/09/16(土) 17:33:41
間違えた
Cmain* Cmain::pdote =
つまりstatic変数はクラス外での定義が必要。
619デフォルトの名無しさん:2006/09/16(土) 17:43:47
>>618
'private: static class Cdote * Cmain::pdote' : 再定義されています。異なる基本型です。
またエラーが出たんですが、どうすればいいんでしょうか
620デフォルトの名無しさん:2006/09/16(土) 17:45:57
Cdote* Cmain::pdote = 0;
621デフォルトの名無しさん:2006/09/16(土) 17:47:24
class Cdote {
public:
Cdote() {}
void run() {}
};

class Cmain {
private:
static Cmain singleton;
static Cdote *pdote;
Cmain() {}
public:
static void cont() {
Cdote dotei;
pdote = &dotei;
pdote->run();
}
};

Cdote* Cmain::pdote;

int main(void)
{
Cmain::cont();

return 0;
}
622デフォルトの名無しさん:2006/09/16(土) 17:53:16
>>620-621
ありがとうございました!
623デフォルトの名無しさん:2006/09/16(土) 17:58:13
ザ・思考力0
624デフォルトの名無しさん:2006/09/16(土) 18:37:43
例外が起こった場所を表示させるのにはどうしたらいいのでしょうか。
例外のクラスはstd::exceptionです。
625デフォルトの名無しさん:2006/09/16(土) 18:38:16
シングルとかドーテーとか嫌な気分になるな…
626デフォルトの名無しさん:2006/09/16(土) 18:40:10
>>624
答えになっていない答えだけど、そういう機能を持ったデバッガを使うのが簡単。
627デフォルトの名無しさん:2006/09/16(土) 18:42:42
>>624 VC++ をはじめとして IDE 付属のデバッガには
ついているんじゃないか?そういう機能.
直接例外が起こった場所を表示してくれなくても,
スタックをワインドバック(っていうのか?)すれば
わかるだろう.
628デフォルトの名無しさん:2006/09/16(土) 18:54:43
環境を言うべきでした。
gdbの使い方を調べてみます。
ありがとうございまいた。
629デフォルトの名無しさん:2006/09/16(土) 21:10:14
バックトレースじゃ判らないんだっけ?
bt
630デフォルトの名無しさん:2006/09/16(土) 21:41:11
throw するところで止まってればバックトレースが使える。
catch してからじゃわからない。
631デフォルトの名無しさん:2006/09/16(土) 23:38:14
catch された時点でそれまでのスタックは破棄されて
当該オブジェクトはデストラクトされるんだっけ?
632デフォルトの名無しさん:2006/09/16(土) 23:59:08
当該オブジェクトって何よ?
633デフォルトの名無しさん:2006/09/16(土) 23:59:24
スコープから外れればデストラクトされる
634デフォルトの名無しさん:2006/09/17(日) 00:03:36
>>632 破棄されたスタックに確保されていたオブジェクト
635デフォルトの名無しさん:2006/09/17(日) 01:31:56
漏れの頭蓋骨もデストラクトしそうです。
636デフォルトの名無しさん:2006/09/17(日) 02:54:05
>>604 なかなか。きっとブログ作ると自分と似てる人たちがあつまってくるよ。
637600:2006/09/17(日) 05:52:41
>>604 遅レスだけど、よくわかった。
スレッドローカルなヒープがあるか無いかと言うことか。
638デフォルトの名無しさん:2006/09/17(日) 05:56:51
>>635
安心しろ。
途中で例外が発生して楽に死ねる
639C++ 入門中:2006/09/17(日) 15:32:04
現在VS2005にてC++の勉強を始めたのですが、
MFCプログラミングはマスターしなくても実務で堪えうる堅牢な
システムを簡単に作れる気がするのですが、
(Windows Application として)

C++を勉強する際には、それもマスターしなければダメなのでしょうか?

640デフォルトの名無しさん:2006/09/17(日) 15:53:46
BMP画像(24bit)のRGB値をTextファイル出力するプログラムを
作成してみたのですが、BMP画像が正常に読み込める場合と
読み取りエラー(?)が発生してtextに"-1"が書き込まれてしまう場合
があります。これはBMPファイルが壊れているのか、
それともプログラムが悪いのか分かりません。何か解決方法があれば教えてください
641 _:2006/09/17(日) 16:00:55

>>640
自分で調べろ
642デフォルトの名無しさん:2006/09/17(日) 16:02:04
>>639
仕事で必要なら勉強すればいいし、そうでなくても好きにすればいい。
643デフォルトの名無しさん:2006/09/17(日) 16:19:44
>>639
MFCを使わずにMFCと同じだけのことをするプログラムを書く労力より、MFCを覚える労力のほうが大体は少ない。
まあMFCに限った話じゃないが、大抵のライブラリとかツールはそういうもんだ。
644デフォルトの名無しさん:2006/09/17(日) 16:47:19
MoreEffectiveC++第3版の翻訳本ってまだですかね?
第2版のあまりの評判の悪さにスルーして第3版を待っているのですが
待ちきれないです
645デフォルトの名無しさん:2006/09/17(日) 16:49:35
とっくにでとるがな
646デフォルトの名無しさん:2006/09/17(日) 17:00:39
>>639
簡単に迅速に業務アプリを作るのが目的なだとすると、
今なら.NET覚えたほうが良くね?
647 実は 639:2006/09/17(日) 17:27:19
>>646
実は、C# / VB.net での開発経験は3年程ありまして
.NET環境での一通りの開発は出来ます。

しかしながら、いい加減これらの言語だけをずっと使っておりますので
飽きて参りました。

そういった経緯でC++.netを勉強し始めたのです。
VSを使えばMFCでなくともフォーム回りとかは簡単に
スグ作れるのになぜ参考書等にはなぜかそのMFCを使った
プログラミング手法が解説されている事に疑問を持ったからです。

実務でMFCを使う事ってありますか?

648デフォルトの名無しさん:2006/09/17(日) 17:30:20
なんていうか、スレ違いじゃね?
649デフォルトの名無しさん:2006/09/17(日) 18:49:02
どう見てもスレ違いです。
650デフォルトの名無しさん:2006/09/17(日) 19:11:12
普通にスルーでよいでしょ。
651デフォルトの名無しさん:2006/09/17(日) 20:18:13
>>644
EffectiveC++ 第3版でしょ?出版社が変わってピアソンになったよ。
俺はとうの昔に買って読んでる。2色刷りだよ。
652デフォルトの名無しさん:2006/09/18(月) 03:24:12
うちのは改訂2版なんだけど、買いなおす価値あるかい?
653デフォルトの名無しさん:2006/09/18(月) 04:04:47
Moreじゃなくて無印のEffective C++のことだよな?
だったら2版と3版じゃ全然違う本になってるから
買い「直す」なんてならないよ。そして相変わらず必読。
654デフォルトの名無しさん:2006/09/18(月) 04:10:41
そんなに違うのかー。
旧2版の方は十分償却してるだろうから、検討しようかな。
ちょっと立ち読みしてくるわ。サンクス。
655デフォルトの名無しさん:2006/09/18(月) 09:18:43
operator< ってのは、メンバー関数ポインタに適用できなくて正解ですか?
struct A {
void f1() {}
void f2() {}
};
int main() {
typedef void (A::*ptmf)();
ptmf a = &A::f1;
ptmf b = &A::f2;
return a < b; // ←だとNG、return a != b; なら OK
}
コンテナに突っ込んでたら怒られました。g++ 4.0.1 です。
656デフォルトの名無しさん:2006/09/18(月) 09:25:03
メンバポインタの大小比較は定義されてないだろうナァ
比較演算ができること自体も驚きだが
657デフォルトの名無しさん:2006/09/18(月) 11:14:41
>>647
実務で全角アルファベットを使うことはほとんどないです
658デフォルトの名無しさん:2006/09/18(月) 11:18:13
メンバー関数でなくても(ry
659デフォルトの名無しさん:2006/09/18(月) 11:19:38
>>656
>比較演算ができること自体も驚きだが

出来てないんじゃ?
660デフォルトの名無しさん:2006/09/18(月) 12:07:23
>>655
>コンテナに突っ込んでたら怒られました。
Loki::TypeInfoを使ってmapに入れるとか

#include <loki/LokiTypeInfo.h>
#include <utility>
struct A {
void f1() {}
void f2() {}
};
typedef void (A::*ptmf)();
typedef std::pair <Loki::TypeInfo, ptmf> TypeInfo_ptmf_pair;
TypeInfo_ptmf_pair get (ptmf p) {return TypeInfo_ptmf_pair (Loki::TypeInfo (typeid (p)), p);}
int main() {
TypeInfo_ptmf_pair a (get (&A::f1));
TypeInfo_ptmf_pair b (get (&A::f2));
return a.first < b.first; // ←だとNG、return a != b; なら OK
}
661デフォルトの名無しさん:2006/09/18(月) 12:46:57
>>660
意味不明。TypeInfoで判定してどうすんだよ。
A::f1とA::f2の型が違うってのか?

>>655
typedef void (A::*ptmf)();
struct Comp{
bool operator()(const ptmf& u, const ptmf& v){
return memcmp(&u, &v, sizeof(u))<0;
}
};

std::set<ptmf, Comp> s;
662660:2006/09/18(月) 13:19:31
>>661
>A::f1とA::f2の型が違うってのか?
ボケてたスンマセン
663644:2006/09/18(月) 13:25:59
MoreEffectiveC++第3版の翻訳本って言ってんだろウワァァァァァァヽ(`Д´)ノァァァァァァン!
勝手に脳内でEffectiveC++第3版にすんな
EffectiveC++第3版ならもう買ってある。読んでないけど
664デフォルトの名無しさん:2006/09/18(月) 13:37:11
>>663
addison-wesley本家のサイトでみてみたが
more effective c++は
3rdはおろか2ndもなくて
現行で1st editionみたいなんだけど
665デフォルトの名無しさん:2006/09/18(月) 13:37:31
>>663
原書買えばいいじゃねーか。
666デフォルトの名無しさん:2006/09/18(月) 13:40:03
addison-wesley本家ってこれね
http://www.awl.com/cseng/titles/0-201-63371-X/
667デフォルトの名無しさん:2006/09/18(月) 13:45:21
質問させてください。
この度PC上で起きるイベント(作業ウィンドウの変更やウェブページの移動等)を記録するプログラムを作る事になりました。
ネット上等を調べてどうやらSetWindowsHookExという関数を使う事は分かったのですが、具体的なコードの書き方(例題等)が分かりません。
どこか詳しく述べているサイト等を知っている方が居ましたら教えてください。

流れ的には、作業ウィンドウ変更→プログラムが感知(フック)→その内容をテキストに書き込み、という感じにしたいです。
よろしくお願いします。
668デフォルトの名無しさん:2006/09/18(月) 13:58:50
あれ、プラットフォーム依存はすれ違いじゃなかったっけ。
669デフォルトの名無しさん:2006/09/18(月) 14:01:37
>>659
operator==, operator!=も比較演算じゃろ
670655:2006/09/18(月) 18:28:42
>>660-661
どうもです。vector 二つ使ってベタな key value にします。
671デフォルトの名無しさん:2006/09/18(月) 20:03:19
>>670
std::map
672デフォルトの名無しさん:2006/09/19(火) 23:06:56
スレイ違いかもしれんけど、STLのalgorithm使ってる?
673デフォルトの名無しさん:2006/09/19(火) 23:08:17
使える場面なら使ってる
674デフォルトの名無しさん:2006/09/19(火) 23:08:49
>>672 雑談ならヤメロ。相談なら情報を小出しにするな。
675デフォルトの名無しさん:2006/09/19(火) 23:24:38
C++0xに提案されている、lambda式が採用されれば、面白いことになりそうなんだけどなぁ>STLのアルゴリズム
676デフォルトの名無しさん:2006/09/19(火) 23:35:08
俺の場合は、どっちかというと<boost/range_ex/algorithm.hpp>を使うほうが多い。
677デフォルトの名無しさん:2006/09/20(水) 02:40:03
>>674
雑談じゃないから続けておk
678デフォルトの名無しさん:2006/09/20(水) 06:43:29
lamba式って提案されてるの?
採用されればうれしいけど、さすがにされない気がする
679デフォルトの名無しさん:2006/09/20(水) 07:11:39
boost じゃ駄目なん?
680デフォルトの名無しさん:2006/09/20(水) 07:17:22
>>679
駄目
681デフォルトの名無しさん:2006/09/20(水) 08:25:04
>>678
けど提案している中にStroustrupがいるぜ?

Lambda expressions and closures for C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1968.pdf

ちなみに提案されているのは"lambda"だけどな。


いまいちシンタックスが好きじゃないな。
682デフォルトの名無しさん:2006/09/20(水) 08:46:54
確かこんな感じになるはず。

vector<int> v ;
char const * str = "elem : " ;

for_each(v.begin(), v.end(),
  <>(int x) { std::cout << str << x << std::endl ; }
) ;

やはり邪悪かな。
683デフォルトの名無しさん:2006/09/20(水) 09:02:17
導入されたら、ポインタの次にラムダ分かりませんという奴続出な予感。
684デフォルトの名無しさん:2006/09/20(水) 09:57:00
vector<int> v;
auto it = v.begin();
while(it != v.end())
{
std::cout << str << it << std::endl;
}

とかの方でなく?
685デフォルトの名無しさん:2006/09/20(水) 11:26:34
どうでもいいが
std::cout << str << *it << std::endl;
じゃないのか?
686デフォルトの名無しさん:2006/09/20(水) 12:03:13
>>682
返り値型指定なしのlambda式の登場で、
またname lookupが複雑になりそう…
687デフォルトの名無しさん:2006/09/20(水) 13:17:18
>>686
いや、単に省略できるだけで、
return文を見てコンパイラが決めるだけらしいから。
return文がなければ、voidとみなす。
688デフォルトの名無しさん:2006/09/20(水) 18:11:59
いやdecltypeで既に複雑になると言われているので…
689デフォルトの名無しさん:2006/09/20(水) 22:11:45
682の何が邪悪なの?
今やアレ程度のlamda式が無い言語の方が希少なはずだけど。


ひょっとして、<>って部分だけを指していってんのか?
だとしたら単なるアホなんだけど、まさかな。
690デフォルトの名無しさん:2006/09/20(水) 22:13:21
どうでもいいが、lambdaを頭の中ではランバダと読んでしまって困る。
691デフォルトの名無しさん:2006/09/20(水) 22:29:46
マサルさんを思い出した
692デフォルトの名無しさん:2006/09/20(水) 22:33:19
boostみたいに必死こくくらいだったらおとなしく言語仕様に入れた方がいいな>lambda
というより
<>(int x) ...
この記述は…<>が名前のない関数名を示すみたいな感じなの?
693デフォルトの名無しさん:2006/09/20(水) 22:45:34
>>692
そういうことらしい。
tempate <typename T>の<>からの連想だとかだった気がする。
694デフォルトの名無しさん:2006/09/20(水) 23:23:52
まあ><よりマシか
695デフォルトの名無しさん:2006/09/20(水) 23:51:22
テンプレートラムダは出来るようにするのかな?
出来ないと嘘だとは思うけど。
696デフォルトの名無しさん:2006/09/20(水) 23:51:51
ラムダ分かりません><
697デフォルトの名無しさん:2006/09/21(木) 00:17:07
>>695
提案では、lambda式はジェネリックであってはならないと書いてあるけど。
ジェネリックってのはなんだろ。
こういうのもダメなのかな?

template < typename T >
void f(T x)
{
(<>() extern(x){ std::cout << x << std::endl ; })() ;
}
698デフォルトの名無しさん:2006/09/21(木) 05:22:59
正直なところ利用価値がよくわからんちん。
誰かお母さんみたいに優しく教えてくれ。
699デフォルトの名無しさん:2006/09/21(木) 05:38:18
>>698
you lose
700デフォルトの名無しさん:2006/09/21(木) 07:41:58
>>693
lambda式はテンプレートにはしないと提案に書いてあるのにか?
701デフォルトの名無しさん:2006/09/21(木) 08:01:54
言語仕様に入ったら boost::lambda はお払い箱?
702デフォルトの名無しさん:2006/09/21(木) 08:25:07
あれはあれで使いやすいしなあ。
703デフォルトの名無しさん:2006/09/21(木) 09:27:15
たしかに見た感じはboostのが分かりやすい
でもメンバ関数呼ぼうとしたときは0xの方が分かりやすいかな
704デフォルトの名無しさん:2006/09/21(木) 13:12:49
lambdaを使うとなにかいいことあるの?
705デフォルトの名無しさん:2006/09/21(木) 13:28:26
使い捨ての関数をその場限りでかける。

っていうか名前考えなくていいだけでありがたい
706デフォルトの名無しさん:2006/09/21(木) 14:44:18
すいません。以下のようなプログラムで、aa.test(), bb.test(), cc.test()
のメソッドポインタを格納できるような配列はどのように書けばよろしいでしょうか?
クラスが違うメソッドのポインタを配列に格納するのは無理なのでしょうか?

#include <stdio.h>
class a{
 public:
  void test(){printf("a");}
};
class b{
 public:
  void test(){printf("b");}
};
class c{
 public:
  void test(){printf("c");}
};
int main(){
 a aa; b bb;c cc;
}
707デフォルトの名無しさん:2006/09/21(木) 15:08:32
そのままでは無理。

testという名前が同じであることが大事なら、templateで継承関係を後付けすることができる。

708デフォルトの名無しさん:2006/09/21(木) 15:19:21
bindしてboost::functionに入れるという手もある。
709デフォルトの名無しさん:2006/09/21(木) 16:17:48
>>706
struct ITest { virtual void test() = 0; }

class a : public ITest { virtual void test()
710デフォルトの名無しさん:2006/09/21(木) 16:20:35
途中で送信しちまった。

struct itest { virtual void test() = 0; }
class a : public itest { virtual void test() { printf("a"); } }
class b : public itest { virtual void test() { printf("b"); } }
class c : public itest { virtual void test() { printf("c"); } }
711デフォルトの名無しさん:2006/09/21(木) 16:23:14
そこまで親切丁寧に書かんでも
712デフォルトの名無しさん:2006/09/21(木) 16:54:07
基本的には>>710なんだろうけれども、
boost の使用に抵抗が無ければboost::functionが良いと思う。
C# の delegate 並みに楽ちん。
713デフォルトの名無しさん:2006/09/21(木) 16:56:56
boost馬鹿は死んでね
714デフォルトの名無しさん:2006/09/21(木) 16:58:54
Boostを使えない馬鹿が何か言ってる。
715デフォルトの名無しさん:2006/09/21(木) 17:41:53
Boostが嫌でも、functionもbindもTR1に入っているから、
将来のC++標準入りの可能性は高い。

まあいつのことだかわからないけどね。
716710:2006/09/21(木) 17:49:51
(1)template/boostを使う方法
  →template/boostの使用は不可(開発環境での制限)

(2)>>710の方法
 → class a,b,cは他人が提供するクラスであり、
   void型ということとメソッド名以外は任意となる(仕様)

そのままでは無理ということで、
全く別の方法を考えて見ます

レスありがとうございましたm(_ _)m
717706:2006/09/21(木) 17:51:00
710ではなくて706でしたorz
718デフォルトの名無しさん:2006/09/21(木) 18:11:01
テンプレートが使えなければマクロでごり押ししてしまえ。
class test_holder {
public:
    virtual void test() = 0;
    virtual void ~test_holder() {}
};
#define TEST_HOLDER(c) test_holder_ ## c
#define DEFINE_TEST_HOLDER_IMPL(c, mem) \
class TEST_HOLDER(c) : public aa { \
    c& x; \
public: \
    TEST_HOLDER(c)(c& obj) : x(obj) {} \
    virtual void test() {x.test();} \
}
DEFINE_TEST_HOLDER_IMPL(aa);
DEFINE_TEST_HOLDER_IMPL(bb);
DEFINE_TEST_HOLDER_IMPL(cc);
int main() {
    aa a; bb b; cc c;
    test_holder* holder[] = {
        new TEST_HOLDER(aa)(a),
        new TEST_HOLDER(bb)(b),
        new TEST_HOLDER(cc)(c),
    };
    for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
        holder[i]->test();
    for (int i = 0; i < sizeof holder / sizeof holder[0]; ++i)
        delete holder[i];
}
719デフォルトの名無しさん:2006/09/21(木) 19:29:13
boost禁止はわかるが、template禁止かよ。
720デフォルトの名無しさん:2006/09/21(木) 21:13:21
C++はtemplateが無いとただのアレな言語だからなぁ
721デフォルトの名無しさん:2006/09/21(木) 21:22:19
禁止じゃなくて、開発環境の制限と書かれてるぞ。
処理系の制限かもよ。俺はそんな処理系知らないけど。
722デフォルトの名無しさん:2006/09/21(木) 21:37:53
VC6の実装なら十分制限になりえそうだがな。
723デフォルトの名無しさん:2006/09/21(木) 21:42:07
embleded C++とか言う奴か?
724デフォルトの名無しさん:2006/09/21(木) 21:42:23
EmbeddedC++とかじゃね。
725デフォルトの名無しさん:2006/09/21(木) 21:43:47
かぶった('д`)
726デフォルトの名無しさん:2006/09/21(木) 21:44:41
そもそも、何で異なるシグネチャのメンバ関数ポインタを配列で持ちたいと思ったんだろう。
727デフォルトの名無しさん:2006/09/21(木) 21:52:14
多分メンバ関数ポインタを普通の関数ポインタと同じように扱えると
考えてたんだろ。
728デフォルトの名無しさん:2006/09/22(金) 00:13:36
shcppでも使えるようになったのかね。
729デフォルトの名無しさん:2006/09/22(金) 00:37:51
>>726
漏れの目が悪くなければ、シグネチャは一致していると思うが。
730デフォルトの名無しさん:2006/09/22(金) 00:59:24
>>729
クラスが違うだろ。
731デフォルトの名無しさん:2006/09/22(金) 08:33:32
シグネチャは一致してるだろボケ
732デフォルトの名無しさん:2006/09/22(金) 08:43:00
しぐねちゃってなんですか (>_<)
733デフォルトの名無しさん:2006/09/22(金) 09:26:18
暗黙のthisポインタって知ってるか?
クラスが違うとシグネチャも違うよ。
734デフォルトの名無しさん:2006/09/22(金) 11:12:36
1.3.11 signature [defns.signature]
the information about a function that participates in overload resolution (13.3): its parameter-type-list (8.3.5) and, if the
function is a class member, the cv- qualifiers (if any) on the function itself and the class in which the member function is
declared. The signature of a function template specialization includes the types of its template arguments (14.5.5.1).
735デフォルトの名無しさん:2006/09/22(金) 11:50:53
また変な流れになってきた
736デフォルトの名無しさん:2006/09/22(金) 12:03:34
いや、シグネチャという概念は大切。特にC++では。
737デフォルトの名無しさん:2006/09/22(金) 12:04:10
シグネチャって関数の多重定義の時にだけ意識していればいいのでわ?
738デフォルトの名無しさん:2006/09/22(金) 12:43:47
Generic programming全般で重要です。
739デフォルトの名無しさん:2006/09/22(金) 13:05:08
ふと思いついた紛らわしい関数のシグネチャ

Typelist ( A, B, C, D )


// Typelist 型の戻り値を持ち、
// A, B, C, D の4つの型の引数をとる関数定義
740デフォルトの名無しさん:2006/09/22(金) 13:25:29
>>739
どこがまぎらわしいの?
741デフォルトの名無しさん:2006/09/22(金) 15:19:54
ヘルプに
「template は将来の為に予約されています」
と載ってた時代を思い出すなあ。
742デフォルトの名無しさん:2006/09/22(金) 15:21:58
export templateはもう諦めた方がいいですか?
743デフォルトの名無しさん:2006/09/22(金) 17:18:06
boost/archive/xml_iarchive.hpp
boost/archive/xml_oarchive.hpp
のsample programをそのまま使っても

runtimeの異常な呼び出しで終了しました

とかいうエラーで止まるんですが、なぜ?
includeするだけじゃ動かないのかな

環境はVS2003です
744デフォルトの名無しさん:2006/09/22(金) 17:21:24
sample programというのは
boostのホームページにのってるdemoプログラムのことです
745743:2006/09/22(金) 18:13:01
自己解決しました
boost_1_33_1\libs\serialization\vc7ide
に入っていたproject fileを使ったらうまく動きました

boostのホームページからコピペしただけでは
動かなかったのは謎です
746デフォルトの名無しさん:2006/09/22(金) 18:15:43
>>743
>includeするだけじゃ動かないのかな
ライブラリをリンクする必要がある
747デフォルトの名無しさん:2006/09/22(金) 23:33:33
double型なデータをstd::string型に変換するにはどうすればよいのでしょうか?
748デフォルトの名無しさん:2006/09/22(金) 23:41:48
どういう変換を想定してるの?
1.234 => "1.234"
みたいなこと?
749デフォルトの名無しさん:2006/09/23(土) 00:03:42
boost::lexical_cast
750747:2006/09/23(土) 00:44:56
>>748
そのとおりです。
簡単そうで意外と情報が見つかりませんでしたorz
751デフォルトの名無しさん:2006/09/23(土) 02:03:27
>>750
charにsprintfしてからstringにすれば良いんじゃね?
752デフォルトの名無しさん:2006/09/23(土) 02:11:02
(boost::format("%g") % 1.234).str()
753デフォルトの名無しさん:2006/09/23(土) 02:12:47
標準C++の範疇でやりたければstd::ostringstream使え。
Boostを使ってよければlexical_cast使え。
754デフォルトの名無しさん:2006/09/23(土) 05:04:54
>>753 の言うとおりだが、補足として、std::ostringstream
使うときには precision に注意すべし。
755デフォルトの名無しさん:2006/09/23(土) 05:37:05
double f=1.00;
string s = f.to_string();
とか出来るクラスがあったら楽でいいのに。
と思ったけど。

string str_thousand = "1000";
int int_ninety = 90;
int a = lexical_cast<int>( str_thousand );
string s = lexical_cast<string>( int_ninety );

boostっていいね。
boost落として使いたくなったよ。
756デフォルトの名無しさん:2006/09/23(土) 05:56:47
使いたいけど、中でやってることがそれなりに大げさで、組み込みの類みたいな
性能要求の厳しいところには、ほんの一部しか持ち込めない場合も…
lexical_castとかはガチで便利だけど、同時にソースの大きさ&生成されるコードのデカさには
吹く事請け合い。
いやまあ、ほとんどの環境じゃ問題にならないとは思うんだけどね。
757デフォルトの名無しさん:2006/09/23(土) 06:08:18
>>756 それ言ったら、標準ストリームも使えんぞ。
いまは組み込みでも標準ストリームは当たり前なのかな。
俺が組み込みにいた頃は C++ とかあり得なかったけど、
今じゃ C++ も結構使われて居るみたいだし。
758デフォルトの名無しさん:2006/09/23(土) 06:19:40
>>757
まあ、そうなんだけどね。
実際そういう環境だと標準ストリームは禁じ手扱いだなー。
IOデバイスが抽象化されてないのでそもそも出番が無いなんてこともあるけど。
あとは例外とRTTI。蛇蝎のごとく嫌われてる。実際負担はでかいにせよ。

CとC++じゃ、相変わらずC++の方が重い局面も多いのだろうけど、
コンパイラ様の性能がこの数年で格段に跳ね上がった感がある。
テンプレートも味方してくれるし、今更Cじゃ辛いからC++というだけでなく、
純粋に性能面から見てもC++のが有利ってのも、今となっては寝言じゃない。

ただ、言語機能的にはまったく問題なくても、ライブラリ類に大幅な制限食らってまで
使うC++が本当にC++なのかと、ふと考えることはある…かも。
759デフォルトの名無しさん:2006/09/23(土) 06:27:41
例外はまぁ仕方ないとも思う。
実際その方がロジックはきれいになることも多いし、
エラーを見逃すことも少なくなる。

RTTIは、boost のいくつかのライブラリが要求するから
コンパイラオプション的には禁止していないけど、
自分が各プログラムでは使いたくない、と言うか、使わない。
C++ のようなアーリーバインディングな言語では
コンパイルが完了した時点で型に関する整合性は
保証されていることが大切だと思っているから。
760デフォルトの名無しさん:2006/09/23(土) 07:02:20
Javaみたく例外が低コストなら、がんがん使うんだけどね。
構造上仕方が無い。

>C++ のようなアーリーバインディングな言語では
>コンパイルが完了した時点で型に関する整合性は
>保証されていることが大切だと思っているから。

基本的には同意。
RTTIは、個人的には要らない子に思う。
けど、奴がいないとできない仕事は結構あるしなー。
機構としてのRTTIを言語がサポートしていることには何の不満もないけど
影響範囲をコントロールできないのがムカツク。
素のままだとAll or nothingなんだもんなー。
761デフォルトの名無しさん:2006/09/23(土) 07:27:46
Boostはエンタープライズなライブラリを
がんがんacceptしてるな
そろそろC++言語が高級言語らしくなってきたよ
762デフォルトの名無しさん:2006/09/23(土) 07:29:40
エンタープライズなライブラリって・・・なに?
763デフォルトの名無しさん:2006/09/23(土) 14:18:41
template <typename List_, typename Parameter_>
class MessagePort
{
public:
typedef List_ mes;

/*
コンストラクタとかメソッドとか
*/

};

struct PlayerMesList
{
typedef int type;
static const int ESCAPE = -1;
static const int MOVE = 0;
static const int WARP = 1;
static const int FIRE = 2;
};
typedef MessagePort< PlayerMesList, Point > PlayerMesPort;

質問です。上のようなクラスがあったとき、私の予想では
int a = PlayerMesPort::mes::WARP;
はコンパイル時に
int a = 1;
に置き換わると思うんですが、何故かG++-3.3.2でリンク時に
undefined reference to 'PlayerMesList::WARP'
と出てリンク出来ません。何故でしょうか…。

BCC(BuilderX)では何の問題も起こらなかったのですが…。
764デフォルトの名無しさん:2006/09/23(土) 14:50:22
>>763
こんなん出ました。
http://www.google.co.jp/search?q=gcc+%22undefined+reference%22+static+const

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20547

つまり、これも undefined reference になるってこと。
struct S { static const int N = 1; };
int main()
{
int const& x = S::N;
return x;
}

gcc が正しいのか?
765デフォルトの名無しさん:2006/09/23(土) 14:51:34
>>763
>undefined reference to 'PlayerMesList::WARP'
この時点では見えないよ。と、いわれてるのだからどこが悪いか検討つくのでは。
リンクの順序orコンパイラ
766デフォルトの名無しさん:2006/09/23(土) 14:53:29
>>764
参照はダメだろう
767デフォルトの名無しさん:2006/09/23(土) 14:59:20
>>763
参照で使ってるとこあるの?
768デフォルトの名無しさん:2006/09/23(土) 15:29:32
static constな整数のメンバ変数はclass内で初期化できる。
しかし、それがメモリ上のオブジェクトとしての実体が必要な形で使用する場合、
改めて実体を宣言する必要がある。ってことだよな? もし>>763がどっかで
参照とかポインタに突っ込んでる箇所があるならgccの挙動で正しい。

struct T {static const int n = 3;};
void f( int x){ cout << x << endl;}
void g(const int& x){ cout << x << endl;}

int main()
{
f(T::n); //ok
g(T::n); //NG
return 0;
}
769デフォルトの名無しさん:2006/09/23(土) 15:34:12
独立参照はしてないのですが、const int &な引数になら渡しているっぽいです。

ためしに一箇所だけ、
一度int型に格納してから引数に渡すように変更してみたら、
大量のエラーの内一つだけ消えました。^^;

質問時の
「int a = PlayerMesPort::mes::WARP;
はコンパイル時に
int a = 1;
に置き換わると思うんですが」
というのはかなり不適切な言い方でしたね…。


…でもconst int &に数値リテラルなら直接渡せるのに何故?
(クラススコープでのstatic const int定義はコンパイル時解決だったと思うのですが…)
770769=763:2006/09/23(土) 15:46:04
……ってコンパイル時解決というのは私の勘違いっぽい?
771デフォルトの名無しさん:2006/09/23(土) 16:10:18
やっぱり一悶着あったようで。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#454

static const な整数型(enum 含む)メンバが初期化子を持つとき、それは
定数式として使えて、 & でポインタ作ったり直接参照を初期化したりしない限り
定義が要らなくなる、という特別扱いがされている。

static_cast<int> や +0 で結果が変わるんだから、混乱してもしょうがないと思う。

定数式として使える整数型変数が右辺値として評価されることにすれば、
みんな幸せになれるだろうか?
772763:2006/09/23(土) 18:48:56
>>771
むー…そういうことですか。static const 整数って意外と不便なものなのですね…。( ´ ・ω・ ` )
cppファイル上で定義するなりなんなり、とりあえず別の方法を検討してみます。

みんなありがとう。
773デフォルトの名無しさん:2006/09/23(土) 19:51:47
ちなみにC++3rdでその件について解説してる部分では
「enum使えenum」って結論だったな。ってBCCはenumにバグがあるんだっけ?
774デフォルトの名無しさん:2006/09/23(土) 20:12:47
BOOST_STATIC_CONSTANT マクロを読めば、その辺の実装状況が分かる。
**/config/static_constant.hpp

See Also:
http://boost.cppll.jp/HEAD/more/int_const_guidelines.htm
775ららら:2006/09/23(土) 20:27:47
助けてなのらー!
VC7.1 で以下の Multiply 関数の 2 つめの引数の const を削除してコンパイルすると
"function does not take 2 arguments" エラーになるのらー!
なんでなのらー?どうしたらいいのらー?

template<class T> 
class Complex {
public:
    typedef T ValueType;
};

template<class T>
class Vector {
public:
    typedef T ValueType;
};

typedef Vector<Complex<float> >  MyVector;

template<class VectorT>
void Multiply(VectorT* vec, const typename VectorT::ValueType::ValueType a)
{ }

void test()
{
    MyVector v;
    Multiply(&v, 2.0);
}
776デフォルトの名無しさん:2006/09/23(土) 20:45:31
329 名前:ららら[sage] 投稿日:2006/09/06(水) 00:41:45
>>328
ばかはおよびでないのらー

また出たよ……。
777デフォルトの名無しさん:2006/09/23(土) 20:52:10
七誌ではないことに感謝しろよ
778デフォルトの名無しさん:2006/09/23(土) 21:25:27
>>775
Multiply(&v, 2.0);の場合、
1つ目の引数より、テンプレート引数VectorTの型は、
Vector<Complex<float> >だと判断される。
するとtypename VectorT::ValueType::ValueTypeはfloat型になる。
しかし2つ目の実引数の2.0はdouble型になっているのがまずいのだと思う。
2.0fだとどうだろうか。
779デフォルトの名無しさん:2006/09/23(土) 21:33:09
>>778
どうやらそういう理由ではないようだ。
>>775
そのソースをVC8でためしたらコンパイルすらされない。
で、
template<class T>
class Vector {public: typedef T Type;};
このように変更したらMultiplyのconstなしがvc7.1とvc8両方でコンパイルされた。

たぶん、vcのバグかな。
780763:2006/09/23(土) 21:54:56
774>>見てBOOST_STATIC_CONSTANT使ってみたけどundefined reference…。
それ使えばconst &へ直接渡せるようになるってワケではないのですね…。

とりあえず定数を使う場合に全て単項の+付けるようにして対応しました。
なんだかなぁ…。( ´ ・ω・ ` )
781デフォルトの名無しさん:2006/09/23(土) 22:12:42
>>780
じゃあ、コンパイラがenumでの参照初期化が駄目なのかも。

boost/config/suffix.hppの

// BOOST_STATIC_CONSTANT workaround --------------------------------------- //
// On compilers which don't allow in-class initialization of static integral
// constant members, we must use enums as a workaround if we want the constants
// to be available at compile-time. This macro gives us a convenient way to
// declare such constants.

# ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
# define BOOST_STATIC_CONSTANT(type, assignment) enum { assignment }
# else
# define BOOST_STATIC_CONSTANT(type, assignment) static const type assignment
# endif

で切り替えてんだけど。
782デフォルトの名無しさん:2006/09/23(土) 22:14:56
環境
  OS WinXP
  コンパイラ Visual C++

if文を用いたプログラムを作りたいので質問します
最初に[F5]を押し、もしパケットの受信(なんらかの通信)があったなら、5秒後にまた[F5]を押し
もし、パケットの受信がなければ、そこでプログラム停止 

というプログラムを作りたいのですが、全くわかりません ある程度のコマンドを表記してもらえれば後は自分で独学するので
使うコマンドだけ教えてくれませんか?

2ちゃんねるの実況などのオートリロードに役立てたいのです(Janeですと、制限があるので…)
783デフォルトの名無しさん:2006/09/23(土) 22:19:44
>>782
すまないが、環境依存の話はスレ違いなんだ。
Visual C++のスレとかあるからそっちへ行ってくれ。
784763:2006/09/23(土) 22:32:22
BOOST_NO_INCLASS_MEMBER_INITIALIZATIONが定義される(可能性のある)コンパイラは
MPW C++、Sun C++、Visual Age (IBM) C++、Microsoft Visual C++の四つだけみたいですね。
(boost/config/compiler/より)

あくまでclass内で直接定義できない場合にenum仕様に分岐するってだけで、
const &に渡すとか、そういう用途は想定してなさそう…。
785デフォルトの名無しさん:2006/09/23(土) 22:35:48
元のお題ならenumになれば問題ないでしょ?
786デフォルトの名無しさん:2006/09/23(土) 22:45:42
「enumハック」とか「非推奨」とか言われることも多いけど
結局、定数をクラス内enumにするのが
一番トラブルが起きにくいし、読む側も(わかってれば)納得できるんだよね。
787デフォルトの名無しさん:2006/09/23(土) 22:52:39
>>786
enum は enum で template 関数に使うと妙なことになるぞ。

#include <algorithm>
struct S { enum { N = 1 }; };
int main()
{
return std::max(S::N, 0);
}

:5: error: no matching function for call to `max(S::<anonymous enum>, int)'
788763:2006/09/23(土) 23:14:31
>>785
よく考えてみればそうですね。頭固い763に乾杯。

…ってtemplate関数に使うと 787>> みたくなっちゃうのか…。
別に質問の件ではtemplate関数に渡したりしないから大丈夫だけど、
もうstatic const 整数で定義して、使用時に単項+付けるんでいい気がしてきた…。
789デフォルトの名無しさん:2006/09/23(土) 23:18:07
よくiteratorのループで以下の形が用いられますが

for(iterator i = begin; i != end; ++i)

「i != end」の部分が気になります。
例えば以下の関数があったとして、
引数endにNULLその他、不適切な値が渡された場合
無限ループになってしまいます。皆さんはどう解決されてますか?

template< typename iterator >
void function(iterator begin, iterator end)
{
for(iterator i = begin; i != end; ++i){ ...}
}
790デフォルトの名無しさん:2006/09/23(土) 23:19:08
>>788
定義を追加するのはだめなのか?
undefined referrence っていうんだから、一番まっとうな解決方だと思うが。

使用箇所全部に不気味なコード書くぐらいなら、
実装側に不気味なコードひとつのほうがマシだろ。
791デフォルトの名無しさん:2006/09/23(土) 23:20:25
struct S { static const int N; };
const int S::N = 1;
792デフォルトの名無しさん:2006/09/23(土) 23:22:43
>>789
渡すやつが悪いという理屈が通用しないなら、
function側で、X.end()と生成するしかないだろ。
793デフォルトの名無しさん:2006/09/23(土) 23:44:33
確かに、俺なら、
firstとlastを受け取る関数のlastにNULLを渡すなんて
絶対やらないけどな。
794デフォルトの名無しさん:2006/09/23(土) 23:55:05
そもそも型が違うのではないのか?
795763:2006/09/23(土) 23:55:14
>>790

うーん。そういう記法で統一すればさほど不気味でもないかな、とも思っていたんですが。
(定数リストをテンプレート化するという目的上)cppファイルも増やしたくなかったし。
でもそう言われると悩んできますね…。
796デフォルトの名無しさん:2006/09/24(日) 00:01:04
>>795
記法を変える必要は無い。定義を追加すればいいだけ。
797789:2006/09/24(日) 00:13:56
>>792-794
お答えありがとうございました。
渡す奴が悪いで法にすることにします。
確かC#とかだとテンプレート引数に制限かけれるんでしたよね。
C#触る機会があればまた考えることにします。
798デフォルトの名無しさん:2006/09/24(日) 00:15:46
std::string::npos なんかの参照とったらどうなるんだろう?

と思ってやってみたら普通に通る。ちゃんと定義が置いてあるみたい。

と思って libstdc++ のソース見たらクラス内で -1 で初期化したうえで、
クラス外に初期化子の無い定義が書いてあった。

めんどくさいけど、これが正解なんだろう。
799デフォルトの名無しさん:2006/09/24(日) 00:29:03
参照取るのを禁止/防止する方向はダメなのか
800763:2006/09/24(日) 01:02:52
>>796
言葉足らずでしたね…。
記法を統一というのは、使用箇所に単項+を追加するという方の意味です。

ていうかもしかして >>796 のは >>798 のことを言っているのかな。
cppファイルが増えるのはいやだけど、
const&に渡せる上にswitch文にも使えて(定数としての性質を失っていない)
一番理想的な動作をしますね。(こういう書き方できたんですね…)

というわけで >>798 の方法を取ることにします。

>>799
STLのクラスに渡していたりするので無理。
801デフォルトの名無しさん:2006/09/24(日) 01:51:41
>>800
元が template なら、定義も template になるから cpp は増えないでしょ?
802763:2006/09/24(日) 02:14:03
>>801
定数リスト用のクラス自体はtemplateじゃないのです。
定数リスト用クラスをテンプレートのパラメタとして与えるというお話。
803デフォルトの名無しさん:2006/09/24(日) 02:59:18
定数リスト用のクラスもテンプレートにしちゃえ。
804ららら:2006/09/24(日) 03:40:46
で、どうしたら解決するのらー?
805デフォルトの名無しさん:2006/09/24(日) 04:05:42
template<template <typename > class VEC,typename C>
void Multiply(VEC<C>* vec,typename C::ValueType a)
{}

これでいいんじゃね?
806デフォルトの名無しさん:2006/09/24(日) 05:04:27
>>804
標準では合法なコードなんだから、このスレで話すことはもう無い。
VCスレにでも逝ってくれ。
807デフォルトの名無しさん:2006/09/24(日) 13:30:15
16の倍数に切り上げるにはどうすればいいですか?
たとえば
15 -> 16
16 -> 16
17 -> 32
みたいな感じです。切り捨てるには
n = n / 16 * 16でいいのですが…
808デフォルトの名無しさん:2006/09/24(日) 13:32:41
(n+15)/16
809デフォルトの名無しさん:2006/09/24(日) 13:33:00
>>807
n = (n + (16 - 1)) / 16 * 16;
810807:2006/09/24(日) 13:42:49
>>809
できました、ありがとう!!
でもなんかダサいっすね
811デフォルトの名無しさん:2006/09/24(日) 13:45:54
((i-1)/16+1)*16
これなら0値でも16になるぜ!!
812デフォルトの名無しさん :2006/09/24(日) 14:12:06
参考書に載ってたサンプルプログラムを打ったのですが

http://mitty.jp/up/src/up1962.cpp
プログラムの
pwork = pchar = new char[size + 1];
の部分で、pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
Cの時はmallocの戻り値がvoid*型なのでキャストして、一つのポインタ変数に
一つずつメモリをわりあてていたのですけど
C++では、まとめてメモリをわりあてることができるのでしょうか
あと、本では、pcharしか解放してないんですが、pworkの方は解放しなくて良いのでしょうか
それと、蛇足ですが、このような知識が手に入るC++の読むべき本てあるのでしょうか。
最後の本については、スレ違だと思いますので、できれば、前者のnewにかんする部分を
教えていただけないでしょうか
813デフォルトの名無しさん:2006/09/24(日) 14:15:49
>>810
n = (n + 15) & 0xfffffff0;
814デフォルトの名無しさん:2006/09/24(日) 14:22:03
>>812
「土地を取得して、その住所をpwork君とpcharさんに教えてあげた」
ということ。

確保されたのは new char[size + 1]; だけ。
pworkとpcharは同じ場所を指している。
815デフォルトの名無しさん:2006/09/24(日) 14:27:37
>>812
それをmallocを使って書いたらpwork = pchar = malloc(size + 1);になる。
ただ代入演算子を並べているだけ。
816810:2006/09/24(日) 14:37:59
>>813
かっこいいです!
使わせていただきます。
その他の人も本当にありがとうございました
817デフォルトの名無しさん:2006/09/24(日) 14:41:30
>>816
さらに2のべき乗以外の丸めができないし
コメントつけても「(本当に大丈夫か?)…ああ、大丈夫だ」と逡巡すると思われ
止めておけ・・・忠告はしたからねっ!
818デフォルトの名無しさん:2006/09/24(日) 15:53:20
>>813
nが32bit integerじゃないと破綻する。
819デフォルトの名無しさん:2006/09/24(日) 16:08:50
>>818
それはキミへの宿題だってこった
820デフォルトの名無しさん:2006/09/24(日) 16:09:33
n = (n + 15) & ~15;
821デフォルトの名無しさん:2006/09/24(日) 16:41:25
3点だな
822(^-^) ◆MONSOON/qo :2006/09/24(日) 16:49:46
整数、小数を含めて上位5桁で6桁目を四捨五入するにはどうしたらいいですか?
823デフォルトの名無しさん:2006/09/24(日) 16:52:25
>>822
それ言語に寄らない機能モデルだよね
そしてそれくらいなら小学校で習うことだよね
というわけで

つ たのしい算数
824(^-^) ◆MONSOON/qo :2006/09/24(日) 16:57:01
>>823
桁数が多い場合でもループ使わずに出来ますか?
825デフォルトの名無しさん:2006/09/24(日) 17:00:57
>>824
なんでループが必要になるのかがわからん。
とりあえず一通り算数を学んでからコードを書いてみろ。
自分で書く前に人に聞くな。

書いた後で相談する時は、スレを適切に選んでソースを貼れよ。
826デフォルトの名無しさん:2006/09/24(日) 17:01:52
>>824
その機能モデルと、機能の実体を中途半端に混ぜるのはやめておいたほうがいい
そもそもループ使うかどうかなんて決まってないじゃんか
ついでに言えば進数もわからないし

頭にある前提条件を残さず書き下してから、そういうのを考えようね
827(^-^) ◆MONSOON/qo :2006/09/24(日) 17:05:19
101.206なら四捨五入して101.21
0.0350119なら四捨五入して0.035012
とかです 有効桁5桁を残して四捨五入するということです
828デフォルトの名無しさん:2006/09/24(日) 17:11:12
BCC Developer使ってHello World作ったんだけど
exeが一瞬しか表示されないのですがなぜでしょうか。。
たぶん、プログラムじゃなくて漏れのPCが原因だと思うんだが・・

よかったら誰か教えてくれ・・・

http://www.uploda.org/uporg526158.zip.html
829デフォルトの名無しさん:2006/09/24(日) 17:15:41
連投スマソ(*_ _)人
exeが一瞬ってのは実行したら
一瞬Hello World!ってでてプログラムが終了してしまう・・
Developer使って実行したらちゃんと閉じる押すまで閉じることはないんだが
なぜなんでしょうか。。。?
830デフォルトの名無しさん:2006/09/24(日) 17:15:46
>>827 コード書けよクズ
831デフォルトの名無しさん:2006/09/24(日) 17:20:37
>>828
環境依存な話はスレ違い。そういうのはこっち。
【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/
832デフォルトの名無しさん:2006/09/24(日) 17:21:58
>>831
(;゚д゚)ァ.... どうも、スレ汚してすみませんでした。(_ _(--;(_ _(--; ペコペコ
あと、URL d(゚Д゚)☆スペシャルサンクス☆( ゚Д゚)b
833(^-^) ◆MONSOON/qo :2006/09/24(日) 17:24:18
>>829
printf("Hello World!\nキー押してね");
int a=getchar();

に変更してみて
834デフォルトの名無しさん:2006/09/24(日) 17:29:48
>>833
糞コード
835デフォルトの名無しさん:2006/09/24(日) 17:30:34
>>833 いい加減に「スレ違い」というものを覚えろカス
836デフォルトの名無しさん:2006/09/24(日) 17:49:13
カスがそんなこと覚えられるわけないじゃん。
カスに向かって説教するのがどれだけ無駄か理解しろ。
837デフォルトの名無しさん:2006/09/24(日) 17:56:56
親クラス Oya のポインタ oya** に、それを継承して作ったクラス Child をnewで割り当てるって出来ませんか?
動的に配列を割り当てたいんですけど

oya = new Child*[n];
for(int m = 0;m < X;m++)
    oya[m] = new Child[X];

とやればできるのかな?と思ったらコンパイル出来なかったんです。
oya = new Child*[n];
for(int m = 0;m < X;m++)
   oya[m] = new Child[X];

ならコンパイルはできたけど、当然エラーでました(当たり前ですよね)
多分、やり方が悪いだけできっと何かしら方法があると思うんです

ご教授願えませんでしょうか?お願いします
838デフォルトの名無しさん:2006/09/24(日) 18:05:04
>>837
上の例と下の例に違いが見つからないが
839デフォルトの名無しさん:2006/09/24(日) 18:12:55
あ、すいません。下のほう間違えました

oya = new Oya*[n];
for(int m = 0;m < X;m++)
   oya[m] = new Child[X];

とやったらコンパイルは出来たっていうのが正しいです。打ち間違えてすいません
840デフォルトの名無しさん:2006/09/24(日) 18:18:55
>>837
相談するときはエラーの内容を忘れずに。
841ららら:2006/09/24(日) 18:18:56
>>778 779 804 805 806
お返事ありがとうなのらー。
たしかに VC7.1 のバグっぽいのらー。
仕方ないのらー。。。
842763:2006/09/24(日) 18:20:14
>>803
なるほど。そういう考え方もアリなのですね。
843デフォルトの名無しさん:2006/09/24(日) 18:22:26
>>827
有効桁数は数値からは分からないよな、したがって有効桁数と数値の組を扱わなくちゃならない
(10と10.00000000000の違い)
まぁ、ここまでくれば問題ないとおもうので略
844デフォルトの名無しさん:2006/09/24(日) 18:25:56
>>839
oya = new Oya*[n];
for(int m = 0; m < n; m++)
   oya[m] = new Child[X];

でいける。
845(^-^) ◆MONSOON/qo :2006/09/24(日) 18:32:29
>>843
普通の意味のとは違うんです
その数字が、数字として意味を持つ上位5桁ということです
846デフォルトの名無しさん:2006/09/24(日) 18:33:33
>>840
エラー内容ですが、VC++(環境依存で申し訳ないですが)だと、
メモリ0x00373164でハンドルされていない例外が発生しました。:0xC0000005 場所 0xffffffffを読み込み中にアクセス違反が発生しました

と出ます
このとき、変数の状態を見てみると、oya[0]にはChildクラスのオブジェクトが割り当てられており、本来はoya[0][0]にChildクラスが割り当てられていて欲しいのですが、そうなっていなくて、oya[0][1]へアクセスしようとすると失敗するようです

>>844
そのやり方でできなかったのでご相談しているのですが・・・
ひょっとして、これって一次元配列のやり方として正しいっていうことでしょうか?
さっき配列とだけ書いたので良くなかったですね
僕がしたいのは二次元配列として扱う場合なんです
847デフォルトの名無しさん:2006/09/24(日) 18:36:29
>837
無駄に解りにくいな。

要するに
class Child : public Oya
だとしても
Oya *oya = new Child[X];
はやっちゃ駄目。
配列をポリモーフィックに扱うな
848デフォルトの名無しさん:2006/09/24(日) 18:39:42
>>847
まとめてくれてありがとうございます。

配列を扱ってはいけないんですか?
理由がよくわかりませんが・・・
そういうことができるのがオブジェクト指向だと思っているのですが・・・勘違いでしょうか?
849デフォルトの名無しさん:2006/09/24(日) 18:49:37
>>848
いい加減にしろ
うざいんだよ
入門書読み直せ糞がき
850デフォルトの名無しさん:2006/09/24(日) 19:01:07
>848
array[i] = *(array + i)
ポインタの加算
sizeof(Oya)とsizeof(Child)
851デフォルトの名無しさん:2006/09/24(日) 19:23:46
>850
なるほど。そういうことだったんですね
ん〜・・・
そうなると、こういう風に二次元配列で派生クラスがいろいろ並んでいる状態を作るってC++ではできないんですか?
Javaだと普通に出来たので、C++でも出来ると思ったのですが
852デフォルトの名無しさん:2006/09/24(日) 19:29:59
>851
ポインタの二次元配列を使え。Java だって参照使ってるんだから同じことだろ?
853812:2006/09/24(日) 19:35:49
>>814さん
>>815さん
わかりやすい説明ありがとうございました
いままで、malloc()でpwork = pchar = malloc(size + 1);のような使い方
をしたことがなく、知識不足でした。
解釈がまちがってたらすいませんが、片方をdeleteしたら、両方のポインタ変数君の居場所
は無くなると思っておきます。
854デフォルトの名無しさん:2006/09/24(日) 20:06:54
>>853
用語はちゃんと理解するようにしたほうがいいよ。
この先、本や他の人の話を聞いて勉強するためにも。

>>853が「ポインタ変数君の居場所」をどういう意味で使っているかは分からないが、
ポインタとかポインタ変数というのが pworkと pchar。
ポインタのアドレス(ポインタがメモリ上のどこにあるか、つまり居場所)は &pwork, &pcharで得られる。
deleteで削除するのはポインタ変数の居場所(&pwork, &pchar)ではなく、
ポインタ変数に格納していた値が指す領域(= malloc()で確保した領域)。

>>812
>pcharとpworkにメモリ割り当てをしているのはなんとなくわかるんですが
これを見ると勘違いしているっぽいが、
mallocするかどうかに関係なく、pcharとpworkはサイズを持った変数としてメモリ上に存在する。
malloc()で確保した領域はこれらとは全く無関係の領域で、その領域の場所を
たまたまpcharとpworkに入れただけ。

絵を描いてみるといいよ。
855854:2006/09/24(日) 20:09:43
mallocとdeleteが混在してしまって余計な混乱を招いていたらスマンです。
書く必要ないと思うけど念のため。
mallocした領域はfreeで、newした領域はdeleteで解放して。
856デフォルトの名無しさん:2006/09/24(日) 20:11:05
>>854
かまちゃだめだ。この人、おかしい人なんだからさ。
857デフォルトの名無しさん:2006/09/24(日) 21:43:15
オ、オマエモナー
858812:2006/09/24(日) 22:58:57
>>854さん
ご忠告ありがとうございます。
malloc()は、C言語で構造体で線形リストや、双方向リストを作るときに
構造体のメンバのポインタ変数に対してや、構造体ポインタにのみにしか使ってなく
まだまだ、経験知識不足でした。
もう一度C言語で抜けている知識を再確認して勉強し直します。

859デフォルトの名無しさん:2006/09/24(日) 23:03:50
メモリッ!!アアアロケエタアアアアアアアアアアアアアアアアアアアアアアアアア!!
860デフォルトの名無しさん:2006/09/24(日) 23:38:18
つ【3byte】
861デフォルトの名無しさん:2006/09/25(月) 00:07:03
つ【512kB】
862デフォルトの名無しさん:2006/09/25(月) 13:01:56
すいません。おしえてください。

char** pchar = new char*[3];
for (int i=0;i<3;i++) pchar[i]= new char[3];
とかで、ヒープに3×3の配列つくると、

pchar[0][0]〜pchar[0][2]は、連続するアドレスに領域確保されますが、
pchar[0][2]と、pchar[1][0]の間は、かなり空きが生じます。

このような空きは、やっぱり、ヒープ領域で非効率な無駄になっているのでしょうか。
別に9個の連続する配列つくっといて、そのアドレスを1次元配列のポインタに代入して
3×3の配列つくったほうが、効率的なんでしょうか。

普通はあんまり気にしなくていいものなんでしょうか?
863デフォルトの名無しさん:2006/09/25(月) 13:08:14
>>862
かなり無駄。
864デフォルトの名無しさん:2006/09/25(月) 13:09:30
よっぽどメモリが苦しい状況で無い限り気にしない。
それよりも分かりやすさ/読みやすさを優先する。
俺は。
865デフォルトの名無しさん:2006/09/25(月) 13:11:49
空きがどうとかいう以前に、前者はポインタ3つ分(32bit環境でchar12個分)メモリが余計に必要なわけだが。
866862:2006/09/25(月) 13:16:17
>>865
実際のプログラムでは、配列はcharでなく、ポインタ40byteくらいのオブジェクトになります。
867デフォルトの名無しさん:2006/09/25(月) 13:17:31
打つのミスりました。
実際のプログラムでは、配列はcharでなく、40byteくらいのオブジェクトで、
40×250くらいの配列になります。
868デフォルトの名無しさん:2006/09/25(月) 13:25:02
別に9個の……ってこういう事?

char** pchar = new char*[3];
pchar[0] = new char[9];
for (int i=0;i<3;i++) pchar[i] = pchar[0] + 3 * i;

たいていの場合、無視出来る無駄。好きにしたら。
869862:2006/09/25(月) 13:31:01
スタック領域が一杯一杯になって、ヒープ領域に持ってったんで、ちょっと神経質になっていました。
ヒープならあんまり無駄を気にすることもないんですね。
みなさんのご意見参考になりました。
ありがとうございました。
870デフォルトの名無しさん:2006/09/25(月) 13:58:00
そんなに心配ならchar *p = new char[3 * 3];として、
p[0 * 0] ~ p[3 * 3]とアクセスすることにすればいいだろ。
871デフォルトの名無しさん:2006/09/25(月) 14:11:50
確かにp[3*i+j]でアクセスすればいけるですね。
でもさすがにそれだと読みにくさが勝るですね。
872デフォルトの名無しさん:2006/09/25(月) 14:16:53
template < typename T >
inline
T & at(T * p, int len, size_t i, size_t j)
{
  return p[i * len + j] ;
}
873デフォルトの名無しさん:2006/09/25(月) 14:27:08
template<typename T>
class array_adapter
{
874デフォルトの名無しさん:2006/09/25(月) 14:28:16
template<typename T>
class array_adapter
{
public:
T *operator[](int i)
{
};
875デフォルトの名無しさん:2006/09/25(月) 14:33:57
template<typename T,int X>
class array_adapter
{
T *array;
public:
array_adapter(T *a) : array(a) {}

T *operator[](int i)
{
 return array + X * i;
}
};
876862:2006/09/25(月) 14:41:00
template って便利そうですね。
勉強してきます。
877デフォルトの名無しさん:2006/09/25(月) 22:31:09
世にも奇妙な世界へようこそ
お勧めの参考書は>>8
878デフォルトの名無しさん:2006/09/25(月) 23:39:13
C++でO/Rマッピングを使いたいのですが何かツール知りませんか?
879デフォルトの名無しさん:2006/09/26(火) 01:59:42
質問。例外仕様ってどうやって使ってる?

今までデストラクタやswapにthrow()と書いていたんだけど、
unexpectedするだけでさほど意味ないんじゃないかと思うようになって。
880デフォルトの名無しさん:2006/09/26(火) 02:06:30
初めまして、インターネットを通じる以外にコンパイラー等を
手に入れる方法はございませんか??
参考書等についていたりしませんか??
そういった参考書をお知りでしたら、教えてください。どうかお願いします。
881(^-^) ◆MONSOON/qo :2006/09/26(火) 02:11:40
>>880
本屋で探せば見つかるだろうけど
ネットを開通した方が安いし困ったときも便利
882880:2006/09/26(火) 02:27:37
>>881
お勧めのサイトありますか??
もう一度がんばってみたいです。
ここで、これを諦めたらだめな気がします。
883(^-^) ◆MONSOON/qo :2006/09/26(火) 02:31:57
>>882
無料のコンパイラはVisual Stdioだとおもうよ
これなら書籍でも付いてるとおもう
http://www.microsoft.com/japan/msdn/vstudio/express/
884880:2006/09/26(火) 02:34:26
>>883
この中のvisual C++でいいのですか??
885(^-^) ◆MONSOON/qo :2006/09/26(火) 02:38:38
>>884
それでいいけど
書籍を購入する程度の入門レベルだと
BCC Developer(とボーランドc++)がお勧めだよ
886デフォルトの名無しさん:2006/09/26(火) 02:40:40
aoe
887(^-^) ◆MONSOON/qo :2006/09/26(火) 02:40:51
>>884
BCC Developerはここ
サイズも小さいし教科書、入門書どおりのプログラムがそのまま動く(Visual C++はそうではない)

http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
888880:2006/09/26(火) 02:55:26
>>883-887
やはりできませんでした・・・。cpadもどこなのかわからないし・・・orz
なんでだろう・・・。本買って始めた方が効率よさそうです・・・。
883にはってある物はどうやってうごかせばいいのですか??
889(^-^) ◆MONSOON/qo :2006/09/26(火) 02:57:34
>>887の方が簡単だって
ちょっと待ってて直リン貼り付けるから
890880:2006/09/26(火) 03:00:02
>>889
ほんとうにすいませんorz
891(^-^) ◆MONSOON/qo :2006/09/26(火) 03:00:24
892デフォルトの名無しさん:2006/09/26(火) 03:04:37
おぉぉっばかがふたりになったっ
893(^-^) ◆MONSOON/qo :2006/09/26(火) 03:04:55
>>891がダウンロードできない場合、ダウンロードツールを使うと出来るからインストールして

http://www.geocities.co.jp/SiliconValley-SantaClara/1908/files/182a/NT2Setup_multi.zip
894880:2006/09/26(火) 03:11:46
>>891
ただいま、デスクトップにすべてインストールいたしました。
この次はどうすればいいですか??
895(^-^) ◆MONSOON/qo :2006/09/26(火) 03:13:09
>>894
ダウンロードしたって事?
そのあとfreecommandlinetools2.exeなどをクリックして実行
896880:2006/09/26(火) 03:15:00
freecommandlinetools2.exeのインストール先はそのままでいいのですか??
897(^-^) ◆MONSOON/qo :2006/09/26(火) 03:16:09
>>896
そのままでいいけど
問題があれば変更も可
898880:2006/09/26(火) 03:20:26
>>897
解凍?できました。
次は何をすればいいですか??
899(^-^) ◆MONSOON/qo :2006/09/26(火) 03:21:52
>>896
bccdev1221.lzhは解凍して
c:\Program Filesの中にディレクトリ付きで入れる
そのあとBccDev.exeを実行してツール→環境設定でコンパイラを設定すると完了
900(^-^) ◆MONSOON/qo :2006/09/26(火) 03:22:29
>>898
setbcc15b.exeまでいきましたか?
901(^-^) ◆MONSOON/qo :2006/09/26(火) 03:24:40
>>898
setbcc15b.exeを実行するとディレクトリの中にsetbcc.exeがあるはず
これを実行して指示に従ってください
902880:2006/09/26(火) 03:25:39
すいません、ディレクトリとは??無知すぎてすいませんorz
903デフォルトの名無しさん:2006/09/26(火) 03:31:31
>>902
C++とかVBとかC#とかいう以前に、
PCのことある程度知らないとPCのプログラム書くのは無理。
904(^-^) ◆MONSOON/qo :2006/09/26(火) 03:31:42
>>902
ディレクトリ = フォルダ
黄色い書類入れのようなアイコンのやつです
905880:2006/09/26(火) 03:32:03
>>901
setbcc15bを実行し設定はそのままで実行しましたが
setbccはあったのですが、exeがついてませんがこれでよかったですか??
906(^-^) ◆MONSOON/qo :2006/09/26(火) 03:35:18
>>905
それでいいです
907880:2006/09/26(火) 03:38:31
>>906
これであとはBccDev.exeとやらを実行すればいいのですか??
あと、こちらのファイルはどこにありますか??
908デフォルトの名無しさん:2006/09/26(火) 03:40:18
今更BCC薦めんのってどうよ。
909880:2006/09/26(火) 03:46:43
>>908
すいません。
910デフォルトの名無しさん:2006/09/26(火) 03:47:11
この流れは何?
911(^-^) ◆MONSOON/qo :2006/09/26(火) 03:47:18
>>907
最後にbccdev1221.lzh 
(WindowsXPならクリックすると中が見られるはず、違うなら解凍ソフトが必要)
を解凍して>>899の通りに設定すれば完了

>>908
Visual C++2005はコードも(教科書にあるような)普通のが通らないし色々と難しい
912880:2006/09/26(火) 03:53:45
>>911
このネジのようなやつですか??
913デフォルトの名無しさん:2006/09/26(火) 03:56:23
>Visual C++2005はコードも(教科書にあるような)普通のが通らないし色々と難しい

この前提がそもそも間違ってる気がするんだがどうよ。
具体的にどんなコードが通らないんだ。
どの本のコードが通らないかがわかるだけでもいいぞ。
914(^-^) ◆MONSOON/qo :2006/09/26(火) 03:58:54
>>912
そう、
そしてツール、環境設定、コンパイラの所を
C:\bcc5.5\Bin\bcc32.exe (フォルダが違うかもしれないけど)に設定すればOK
915880:2006/09/26(火) 04:03:02
>>914
なんとか環境設定まではできたのですが
今まで使っていたものと違うのですが
どこに文字というか、言語をうてばいいのですか??
916(^-^) ◆MONSOON/qo :2006/09/26(火) 04:03:37
>>913
↓これが通らん

#include <stdio.h>
main(){
printf("Hello World!\n");
}

fatal error C1010: プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか?
917(^-^) ◆MONSOON/qo :2006/09/26(火) 04:07:20
>>915
ファイル→新規作成→プロジェクト名を適当につける→
再び、ファイル→新規作成→
C/C++ファイルのファイル名で****(適当なファイル名).cpp
を入れてOK
918デフォルトの名無しさん:2006/09/26(火) 04:07:22
>>916
まあ、VSのIDEのデフォルトの設定でやると自動的にプリプロセッサが有効になるので通らんな。
というかそのコードはC++として通らないけど。
いくらCでおkったってそういう暗黙の了解の下に成り立っているコードは嫌いだ。
919デフォルトの名無しさん:2006/09/26(火) 04:07:33
どうみてもスレ違いっつーか鼬害です。
920(^-^) ◆MONSOON/qo :2006/09/26(火) 04:11:26
>>915
いつも使ってたやつがいいならこちらをダウンロードしてください
CPad for Borland C++Compiler

http://www.vector.co.jp/soft/win95/prog/se141451.html
921880:2006/09/26(火) 04:19:50
>>920
ほんとなにからなにまでありがとうございました。
あと、スレ違いでしたら本当にすいませんでした。

しかしいつも通りHello,worldを実行しようとしたらエラーがでてしまいましたorz
922デフォルトの名無しさん:2006/09/26(火) 04:23:42
チャットとして使うなよ
こんなのまでログに残すのか?
923デフォルトの名無しさん:2006/09/26(火) 04:23:50
そういう時はエラーの出たソース、エラーの内容、使ってる環境、その全てを書くんだ。
情報を小出しにしてはいかん。
大抵の場合、見る人が見れば一発でわかるエラーだったりするもんだ。
そんなんで蹴躓くなんてもったいないだろう?
スレ常駐のベテランの手を借りるんだ。
あの変なコテはベテランじゃねーっぽいので放置の方向で。
924デフォルトの名無しさん:2006/09/26(火) 04:38:47
だからここは初心者向け開発環境構築スレじゃねぇって。
925880:2006/09/26(火) 04:45:03
#include <stdio.h>


int main(void)

{

printf("Hello, world");

return 0;

}

エラー F1009 c:\documents and settings\\my documents\0\a\aa.cpp: 入力ファイル 'c:\documents and settings\\my documents\0\a\aa.cpp' をオープンできない
*** 1 errors in Compile ***

** error 1 ** deleting Debug\aa.obj

Compile End !! (Elapsed time 0:00.078)

環境はBCC Developerです。

えっと・・すいませせん。なんででしょうか??
926デフォルトの名無しさん:2006/09/26(火) 04:48:23
>>880
今は1から10まで全部教えて貰って、やっとの事で環境構築したわけだが。
たかが環境構築で躓く段階で、何も調べる能力が無いことが明らか。

断言してもいいが、このままじゃおまえさんは何も出来はしないぞ。
インスコしたbccだって無駄になるだけだ。
自分の作りたいものに関して、1から100まで全て他人に質問して済ませるつもりか?
927(^-^) ◆MONSOON/qo :2006/09/26(火) 04:50:54
>>925

> \\my documents\ ← ここの\\が怪しい



同じような症例がここに
http://oshiete1.goo.ne.jp/kotaeru.php3?q=2035273


928デフォルトの名無しさん:2006/09/26(火) 04:52:15
単にユーザ名入ってたのを手で消したってオチと違うのか。
929880:2006/09/26(火) 04:55:31
>>926
最初から1〜10まで教えてもらっていたわけではありません。
最初はいろんなホームページを探し回って、きときとさんだったかな??
そのcpadつかっていろいろやってましたが、
途中からエラーがとまらなくなって
また新しくインストールしようと思ったらできなくて
どうしたらいいかわからなくなっていたのでorz
すいません。
930880:2006/09/26(火) 04:57:05
>>928
そうです。書き込むのにさすがに本名入ってるのはどうかと思いまして・・・
931(^-^) ◆MONSOON/qo :2006/09/26(火) 04:59:40
>>930
日本語が入ってるとBCCがコンパイル失敗する模様
日本語が入ってない場所に保存するとOK

ファイル→新規作成 で日本語でないディレクトリ名に変更する
932デフォルトの名無しさん:2006/09/26(火) 05:08:18
スレ間違えたかとおもた
933デフォルトの名無しさん:2006/09/26(火) 06:43:32
なんかwww
934デフォルトの名無しさん:2006/09/26(火) 07:09:53
BCCスレなり何なりに誘導すればよかったんじゃね。
935デフォルトの名無しさん:2006/09/26(火) 07:53:25
>>929
>921で過ちに気付きながら何故未だ居座る。いい加減、BCCスレなりに逝け。

>>931
おまえもだ、この馬鹿珍。
936デフォルトの名無しさん:2006/09/26(火) 09:19:52
コンテナの標準のイテレータと少し挙動の違うイテレータを定義しようと思っています。
イテレータクラスを定義する為のテンプレートって用意されているのでしょうか?
また独自のコンテナもどきのライブラリを作ったときにイテレータを用意する為に
使える便利なテンプレートってあるのでしょうか?
937デフォルトの名無しさん:2006/09/26(火) 09:47:32
>◆MONSOON/qo
>◆MONSOON/qo
>◆MONSOON/qo
>◆MONSOON/qo
>◆MONSOON/qo
938デフォルトの名無しさん:2006/09/26(火) 09:51:39
>>936
boost::iterator_facade, boost::iterator_adaptor

本当に何も頼らず1から作るならstd::iterator。最低限必要なtypedefをしてくれるだけ。
939デフォルトの名無しさん:2006/09/26(火) 09:58:55
新着レス 60
  _, ._
( ゚ Д゚)?



>◆MONSOON/qo
>880
>◆MONSOON/qo
>880
>◆MONSOON/qo
  _, ._
( ゚ Д゚)…
940デフォルトの名無しさん:2006/09/26(火) 10:03:23
新手の荒らし
941デフォルトの名無しさん:2006/09/26(火) 11:09:07
いまさら BCC とか言ってる時点で…
942デフォルトの名無しさん:2006/09/26(火) 11:35:27
一年ぐらい前から◆をNG登録してある俺が賢い
943デフォルトの名無しさん:2006/09/26(火) 11:38:07
釣り自演だから相手すんな
944デフォルトの名無しさん:2006/09/26(火) 11:56:09
boost::shared_ptr等のスマートポインタで if( sp ) { … } と書けるように
operator bool() や operator unspecified_bool_type() としているようですが
このunspecified_bool_typeがメンバ関数のポインタなのはなぜなのでしょうか?

あと、VC++ではoperator unspecified_bool_type()の方が使われましたが
operator bool()でも同じことが出来るようです。
operator unspecified_bool_type()を採用する理由はなんなのでしょうか?
945デフォルトの名無しさん:2006/09/26(火) 12:22:50
>>944
(1 + sp) がコンパイルできたら困るだろ。
946デフォルトの名無しさん:2006/09/26(火) 12:43:40
>>945
あ、なる。そういう理由だったんですか。
ありがとうございました。
947デフォルトの名無しさん:2006/09/26(火) 14:25:04
>>938 有難うございました。
これで自作コンテナクラスもどきも
一人前にイテレータを持つことができます。
立派になったもんです。
948デフォルトの名無しさん:2006/09/26(火) 20:50:54
class A {
  public:
  A(){};
};
A *a = new A();
A *b = new A;

この違いってありますか?
949デフォルトの名無しさん:2006/09/26(火) 21:16:56
ない
950デフォルトの名無しさん:2006/09/26(火) 21:27:47
A()は関数かと思われちゃう事があるね
951デフォルトの名無しさん:2006/09/26(火) 21:48:43
ねーよw
952デフォルトの名無しさん:2006/09/26(火) 21:53:04
>>951
A A(); のことだろ。
953952:2006/09/26(火) 21:55:07
間違えた。
×:A A();
○:A a();
954デフォルトの名無しさん:2006/09/26(火) 22:08:11
>>950
たしかコンパイラがそんな感じの間違いをすることがあるっけ。
955デフォルトの名無しさん:2006/09/26(火) 22:08:24
>>953
それと>>951になにか関係あるのか?
A()と全然形が違うじゃないか
956デフォルトの名無しさん:2006/09/26(火) 22:43:24
957デフォルトの名無しさん:2006/09/26(火) 22:45:34
>>948
組込型なんかでは0初期化をするかどうかという違いがあったはず。
コンストラクタで初期化がないクラスのメンバにも同じことが適用された気がする。
958デフォルトの名無しさん:2006/09/26(火) 22:54:22
なんかパソコン初心者から、C++詳しい人まで色々いるな
でも、この雰囲気好き。
偉そうな文体で、「それくらいしっとけ」みたいな書き込みばっかりで
肝心な質問に対しての答えをかかない、別スレとは大違い。
959デフォルトの名無しさん:2006/09/26(火) 22:58:30
どこの誤爆だ
960デフォルトの名無しさん:2006/09/26(火) 23:16:02
>>955
>>948の場合は(クラスなので)違いはないが(クラス以外だと>>957)
A a;  // A型のオブジェクトaの宣言(と定義)
A a(); // Aを返す引数なしの関数aの宣言
のような全く別のものなので、newする時の感覚で常に()をつけていると
(特に他言語から入った人が)たまに間違えたり、
コンパイルエラーが出たりする、ということを言いたいのでしょう。
961デフォルトの名無しさん:2006/09/26(火) 23:47:23
ぇ?違いあんの?

>>957が言ってるのは
class A
{
int i;
};

A *a = new A(); or A;
でiが0初期化されるとか?
962957:2006/09/27(水) 00:28:23
>>961
そのこと。もし勘違いだったらすまんな。
963デフォルトの名無しさん:2006/09/27(水) 00:29:52
VC++6.0 MFC(ダイアログベース)

下記のソースコードを実行しても
ファイルがカキコミできません。
どなたか、ファイルが書き込みできない理由を
教えてください。

void CXfile_MotionReaderDlg::OnButton1()
{
CFileDialog *dlgFile;

dlgFile = new CFileDialog(
TRUE, // 種類 TRUE : FileOpen
_T("jpg"), // デフォルトの拡張子
_T("*.jpg"),// 初期ファイル名
OFN_FILEMUSTEXIST, // ダイアログの設定フラグ:既存のファイル
_T("Wave(*.jpg)|*.jpg|全て(*.*)|*.*||")// フィルタ
);

if(dlgFile->DoModal() == IDOK)
{
CStdioFile fout( "file.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary );
fout.WriteString( dlgFile->GetPathName() );
fout.Close();
}

delete dlgFile;

}
964デフォルトの名無しさん:2006/09/27(水) 00:42:48
>>963
多分、カレントディレクトリがCFileDialogのダイアログを操作したことで移動してる。
どっかのディレクトリに"file.text"が出来てると思うよ。
965964:2006/09/27(水) 00:46:26
つーかスレ違い

■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
966879:2006/09/27(水) 00:53:48
>>956
専用スレがあったのね。さんくす
967デフォルトの名無しさん:2006/09/27(水) 01:10:14
質問です。XP、VC++ 2005 です。
std::string の c_str() に関してです。

---------------------
std::string str = "hogehoge";

WNDCLASSEX wcex;
wcex.lpszClassName = str.c_str();
……(中略)

RegisterClassEx(&wcex);


上記のような内容で、RegisterClassEx に失敗しました。
ところが、str の内容を変更するだけで、登録に成功したりしなかったりします。
そこで私は、c_str() で渡されたポインタが RegisterClassEx の段階で有効である保証がなく、
上記のような渡し方は間違っている、とのように考えました。
解決法として、char 型の配列に一旦文字列をコピーしています。

ところが、API に string を渡すときなどは、
HogeHogeAPI(str.c_str());
などのように、c_str() の戻り値を直接渡しているサンプルをよく見かけます。

この場合は、返されるポインタが有効であることは保証されるのでしょうか。
また、最初の例のような場合は、char の配列などにコピーする方法は正しいのでしょうか?

よろしくお願いします。
968デフォルトの名無しさん:2006/09/27(水) 01:18:15
>>967
string インスタンスが生きてて、変更を加えない限りは有効。
有効なうちに API に渡していれば、 API が内部でポインタを
保存するような仕様でない限り、問題無い。 char 配列へのコピーは不要。
RegisterClassEx() が失敗した原因は GetLastError() で調べるように。
969デフォルトの名無しさん:2006/09/27(水) 01:22:17
>>967
その辺りは、APIの実装に大きく依存することになるので詳細はAPIスレでどうぞ。
要は、そのAPIが必要としているものは何かが微妙に異なるのだろう。
970967:2006/09/27(水) 01:29:13
>>968-969
GetLastError() を行うことを失念していました。
よく分かりました、ありがとうございます。
971デフォルトの名無しさん:2006/09/27(水) 10:16:42
VisualC++6.0とEasyLinkLibraryでDirectXを使って簡単なプログラムを作っています
しかし、プログラムを実行する方法が
VisualC++の開発画面上でコンパイルする方法しか解りません

Windows上でアイコンをクリックして普通のアプリケーションとして起動させるには
どうすればいいのでしょうか?
972デフォルトの名無しさん:2006/09/27(水) 10:25:32
>>971
C++ 関係ない。スレ違い。↓こっち逝け。

【初心者歓迎】C/C++室 Ver.30【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1156145593/

その質問内容でそのまま移動しても
「アイコンクリックすればいいんじゃね?」で終了なので、
「やりたいこと」と「やったこと」と「どうなったのか」を全部
正確に書くように。
973デフォルトの名無しさん:2006/09/27(水) 12:21:46
c++とマスキャドってどっちがすぐれてますか?
974デフォルトの名無しさん:2006/09/27(水) 12:55:14
パッキャラマドの方が優れてます
975デフォルトの名無しさん:2006/09/27(水) 13:24:25
もしかして:バッキャマラド
976デフォルトの名無しさん:2006/09/27(水) 13:39:49
Au pas camarades Au
パが正解な気がする
977デフォルトの名無しさん:2006/09/27(水) 14:13:32
それ、何語?
978デフォルトの名無しさん:2006/09/27(水) 14:38:42
フランス語っぽい。
979デフォルトの名無しさん:2006/09/27(水) 14:42:25
>>978
もしかしなくてもフランス語、
僕の大好きなクラリネット〜♪
って曲の歌詞の一部
980デフォルトの名無しさん:2006/09/27(水) 14:44:01
ご幼少のミギリから疑問だった
どういう意味?
981デフォルトの名無しさん:2006/09/27(水) 14:52:00
pas
名詞: 踊り
助動詞: 否定

camarade
名詞: 仲間
982デフォルトの名無しさん:2006/09/27(水) 14:53:27
983デフォルトの名無しさん:2006/09/27(水) 14:54:06
直訳すると、「仲間と足並みを揃えて・・・」位の意味になるのか。
984デフォルトの名無しさん:2006/09/27(水) 14:57:34
Altavistaによる英訳

I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
I like onion fried with oil
I like onion when it is good.
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
With the step comrades,
the step comrades,
the step, the step, the step!
One will bore the side to them
One will bore the Rantanplan side to them draws lira Rantanplan
One will bore the side to them Which we will laugh
985デフォルトの名無しさん:2006/09/27(水) 15:01:42
つーか980過ぎたじゃん。次スレをそろそろ・・・・
986デフォルトの名無しさん:2006/09/27(水) 15:05:56
987デフォルトの名無しさん:2006/09/27(水) 15:34:14
タマネギかよ!!!!
タマネギなのかよ!!!!!

あれほど大騒ぎしたその結末が、
タマネギなのか!!!!

もう、絶望した。
988デフォルトの名無しさん:2006/09/27(水) 15:57:48
次スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
989デフォルトの名無しさん:2006/09/27(水) 15:59:53
どこかに任意のタイミングでファイルオープンとファイルクローズが出来るデバックツールってないですかね?
CreateFileとかCopyFile等の動作チェック用です。
自分で作ってもいんですが、既に多機能な機能やグラフィカルなツールがあるかもしれないので、探しています。
よろしくおねがいします。
990デフォルトの名無しさん:2006/09/27(水) 16:00:43
ちょw
まあいいか、お疲れ様です。
991デフォルトの名無しさん:2006/09/27(水) 16:02:04
埋め
992デフォルトの名無しさん:2006/09/27(水) 16:02:22
埋め
993デフォルトの名無しさん:2006/09/27(水) 16:02:37
埋め
994デフォルトの名無しさん:2006/09/27(水) 16:02:57
埋め
995デフォルトの名無しさん:2006/09/27(水) 16:03:20
埋め
996デフォルトの名無しさん:2006/09/27(水) 16:03:40
埋め
997デフォルトの名無しさん:2006/09/27(水) 16:03:46
斜視
998デフォルトの名無しさん:2006/09/27(水) 16:03:48
埋め
999デフォルトの名無しさん:2006/09/27(水) 16:03:57
埋め
1000デフォルトの名無しさん:2006/09/27(水) 16:04:22
埋め
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。