■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part52
1 名前:v(^・^)v :2006/08/26(土) 02:08:15
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

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

前スレ
C++相談室 part51
http://pc8.2ch.net/test/read.cgi/tech/1153079297/

2 名前:デフォルトの名無しさん :2006/08/26(土) 02:08:45
1 http://piza.2ch.net/tech/kako/980/980175292.html
2 http://pc.2ch.net/tech/kako/996/996640937.html
3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:デフォルトの名無しさん :2006/08/26(土) 02:09:26
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:デフォルトの名無しさん :2006/08/26(土) 02:09:59
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/

5 名前:デフォルトの名無しさん :2006/08/26(土) 02:10:30
46 http://pc8.2ch.net/test/read.cgi/tech/1136690107/
47 http://pc8.2ch.net/test/read.cgi/tech/1139931895/
48 http://pc8.2ch.net/test/read.cgi/tech/1142423595/
49 http://pc8.2ch.net/test/read.cgi/tech/1146185570/
50 http://pc8.2ch.net/test/read.cgi/tech/1149427282/
51 http://pc8.2ch.net/test/read.cgi/tech/1153079297/

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
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)

8 名前:デフォルトの名無しさん :2006/08/26(土) 02:14:17
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

9 名前:デフォルトの名無しさん :2006/08/26(土) 02:14:49
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

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/

11 名前:v(^・^)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が規格に則って正しく実装されているなら、
実装の詳細は関係ない。

31 名前:29 :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 を、他方の実装が使われた
プロセスで正しく操作することはできない。

33 名前:29 :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++コンパイラばかりでもないぞ。
まあ作業時の方が問題だというのはそうだろうな。

38 名前:26 :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って変数の型を指定していなかった場合、
処理の途中で現在の型の範囲を超える値になった時に
その変数の型をより大きな範囲を表現できる型に自動で変更してくれる。

42 名前:34 :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のコンテナにアルゴリズムを適用させるようになってからだろう。

87 名前:79 :2006/08/28(月) 23:48:29
>>80-83
ありがとうございます。
無知なもので、operator=が暗黙的に定義されることを知りませんでした。

やりたいことはメンバ変数の代入だけなので、それで解決しました。


88 名前:デフォルトの名無しさん :2006/08/28(月) 23:52:44
ポインタはコピーしないようにな。

89 名前:79 :2006/08/28(月) 23:55:55
>>88
以前は配列にポインタを使っていたんですが、vectorに変えたので大丈夫です。
わざわざありがとうございます。


90 名前:デフォルトの名無しさん :2006/08/29(火) 00:00:55
vectorってビット毎のコピーで大丈夫なんかな?実装にもよるけど、
ヒープ領域に実体を持ってて、メンバにはポインタを含んでいそうな
気がするんだけど。

91 名前:79 :2006/08/29(火) 00:03:48
>>90
vectorのoperator=で、新しくヒープに領域を確保すると思ってたんですが・・・
そう言われると不安になってきました


92 名前:79 :2006/08/29(火) 00:06:07
int main()
{
myClass t;
for( ;; ) {
}

93 名前:79 :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 付きの参照で置き換えると
コピーを必要とせずにほぼ同じ効果を得ることが出来るので大きなクラスに限らず
よく使われる。

107 名前:104 :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のプリミティブ型が常に値渡し、それ以外は常に参照渡し
とかよっぽど紛らわしいと思うんだが


161 名前:Lisper :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

222 名前:209 :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
流れ嫁。

245 名前:223 :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++ 使うべきじゃない。
ここで聞いた答えなんか当てにするのも間違い。コンパイラにコード吐かせて確かめろ。


■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.