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


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

C++相談室 part30
1 名前:v(^・^)v :04/05/09 00:39
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-9 あたり

2 名前:デフォルトの名無しさん :04/05/09 00:40
  1 http://mimizun.mine.nu:81/2chlog/tech/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
 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/

3 名前:デフォルトの名無しさん :04/05/09 00:41
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://std.dkuug.dk/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)

4 名前:デフォルトの名無しさん :04/05/09 00:41
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 http://www.amazon.com/exec/obidos/ASIN/0201700735/
 http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 http://www.amazon.com/exec/obidos/ASIN/0201824701/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 http://www.amazon.com/exec/obidos/ASIN/0201379260/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 http://www.amazon.com/exec/obidos/ASIN/0201924889/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 http://www.amazon.com/exec/obidos/ASIN/020163371X/
 http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/0201615622/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 http://www.amazon.com/exec/obidos/ASIN/020170434X/
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/

5 名前:デフォルトの名無しさん :04/05/09 00:42
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://user.ecc.u-tokyo.ac.jp/~s31552/wp/boost/
 (日本語) http://www.kmonos.net/alang/boost/
[STL]
 STLport http://www.stlport.org/
 SGI-STL http://www.sgi.com/tech/stl/
 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://www.moderncppdesign.com/
 LokiPort-MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
[他]
 ACE http://www.cs.wustl.edu/~schmidt/
 Blitz++ http://www.oonumerics.org/blitz/
 flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
[他ライブラリリンク集]
 http://www.trumphurst.com/cpplibs/cpplibs.phtml
 (日本語) http://www.kmonos.net/alang/cpp/lib.html

6 名前:デフォルトの名無しさん :04/05/09 00:46
■関連スレ■
- 【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/l50
- C/C++の宿題をやらせて、お兄ちゃん 22代目
http://pc5.2ch.net/test/read.cgi/tech/1083050221/l50
- C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/l50
- managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
- ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/l50
- COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/l50

7 名前:デフォルトの名無しさん :04/05/09 00:49
■コンパイラスレ■
- タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50
- GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
- タダで使えるVisual C++
http://pc5.2ch.net/test/read.cgi/tech/1082177340/l50
- タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
- OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/l50
- Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/l50

8 名前:デフォルトの名無しさん :04/05/09 00:50
■開発環境スレ■
- ★初心者にVisual C++を教えるスレ★ Part12
http://pc5.2ch.net/test/read.cgi/tech/1083585833/l50
- ■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/l50
- C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
- Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50

9 名前:v(^・^)v :04/05/09 00:52
はじめてすれ建てしたよ。
関連スレは増えてたんで適当にわけたよ。
足りない分は補充よろしくです。
テンプレは以上です。

10 名前:デフォルトの名無しさん :04/05/09 00:52
乙!

11 名前:デフォルトの名無しさん :04/05/09 00:58
それでは地鎮祭を始めてください。

12 名前:デフォルトの名無しさん :04/05/09 00:59
D言語でいこう

13 名前:いいわけ巫女の地鎮祭 :04/05/09 01:01
春ですね〜


呑まれねばなるまい
呑まれねばなるまい

14 名前:デフォルトの名無しさん :04/05/09 01:14
>>前スレ990
> 恥ずかしながら関数型という言葉を知らないんだが具体例をきぼん。

typedef int filter( int );
filter identity;
int identity( int x ){ return x; }
boost::function< filter > f = identity;

とか。

15 名前:デフォルトの名無しさん :04/05/09 01:16
filter* p = identity;
とか。

16 名前:デフォルトの名無しさん :04/05/09 01:18
それにしても、前スレ>>988の必死さと頭の悪さは笑えた。

17 名前:デフォルトの名無しさん :04/05/09 01:19
↑自作自演か?

18 名前:デフォルトの名無しさん :04/05/09 01:22
そんなにかまってもらいたいのか?

19 名前:デフォルトの名無しさん :04/05/09 01:23
>>16-17
つまらん自演で「場がその話題で盛り上がってるフリ」して楽しいか?

20 名前:デフォルトの名無しさん :04/05/09 01:24
自演乙

21 名前:さらしておこう :04/05/09 01:25
976 :デフォルトの名無しさん :04/05/08 23:09
>>972
それはお前がバカだから、

Effective C++

読んでから言え。もっとも積極的に勧めてるわけじゃなく、
両方読める必要があると言っている。
お前はそれを知らなかったんだから、知る必要があったわけだ。
無知をひけらかして恥さらすな。

988 :デフォルトの名無しさん :04/05/08 23:28
>>983
お前が何にも知らんことは文面から用意に察することができたのでバカでも知ってる教科書名を挙げてやったのよ。
一通りよんでりゃ、const の前置、後置ぐらいでスレ汚すバカは居ないだろうからな。勉強になったことを感謝しろ。

日 本 海 溝 よ り 教 育 レ ベ ル の 低 い 糞 ガ キ よ 。

999 :デフォルトの名無しさん :04/05/08 23:45
>バカはおまえだ。俺は両方の表現知ってたし、
バーカ。こんなこと知ってるぐらいのことを何宣言してんだ。アホの活造りかおまえ。


22 名前:デフォルトの名無しさん :04/05/09 01:27
オーバーロードとオーバーライド
それぞれの機能は認識してるんだけど、名前が時々どっちだったっけって
迷う。何か良い憶え方無い? ゴロ合わせでもいいんだけど…

23 名前:デフォルトの名無しさん :04/05/09 01:28
Expression Template
はテンプレートスレがいいのかな?

24 名前:デフォルトの名無しさん :04/05/09 01:29
>>22
「オペレータ・オーバーロード」はきいたことあるっしょ?
これを覚えておけばどっちがどっちかすぐにわかるでしょ。

25 名前:デフォルトの名無しさん :04/05/09 01:29
>>22
C++はオーバーロード。
Javaはオーバーライド。

26 名前:デフォルトの名無しさん :04/05/09 01:30
D言語は?

27 名前:デフォルトの名無しさん :04/05/09 01:31
オーバードース

28 名前:デフォルトの名無しさん :04/05/09 01:32
「ロリコンは多人数」と覚えておけ。

29 名前:デフォルトの名無しさん :04/05/09 01:35
>>22
オーバーライドという単語の"ride = 乗っかる"の部分に注目すれば、
認識するのは容易だと思うけどなぁ。

ずっとカタカナで考えてると混乱するかもね。

30 名前:デフォルトの名無しさん :04/05/09 01:36
オーバーロード:(道は)一つだけとは限らない、沢山ある
オーバーライド:乗り移る

31 名前:デフォルトの名無しさん :04/05/09 01:38
別に名前憶えてなくとも、組めりゃいい

32 名前:デフォルトの名無しさん :04/05/09 01:40
Object Pascalだとキーワードになってるから覚えなきゃいけない。

33 名前:デフォルトの名無しさん :04/05/09 01:42
エレベーターとエスカレーターがごっちゃになる
どこぞの関西弁女子高生を思い出した

34 名前:デフォルトの名無しさん :04/05/09 01:46
オーバーロードのロードって道(road)だったのか・・・

35 名前:デフォルトの名無しさん :04/05/09 01:49
チガウヨ

36 名前:デフォルトの名無しさん :04/05/09 01:51
>>23
そうだね。あっちネタ切れ気味だから。

37 名前:デフォルトの名無しさん :04/05/09 01:56
>>22
結 論
そのくらい覚えろ。

38 名前:デフォルトの名無しさん :04/05/09 02:00
>>37
お前がダントツで一番役立たずだなw

39 名前:デフォルトの名無しさん :04/05/09 02:03
まあアレだ、
カタカナより日本語の方が日本人にとって
覚えやすいのは確かだ。

40 名前:22 :04/05/09 02:13
みんなありがとう!
英語の弱いロリコンの俺は、>>28 で逝きまつ

41 名前:デフォルトの名無しさん :04/05/09 02:14
カタカナは日本語ではないそうです。

42 名前:デフォルトの名無しさん :04/05/09 02:18
オーバーロードのロードはだな
THE虎舞竜 ロード第一章
のロードだと覚えとけばイイ!!

43 名前:22 :04/05/09 02:37
>>42
そっちの方がわかりやすいですね。

44 名前:デフォルトの名無しさん :04/05/09 02:38
>>42
THE 虎舞竜のロードは奴らにとって“道”ではなく“重荷”だったといいたいわけか?


45 名前:デフォルトの名無しさん :04/05/09 02:43
>>44
>>22読め。
「ゴロ合わせでもいい」って書いてあるだろ。

46 名前:デフォルトの名無しさん :04/05/09 03:32
>>45
ごめん、>>42 のどこがどう語呂合わせになってるのかさっぱり分からないんだけど。
ロード第一章で覚えておくと、なんでオーバーライドとオーバロードの違いが覚えられるの?


47 名前:デフォルトの名無しさん :04/05/09 04:29
オーバーロード:(同じ名前の関数を)ロードし過ぎ
オーバーライド:上書き

48 名前:デフォルトの名無しさん :04/05/09 05:42
オーバーロード:横のつながり
オーバーライド:縦のつながり

49 名前:前スレ990 :04/05/09 12:06
>>14-15
thx!
特にC++に限った話でもなかったか。

50 名前:デフォルトの名無しさん :04/05/09 17:55
STLつかうと一気に実行ファイルサイズが10倍に?!

51 名前:デフォルトの名無しさん :04/05/09 17:56
>>50
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

52 名前:デフォルトの名無しさん :04/05/09 18:06
>>51
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

53 名前:デフォルトの名無しさん :04/05/09 18:06
>>51
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

54 名前:デフォルトの名無しさん :04/05/09 18:06
あぁ今スレではまだだったか。

55 名前:デフォルトの名無しさん :04/05/09 18:06
>>52
スマソ(w
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいのですか?

56 名前:51 :04/05/09 18:13
糞が黙ってろ!市ね

57 名前:デフォルトの名無しさん :04/05/09 18:17
>>55
#include "stdafx.h"

後死ね。

58 名前:デフォルトの名無しさん :04/05/09 18:17
>>57
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

59 名前:デフォルトの名無しさん :04/05/09 18:20
あぁ自作自演

60 名前:デフォルトの名無しさん :04/05/09 18:21
つうか、もう飽きたよ

61 名前:デフォルトの名無しさん :04/05/09 18:28
class A
{
int a;
int b;
public:
void Set(int i, int j) {
a = i;
b = j;
}
}

などと適当に作って、printf("%d\n", sizeof(A)); してみると8バイトって
出るんですが、メンバ関数の部分ってメモリを食わないんでしょうか?


62 名前:デフォルトの名無しさん :04/05/09 18:29
ポインタ

63 名前:デフォルトの名無しさん :04/05/09 18:32
>>61
面罵関数へのアドレスはコンパイル時に決定されるから要らない。
ただvirtualなものがある場合VMT分の領域が要る。

64 名前:デフォルトの名無しさん :04/05/09 18:35
>>61
クラスインスタンスごとに必要なメモリ量にメンバ関数自体は関係ない。

それでも、「メモリを食わない」とは言い切れなくって、
virtual関数の有る無しで間接的に影響することはあるし、
コード領域としてメモリを食うと言えるかもしれない。

> 面罵関数へのアドレスはコンパイル時に決定されるから要らない。
なんか胡散臭い説明だなぁ。

65 名前:デフォルトの名無しさん :04/05/09 18:53
で、復刊C++プログラミングの筋と定石を買った奴はいるのか。

66 名前:デフォルトの名無しさん :04/05/09 19:02
これって原書Advanced C++のこと??

67 名前:デフォルトの名無しさん :04/05/09 19:55
クラスのメンバ変数を static にする理由って何ですか?

68 名前:デフォルトの名無しさん :04/05/09 19:58
>>67
個々のインスタンスではなく、クラス全体で共有したいから。

69 名前:デフォルトの名無しさん :04/05/09 20:57
>>67
同じ内容を各インスタンスの中それぞれに含むのは効率が悪いんだよ。

70 名前:デフォルトの名無しさん :04/05/09 21:09
>>67
なんとなく。

71 名前:デフォルトの名無しさん :04/05/09 21:22
>>67
デザパタ本を読めばわかるかもよ。GoFなんかスタンダードな所で。

72 名前:マイク ◆yrBrqfF1Ew :04/05/09 22:01
>>67
インスタンスではなく、そのクラス自体の属性を表現する場合に用いる

73 名前:質問アゲ :04/05/09 22:40
組み込み用に書いたCのソースの動作をGUIでテストしたいのですが、
VC++やBCBなどのC++からCを動かす方法でいいアイデアがあったら
教えてください。

とりあえず思いついたのはC++のクラス定義部分にて
class hoge{
public:
  #include "目的のソース.c"
}
と書いて動かしています。

74 名前:デフォルトの名無しさん :04/05/09 22:42
>>73
普通はCモジュールのヘッダファイルの頭に
#ifdef __cplusplus
extern "C" {
#endif
を、最後に
#ifdef __cplusplus
}
#endif
を書けばC++から普通に呼べるんだがね

75 名前:デフォルトの名無しさん :04/05/09 22:43
namespace hoge {
extern "C" {
#include "目的のソースのヘッダ.h"
}
}

クラスにすりゃGUIになるってもんでもないし、
こうして使えばいい。

76 名前:質問アゲ :04/05/09 22:44
>>74
普通でない環境で開発しているんだがね

77 名前:デフォルトの名無しさん :04/05/09 22:45
>>76
普通でなくても >>74が通用しないなんて考えにくいが

78 名前:デフォルトの名無しさん :04/05/09 22:49
>>質問アゲ
質問する態度じゃない
カエレ!

79 名前:デフォルトの名無しさん :04/05/09 22:50
環境はVCとかBCCなんだろ?
普通じゃん。

80 名前:デフォルトの名無しさん :04/05/09 22:52
>>77
76は最近良く沸いてるage嵐じゃないの?
73の態度から76はちょっと考えづらい。

81 名前:78 :04/05/09 22:54
あぁ、そうかも。
だったらスマンかった。。。>73

82 名前:デフォルトの名無しさん :04/05/09 22:55
>>73
その「Cのソース」をコンパイラのオプションか拡張子を変更してC++ソースとしてコンパイルしてみれ
もし問題が全く起きないか、容易に解決できる問題しか発生しなければそれがベスト。

83 名前:デフォルトの名無しさん :04/05/09 23:17
>>82
は?

84 名前:デフォルトの名無しさん :04/05/09 23:56
>>83
Cとして書かれたソースでも、C++としてコンパイルできる場合があるということ。
って、あまり説明になってないが、わからんかな?
俺は82じゃないけど、意味わかったぞ。

85 名前:デフォルトの名無しさん :04/05/10 01:54
Effective C++ にメンバ変数をpublicにすんなって書いてあったので、

class AGE {
private:
std::vector< double > _age;
...その他もろもろ
public:
AGE( size_t size ) : _age( size ) {}
std::vector< double >& age( void ) { return _age; }
...その他もろもろ
};

void fun( std::vector< double >& ){...}

int main( void ) {
AGE age( 10000 );
fun( age.age() );
...
}
と書いたらメンバの参照を返すなとも書いて有りますた。
漏れはどうしたらいいでつか?



86 名前:デフォルトの名無しさん :04/05/10 02:04
class AGE {
 ...
public:
 ...
 void fun() { fun( _age ); }
 ...
};

87 名前:デフォルトの名無しさん :04/05/10 02:05
double& AGE::GetAgeData(const unsigned int nIndex)
{
if(nIndex < _age.size())
return _age.at(nIndex);
else
return -1;
}

みたいなもん作れってことか?

88 名前:デフォルトの名無しさん :04/05/10 02:08
>>86 ども。
AGEは汎用にしたくて(DATAのバッファ用等)fun()とかメンバ関数持たせたくない場合はやむを得ずでしょうか?

89 名前:デフォルトの名無しさん :04/05/10 02:18
>>88
互いに関係の無いもの同士をひとつにまとめるだけならpublicなデータメンバによるstructにすればいい。

「メンバ変数をpublicにすんな」、「メンバの参照を返すな」というのは、
クラスがただのデータの集まり以上の意味を持つとか、
データメンバの間に常に保たなければならない整合性があるとか、
そういった場合の話。
ただのデータの集まりならstructで単純にまとめればいい。

90 名前:デフォルトの名無しさん :04/05/10 02:18
便乗です。メンバ変数のポインタは返してもいいのですか。

91 名前:デフォルトの名無しさん :04/05/10 02:19
返すのは自由だが、どう使うつもりなんだ?

92 名前:デフォルトの名無しさん :04/05/10 02:21
>>89 了解です。ありがと。

93 名前:デフォルトの名無しさん :04/05/10 02:28
>>91
SoBigはとてもデータのサイズが大きい構造体です。
class a
{
SoBig big;
public:
SoBig* GetData(){return &big;}
};
つまり、値で返してしまうとコピーに時間がかかってしまうのでポインタを渡すということです。

94 名前:デフォルトの名無しさん :04/05/10 02:31
>>93
そういうときはせめてconstつける。つか、参照で充分だが。

95 名前:デフォルトの名無しさん :04/05/10 02:43
Sobigは嫌なウイルスだったな…

96 名前:デフォルトの名無しさん :04/05/10 02:44
誤爆スマソ

97 名前:デフォルトの名無しさん :04/05/10 10:31
このスレもC言語スレ並にネタスレ化してきたな

98 名前:デフォルトの名無しさん :04/05/10 10:43
>>97
馬鹿が増えたからだよ(もちろん俺様を除く)。

99 名前:デフォルトの名無しさん :04/05/10 12:19
このスレもネタスレ化してきたな

100 名前:デフォルトの名無しさん :04/05/11 00:35
100げt

101 名前:デフォルトの名無しさん :04/05/11 00:58
グローバル変数a,bがあります。

class A {
public:
 int value;
 A() { value = 1; }
};

A a;

class B {
public:
 int value;
 B() { value = a.value; }
};

B b;

こういうので、aがコンストラクトされるまえにbがコンストラクトされてしまって
bは正しく初期化されない、ということってありえますか?
正しくは b.value == 1 になると思うのですが実際には0になります。
関係あるか分かりませんが、aとbは実際には別の翻訳単位で定義されています。
つかってるのはvc.net2003です。



102 名前:デフォルトの名無しさん :04/05/11 01:03
>>101
globalの初期化の順序は不定。


103 名前:デフォルトの名無しさん :04/05/11 01:04
>>101
というか、ダメな見本のようなコーディングだよな。

104 名前:デフォルトの名無しさん :04/05/11 01:06
>>102
どうすりゃいいの?

105 名前:デフォルトの名無しさん :04/05/11 01:14
>>104
それぐらい考えろ。

106 名前:デフォルトの名無しさん :04/05/11 01:20
自己解凍しました

107 名前:デフォルトの名無しさん :04/05/11 01:46
イニシャライズ用の関数若しくはクラスを作って
初期化の依存関係に応じてイニシャライザを呼ぶ

108 名前:デフォルトの名無しさん :04/05/11 04:53
自家生産しました

109 名前:デフォルトの名無しさん :04/05/11 09:56
つまんないから

110 名前:デフォルトの名無しさん :04/05/11 12:25
>>>104
>それぐらい考えろ。
嫌ならわざわざ書き込むな糞が。

111 名前:デフォルトの名無しさん :04/05/11 13:24
>>110
違うよ。最初からそれぐらい考えろって言ってる訳じゃなく、
ヒントを与えてから言ってる。

別にやりたくもない宿題だったらまだしも自分でプログラムの勉強してるなら
考えないとダメになる。

112 名前:デフォルトの名無しさん :04/05/11 13:32
>>111
C++FAQ第2版の16.14〜16.18に解決策が載ってるよ。
これはその一番最初の例。Bの静的変数はA内に保持する方法。
class B {
public:
 int value;
 B(int v) : value(v) {}
 void f() { std::cout << "B::f(), value = " << value << std::endl; }
};

class A {
protected:
 static B& bo(int x) {
  static B* p = new B(x);
  return *p;
}
public:
 int value;
 A() { value = 1; }
 void f() {
  std::cout << "A::f(), value = " << value << std::endl;
  bo(value).f();
 }
};

A a;

int main()
{
 a.f();
}

113 名前:デフォルトの名無しさん :04/05/11 13:47
Bのstatic変数はA内からbo(int)としてアクセスできる。
もしこのintが邪魔なら

static B& bo(int x = 0) {
  static B* p = new B(x);
  return *p;
}

とでもすればいい。とにかくAがBより先に初期化されて欲しければ
Aの内部にBを持つしかない。

114 名前:デフォルトの名無しさん :04/05/11 14:04
>>113
そんなことするよりも>>107の方が断然いい。
ほんとに一度しか初期化されたくなければフラグ持たせればいいわけだし。

115 名前:デフォルトの名無しさん :04/05/11 14:21
>>114
「シングルトン」でググれ。
ついでに、「僧衣」でググれ。

116 名前:デフォルトの名無しさん :04/05/11 14:30
>>115
singletonとは別だろ?
というか>>101が何をしたいかによる。
インスタンスが一つしか嫌だってばあいはsingletonだし
複数持ちたい場合はsingletonじゃダメだし。

117 名前:デフォルトの名無しさん :04/05/11 14:33
多くの場合、シングルトンで作ると可植性・拡張性が落ちるよ。

118 名前:デフォルトの名無しさん :04/05/11 14:37
何でもかんでもすぐにデザパタっていうのは嫌い。
もちろんデザパタはいいが使いかたも知らないで使ってる奴もいるし。

119 名前:デフォルトの名無しさん :04/05/11 14:46
理想としてはアリなんだけどね。現実が・・・。

120 名前:101 :04/05/11 16:57
実際はグローバルじゃなくてクラスのstatic変数なので
ポインタでもつようにしました。

121 名前:デフォルトの名無しさん :04/05/11 20:10
singletonというか、Phoenix singletonでない?
たしか、生成順の制御ができたやつ。

122 名前:デフォルトの名無しさん :04/05/11 21:09
実際にはそんな高尚なプログラムではなく、101の設計が悪いだけ、というのはありがちな話だ。

123 名前:デフォルトの名無しさん :04/05/11 22:59
>121
phoenix singleton は破棄の順序が問題になる場合。
今回は生成順序なので >107 で十分でしょ。
singleton はしばしば >107 のように実装されるけど、唯一性を目的としたものじゃ
なければ singleton じゃないわな。

124 名前:デフォルトの名無しさん :04/05/11 23:04
再利用できる部品を作る場合、いちいち生成順序を気にしたくないな

125 名前:デフォルトの名無しさん :04/05/11 23:09
>>124
同感。
かなり微妙だからね、生成順序って。
トレースさえ開始できないタイミングで生成されると
動作確認がお手挙げだし。

126 名前:デフォルトの名無しさん :04/05/11 23:33
singleton の生成にdouble checked locking パターン?
は使えないという記事をどこかで読んだけど、
どうしてダメなのか意味がわからんかった

誰かサルにもわかるように優しく教えてください

127 名前:デフォルトの名無しさん :04/05/11 23:36
>>126
http://www-6.ibm.com/jp/developerworks/java/020726/j_j-dcl.html

128 名前:デフォルトの名無しさん :04/05/11 23:36
>>126
デザパタスレってなかった?そっちで聞いた方がいいと思うけど?

129 名前:デフォルトの名無しさん :04/05/11 23:51
仕様変更に弱すぎ。>シングルトン

130 名前:126 :04/05/11 23:54
>>127
メモリ確保→コンストラクタ
の一連の処理がアトミックになってないって事なんですかね

なんとなく納得しました


微妙にスレ違いですんませんでした

131 名前:デフォルトの名無しさん :04/05/12 01:16
>>121

132 名前:デフォルトの名無しさん :04/05/12 05:10
メモリ確保とコンストラクトが
アトミックになってないなんて… > Java

使えないインスタンスを返すなんて重大な設計ミスのような希ガス。

133 名前:デフォルトの名無しさん :04/05/12 05:26
>>132
リンク先読んだ?>>130のコメントって外しているような・・・。


134 名前:デフォルトの名無しさん :04/05/12 07:57
instance =new Singleton();
が JIT で
mem = allocate();
instance = mem;
ctorSingleton(instance);
こんな擬似コードを出力するという主張らしいんだけど
スレッドを考えると少なくともこうしないとまずいよね。
mem = allocate();
ctorSingleton(mem);
instance = mem;

135 名前:デフォルトの名無しさん :04/05/12 08:36
つまり「double checked locking パターンは使えない」というのはJavaの話で、C++では問題ないのですか?

136 名前:デフォルトの名無しさん :04/05/12 08:37
>>135
コンテキストスイッチが発生する位置によっては
C++でも保証はされないだろうな

137 名前:デフォルトの名無しさん :04/05/12 09:05
>>136
そりゃ、C++の言語仕様でスレッドに関する保証を得るのは無理だけど、
正しく動作するlock/unlockを前提にすれば、
double checked lockingという手法自体は問題ないんじゃないの?

138 名前:デフォルトの名無しさん :04/05/12 09:40
>>137
必要なのはlock/unlockじゃなくて>>134


139 名前:デフォルトの名無しさん :04/05/12 09:46
>>138
だから、lock/unlockは前提と言うことで済ませた上で、
「C++では>>134のような問題はない」→「C++ではdouble checked lockingは問題ない」
ってことじゃないの?

140 名前:デフォルトの名無しさん :04/05/12 09:59
>>139
生成されるコードによるってことが分からないの?
あれはJavaに限った話じゃない。

C++では生成されるコードに対する規定はまったくなされてないよ。

141 名前:デフォルトの名無しさん :04/05/12 10:07
規格書を見てみたよ。

>5.3.4 New
>The new-expression attempts to create an object of the type-id or
>new-type-id to which it is applied. (中略) If the entity is a
>non-array object, the new-expression returns a pointer to the object
>created.

パラグラフの最後に"new は「生成された」オブジェクトのポインタを返す"
ってあるから、コンストラクタは通らないとまずいんじゃないかな。
コンストラクタを通らないと created にはならないんでは。
the object allocated なら別だけども。

142 名前:デフォルトの名無しさん :04/05/12 10:14
だから、そういう問題じゃないんだって。

143 名前:デフォルトの名無しさん :04/05/12 10:18
>>141
もっと低レベルな話。

144 名前:デフォルトの名無しさん :04/05/12 10:19
>C++では生成されるコードに対する規定はまったくなされてないよ。

どんなコードを生成してもいいってわけじゃあないし。
制限がなかったら規格の意味なんてない。

145 名前:デフォルトの名無しさん :04/05/12 10:30
C++ソースとその出力コードの組み合わせで、
>>127(>>134)の問題が発生するようなシナリオのサンプルきぼん。
出力コードは擬似でもいいです。

個人的には>>139が正しいと思ってます。

146 名前:デフォルトの名無しさん :04/05/12 10:36
>>145
分かったからageるなぼけ

147 名前:デフォルトの名無しさん :04/05/12 10:53
とりあえず、VC6の吐き出したコード。

337: EnterCriticalSection(&Singleton::cs);
004025E6 mov esi,esp
004025E8 push offset Singleton::cs (00405258)
004025ED call dword ptr [__imp__EnterCriticalSection@4 (00406228)]
004025F3 cmp esi,esp
004025F5 call _chkesp (00403004)
338: if (instance == NULL)
004025FA cmp dword ptr [Singleton::instance (00405274)],0
00402601 jne Singleton::getInstance+97h (00402647)
339: instance = new Singleton();
00402603 push 1
00402605 call operator new (0040302c)        ----- *1
0040260A add esp,4
0040260D mov dword ptr [ebp-14h],eax
00402610 mov dword ptr [ebp-4],0
00402617 cmp dword ptr [ebp-14h],0
0040261B je Singleton::getInstance+7Ah (0040262a)
0040261D mov ecx,dword ptr [ebp-14h]
00402620 call Singleton::Singleton (00402680)    ----- *2


148 名前:デフォルトの名無しさん :04/05/12 10:53
00402625 mov dword ptr [ebp-58h],eax
00402628 jmp Singleton::getInstance+81h (00402631)
0040262A mov dword ptr [ebp-58h],0
00402631 mov eax,dword ptr [ebp-58h]
00402634 mov dword ptr [ebp-10h],eax
00402637 mov dword ptr [ebp-4],0FFFFFFFFh
0040263E mov ecx,dword ptr [ebp-10h]
00402641 mov dword ptr [Singleton::instance (00405274)],ecx  ----- *3
340: LeaveCriticalSection(&Singleton::cs);
00402647 mov esi,esp
00402649 push offset Singleton::cs (00405258)
0040264E call dword ptr [__imp__LeaveCriticalSection@4 (00406224)]
00402654 cmp esi,esp
00402656 call _chkesp (00403004)

*1で一時領域にメモリの確保
*2でコンストラクタの呼び出し
*3で変数instanceへの格納
と、>>134でいう後者のパターンで構築が行われているので、
VCの吐き出したコードには問題がない。
じゃあ、前者のパターンのコードを掃き出すコンパイラがあったらどうなる?
Javaと同じ問題を抱える事になるね。


149 名前:デフォルトの名無しさん :04/05/12 10:55
>>148
a = new A();
と書いてるのなら、式の評価順序としては
コンストラクタの実行がaへの代入より後になるなんて考えられない気がするが
規格に規定ないの?

150 名前:デフォルトの名無しさん :04/05/12 11:07
mem = alloc();
ctor(mem);
a = mem;

上のコードが、最適化によって

a = alloc();
ctor(a);

にされちまうことがあるのかもしれんな。
スレッド間の干渉まで考慮してくれるような賢いコンパイラが要求されてるならvolatileなんてキーワードも必要ねーしな

151 名前:デフォルトの名無しさん :04/05/12 11:28
>>149
評価を終了せずに代入することはないから
まともな処理系なら問題なし。
まともじゃない処理系は…捨てたほうが。(ワラ

152 名前:デフォルトの名無しさん :04/05/12 12:04
なんか、議論がずれてない?MC++DのP157に出ているように
double checked lockingが保証されるかどうかはCPU(コンパイラ)の
問題なんじゃないの?

仮にdouble checked lockingが有効だったとしても、
allocateとctorの順番がどうであれMC++Dの
double checked lockingをつかったsingletonの
実装には関係なさそうに見えるし。

153 名前:152 :04/05/12 12:21
あーうそだ。
a = alloc();
ctor(a);
だったら、MC++Dの実装でもまずいか。orz
ただ、double checked lockingがCPU依存なのはOKだよね?

154 名前:デフォルトの名無しさん :04/05/12 13:13
a = new A();
は、
a.operator=(new A());
だから評価が終わるまで代入される事は無い。


155 名前:デフォルトの名無しさん :04/05/12 14:13
std::stringの文字列に、後から文字列を追加する場合、
メモリの再割り当ては行われているのでしょうか?
appendで追加すると、文字化けがおこってしまいますし、
resizeやreserveを行うと、既存文字列自体が破壊されているようです。
どうすればいいんのでしょうか?

156 名前:デフォルトの名無しさん :04/05/12 14:15
>>155
何やってるの? なんか変なことやってない?
appendはもちろん再割り当てが行われ得るし
reserveとかで既存の内容が破壊されるってことは普通ありえないが。
普通に代入してるのなら。

157 名前:デフォルトの名無しさん :04/05/12 14:19
>>155
もしかしてstringをstringのままで使わずに
文字列のポインタ得てそれを使い続けようとしてたりしてる?

158 名前:デフォルトの名無しさん :04/05/12 14:19
>>156
すいません。実行してみたらちゃんと出てました。
でもデバッグしてると、内容が「|r」とかわけわからんものになってるんです。
そいで、そのstringの_Mysizeとやらが16になってるんですが、
文字列の長さも16なんで、ヌル文字分が確保されていないように思うのですが。

159 名前:デフォルトの名無しさん :04/05/12 14:21
>>158
ああ、VC7.1で少なくともマルチスレッド版だと
16文字までは自身に格納し、それを超えたら参照カウント共有とかやってるみたいだね。
で、デバッガでみると間違ったほうが表示されたりすることがあるね。
まあそういうこと。とりあえずコード側でassertionとかdebug printとかで逃げてるよ。

160 名前:デフォルトの名無しさん :04/05/12 14:23
連カキすいません。
ちゃんと表示されてるのは、string tempとして、
temp.c_str()をやってるからなんでしょうか?

>>157
stringのまま使っています。
vcでデバッグして、tempの値をトレースしてると、文字化けが起こります。
具体的には、「ConsoleLog-1.txt」(16文字)という文字なんですが、
1の部分が2,3...10...20...と増えていくので、
ConsoleLogの後に「-」,「(数字)」,「.txt」を3回に分けてappendしています。

161 名前:デフォルトの名無しさん :04/05/12 14:25
>>159
そうなんですか。ありがとうです。
プログラム自体はちゃんと動くんですが、デバッグしてたら不安になりました。

162 名前:デフォルトの名無しさん :04/05/12 15:09
>>158
>ヌル文字分確保

std::stringがヌル文字分確保するなんて誰に聞いた?
.c_str() こちらは最後にヌル文字が付加されるね。

163 名前:デフォルトの名無しさん :04/05/12 15:13
長さを知ってれば'\0'はいらないのれす

164 名前:デフォルトの名無しさん :04/05/12 17:03
vectorで、ある要素の直前に新しい要素を挿入したい場合どうしたらいいんでしょうか?
要素は独自定義のクラスのオブジェクトのポインタなんですが。

165 名前:デフォルトの名無しさん :04/05/12 17:05
>>164
insert

166 名前:デフォルトの名無しさん :04/05/12 17:10
>>165
insertでイテレータを指定しますよね?
ある要素のイテレータを取得するにはどうしたらいいんですか?
その要素のポインタは分かるんですけど。

167 名前:デフォルトの名無しさん :04/05/12 17:13
>>166
vector.begin()はrandom access iteratorを返すので
vector[i]のイテレータは (vector.begin() + i)で得られるけどな。

168 名前:デフォルトの名無しさん :04/05/12 17:16
>>167
なるほどー!
ありがとうごじます!

169 名前:デフォルトの名無しさん :04/05/12 19:45
教えてください。
istream_iteratorでdifference_typeってのを指定しますよね。
こんな感じ。

typedef vector<string>::difference_type deff_type;
ifstream infile("XXXXX");
istream_iterator<string, diff_type> input_set(infile);

このdifference_typeというのは、解説書によるとイテレータ
同士の減算を行った際の差を格納するための型だということでした。
これがどうもピンと来ないのですが、上の例だとイテレータ間の
stringが全部格納されるのでしょうか?しかし、型指定しただけで
そんなうまいこといくんでしょうか?それとも違うでしょうか?
そもそも組み込み型の配列の場合ってポインタの減算は、その型の
要素数の差が返ってきますよね。単純に数値が・・。
vector<string>に距離を収めるとはどいうことなんでしょうか?


170 名前:デフォルトの名無しさん :04/05/12 19:48
>>169
単純に数値と考えれば良い
「差」を表す名前を与えただけ。

171 名前:169 :04/05/12 20:19
レスどうもです。
ちょっとわからんのですが、数値だとしてなぜにvector<string>型を
指定するのでしょうか?そこの意味がわからんのです。
実際にイテレータ同士の減算を行った結果を格納するのが、上の例で
いうとvector<string>なんですよね?数値の型としては不適当な
気がするんですが・・・。

172 名前:デフォルトの名無しさん :04/05/12 20:32
>>171
vector<string>じゃなくてvector<string>::difference_typeだよ?

173 名前:169 :04/05/12 20:56
あ、そうか・・・じゃvector<string>って何なんでしょうか。
たとえば他の型を指定することも可能ですか?上の例で。
またそれによって変化がでてくるのでしょうか・・・。

174 名前:デフォルトの名無しさん :04/05/12 21:06
differnce_typeがptrdiff_t以外なのってみたことない

175 名前:169 :04/05/12 21:08
ちなみに私があげた例はC++ Primerにあったコードを簡略化したものです。


176 名前:176 :04/05/12 23:25
スマソ、誤爆った。

177 名前:デフォルトの名無しさん :04/05/12 23:38
>175
vector<string>::iterator って書き方したことない?
vector<string> のイテレータの型が vector<string>::iterator。
で、この vector<string>::iterator の差の型が vector<string>::difference_type になる。

istream_iterator に対してテンプレート引数 Distance を指定するということは、その istream_iterator
の差が Distance 型になるということだ。
istream_iterator は Input iterator なので実質 distance() が返す型が Distance 型になるってことだな。
ほとんど意味がない。
なのでわざわざ Distance を指定せずデフォルトにまかせるのが普通。

なお、istream_iterator の宣言は↓の通りなのでそのコード間違ってるよ?
template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
class istream_iterator:

178 名前:デフォルトの名無しさん :04/05/13 00:03
つまり「double checked locking パターンは使えない」というのはJavaの話で、C++では問題ないのですね?

179 名前:デフォルトの名無しさん :04/05/13 00:18
>>178
「そうだ」と言えば信じるのか?

180 名前:デフォルトの名無しさん :04/05/13 01:55
でも結局どうすればいいんだろ?
シングルdインスタンスを取得するたびにロックするしかない?

181 名前:デフォルトの名無しさん :04/05/13 02:22
マルチスレッドで最初に要求があったときに作成するというスタイルを止めろ
ってのは?

182 名前:デフォルトの名無しさん :04/05/13 02:34
std::stringからintに変換するにはどうしたらいいんでしょうか?
stringには数字しか入ってないのは分かっています。

183 名前:デフォルトの名無しさん :04/05/13 02:36
一番楽なのは恐らくboost::lexical_cast

184 名前:デフォルトの名無しさん :04/05/13 02:38
std::string::c_str()の後にatoi()とか
std::istringstream使うとか

185 名前:デフォルトの名無しさん :04/05/13 02:52
>>183
どうも。boost入れてたんで使います。
>>184
サンクス。勉強になりました。

186 名前:デフォルトの名無しさん :04/05/13 09:45
新しいアドレスに移動したらしい。
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/

187 名前:デフォルトの名無しさん :04/05/13 12:11
vectorの要素へのアクセスって何がいいんでしょう?
std::vector< double > tmp(10);
tmp[1]、std::vector< double >::iterator、tmp.at(1)等などありますけど。

それから、sizeが必要な場合関数への受け渡しは何がいいですか?
void func( std::vector< double >& d ){ size_t size(d.size());...}
void func( std::vector< double >::iterator begin, std::vector< double >::iterator end )
void func( double *tmp, size_t size )
幾らでも方法がありますけど。

188 名前:デフォルトの名無しさん :04/05/13 12:30
>>187
目的による。

189 名前:デフォルトの名無しさん :04/05/13 13:06
シングルトンにせよ何にせよ排他制御できる方法があるなら
boostがAPIを使ったりはしないと思うのだが。

190 名前:デフォルトの名無しさん :04/05/13 13:23
は?

191 名前:デフォルトの名無しさん :04/05/13 14:14
>>187
tmp.at(1)は範囲エラーの時に例外が飛ぶが、
tmp[1]は例外が飛ばない。(たぶん

template <typename RIt> void func(RIt top,RIt last);
はいかが?格納方法がvectorであることも強要しないし、
double *tmpの用にメモリ上に連続であることも強要しない。
RandamAccessIteratorである事のみ強要する。
ただ、funcの性質にもよると思う。実装ベタベタな関数なら楽なのに
すればいいし、汎用的にするなら上記方法もありだし。


192 名前:169 :04/05/13 20:19
>>177
詳細な説明ありがとうございました。
意味ナッシングですか・・・。
どうもPrimerの著者は、執筆してる段階ではまだ古いC++コンパイラ
使ってたようで、その辺の名残がサンプルコードにあるみたいです。
素直にデフォルトでいけばいいですね。

193 名前:デフォルトの名無しさん :04/05/13 22:29
ttp://pc5.2ch.net/test/read.cgi/tech/1083050221/511

>506
>宿題なら構わないんじゃないか?

>「C++相談室 part30」は質問という単語をスレタイに含めるべきだと思った、そんな夜。

おいおい、頼むからこのスレに学校の宿題解いて厨はよこさんでくれ。

194 名前:デフォルトの名無しさん :04/05/13 23:51
c++でgetoptよりもカッコイイオプションの取得の仕方を教えてください

195 名前:デフォルトの名無しさん :04/05/13 23:58
>>194 boost::program_options

196 名前:デフォルトの名無しさん :04/05/14 00:05
本屋へ行き、趣味と雑誌のコーナーを探す

197 名前:デフォルトの名無しさん :04/05/14 00:08
VC++プログラマは知らないgetopt が一番だろ。


198 名前:デフォルトの名無しさん :04/05/14 00:14
みなさんありがとうございます
vcでも使いたいのですがboostは使わせてもらえないので
素直にboostのソースをコピペしてつかう事にします

199 名前:デフォルトの名無しさん :04/05/14 00:21
"placement new"で日本語のページをグーグルしたら

> class X {
> public:
> static void *operator new( size_t size, void *buf ) { return buf; }
> };
と、しなければ placement new はコンパイルエラーになるって書いて
あります。が、下のソースで何の問題もおきません。std::vectorの動作を
考えてみてもoperator newの定義はなくてもいいと思うんですが、どうなんですか?

#include <iostream>
struct S {
S() { value = 555; }
int value;
};
int main()
{
char buf[sizeof(S)] = { 0 };
S* s = new (buf) S;
std::cout << s->value << std::endl;
return 0;
}


200 名前:デフォルトの名無しさん :04/05/14 00:22
>>198
boost使わせてもらえない = 使用禁止??
boostのソースコピペ = 使用してるじゃん。
馬鹿?

201 名前:デフォルトの名無しさん :04/05/14 00:29
>>200
俺も一緒のこと思った。

202 名前:デフォルトの名無しさん :04/05/14 00:31
boostってすぐに部分引用できるほどシンプルな作りじゃないと思うのだが。
どうよ、お前ら。

203 名前:デフォルトの名無しさん :04/05/14 00:36
getopt コピーするほうが簡単だよ。

204 名前:デフォルトの名無しさん :04/05/14 00:40
>>200
開発環境に明示的に組み込めないってことだろ
外部ライブラリを使っちゃいけないとか規約があって

自作の振りしてこっそりコピペするんだろ。すぐバレそうだけど

205 名前:デフォルトの名無しさん :04/05/14 01:04
boostをコピペねぇ・・

206 名前:デフォルトの名無しさん :04/05/14 01:16
商用開発でboostのようなライブラリを使えない理由って例えばどんなのがあるんでしょうか?
boostの場合コンパイラを選ぶって理由はあるとは思いますが
商用利用においてライセンス周りでうるさいライブラリではないと思うのですが・・・
boost使ったコードを理解できない(ドキュメント読んで理解する時間が惜しい)という理由でしょうか?
厨な質問で申し訳ないです。

207 名前:デフォルトの名無しさん :04/05/14 01:17
ある意味、これがクラスライブラリの痛いところだよな。
部分コピペしにくいのは明らかにグローバル関数じゃなくてクラス関数。

208 名前:デフォルトの名無しさん :04/05/14 01:21
boost使ったコードを理解できないっている?
そんなやついっしょに仕事したくない

209 名前:デフォルトの名無しさん :04/05/14 01:25
俺はspiritわからんよ

210 名前:デフォルトの名無しさん :04/05/14 01:25
>>208
・・・と同時にmplあたりをすらすら理解できてすらすら書くようなやつとも
一緒に仕事したくないわけだがw

211 名前:デフォルトの名無しさん :04/05/14 01:28
やっぱ、2chってレベル低すぎw

212 名前:デフォルトの名無しさん :04/05/14 02:23
特に「w」を使う奴は底辺に位置する

213 名前:デフォルトの名無しさん :04/05/14 02:28
struct A
{
char a;
char b;
char c;
char d;
};

A proc(void)
{
return NULL;
}

↑このプログラムがコンパイルできないんですけど
コンパイルが通るようにキャストする方法ありませんか?

214 名前:デフォルトの名無しさん :04/05/14 02:40
>>213
C?C++?

215 名前:デフォルトの名無しさん :04/05/14 02:41
なんでAにNULL返そうとしてんだ?
A*ならまだしも。

216 名前:デフォルトの名無しさん :04/05/14 02:46
>>214
C++です。
>>215
A proc(void)
{
A r;
r.a = 0;
r.b = 0;
r.c = 0;
r.d = 0;
return r;
}
でもいいんですけどちょっと高速にしたくて。

217 名前:デフォルトの名無しさん :04/05/14 02:54
>>216
戻り値最適化を期待するならコンストラクタを作っておいて、

return A(0, 0, 0, 0); でいいのでは。

218 名前:デフォルトの名無しさん :04/05/14 02:55
単に初期化したいだけ?

219 名前:デフォルトの名無しさん :04/05/14 02:56
>>217
0なら
A r=A();
で十分。

220 名前:デフォルトの名無しさん :04/05/14 03:19
>>219
駄目。

221 名前:デフォルトの名無しさん :04/05/14 03:24
>>219
実際にコンパイルして試してみた?
それではデフォルトコンストラクタが呼ばれるだけで初期化は
されない。

struct A
{
char a;
char b;
char c;
char d;
A() : a(0), b(0), c(0), d(0) {}
};

とか。もっとスマートな方法があると思うのだが・・・・・

222 名前:デフォルトの名無しさん :04/05/14 03:25
あ、正確にいうと、デフォルトコンストラクタが呼ばれてAの一時
オブジェクトが作られ、それでもって r を初期化する、ですね。
で、一時オブジェクトはメンバが初期化されてないから各メンバ
にどんな値が入ってるかわかったもんじゃない、と。

223 名前:デフォルトの名無しさん :04/05/14 03:39
A r;
r.c=10;
r=A();
return r.c;

の場合「0」になったけど?
VC.Net2003
Releseで。

224 名前:デフォルトの名無しさん :04/05/14 03:42
>>223
108 16 64 0
になった。各メンバ。BCC5.6.4だけど。

225 名前:デフォルトの名無しさん :04/05/14 03:48
まっとうなOSならプロセスがOSから確保したメモリは0で初期化される。
これはセキュリティ上の問題。
しかし、スタックにせよヒープにせよ、OSが確保して以降全く使用されていないという
保証がなければ当然期待値は「不定」だ。

226 名前:デフォルトの名無しさん :04/05/14 03:55
>>225
それが、VC7.1のコードではDebugでもReleaseでもXOR EAX,EAX
というコードに展開されててゼロクリアしているんだよね。rを。
gcc3.4.0(MinGW)でも同様だった。BCCだけ違う。

227 名前:デフォルトの名無しさん :04/05/14 04:11
どっちが仕様上正しいのかは知らないが
VC,GCCなら問題ないと。
まあ、仕様に定義されてないんだろうけど。

228 名前:デフォルトの名無しさん :04/05/14 04:21
>>227
もっと大きなクラスか構造体で試してみたいね。
俺の考えではA()はAのデフォルトコンストラクタを呼び出して
(何もしないですぐリターンする)、一時オブジェクトを作るだけで、
0クリアするなんて掟は規格書にはなかったような記憶が。

229 名前:デフォルトの名無しさん :04/05/14 04:39
規格書12.6.2.4 (暗黙のコンストラクタの規定は12.1.7)
言語規格上は不定値であることが定義されている.
(勝手に0クリアするのは規格違反じゃないだけで保証はされない)
というか素直に221で良いと思うんですが・・・

230 名前:デフォルトの名無しさん :04/05/14 05:33
struct T {
T() {}
T(const T&) {}
~T() {}
private:
const T& operator=(const T&);//禁止したい
};
--------------
T t1, t2;

t1.~T()
new (&t1) T(t2);

これって実行時間をのぞけば
t1 = t2
を実行できたのと同じことだよね?
(operator=がごく普通にコピーをあらわすとして。)

231 名前:デフォルトの名無しさん :04/05/14 06:47
>>230
違う。

T t1, t2;

T(t2)のコンストラクタで例外が発生した場合、
後者ならt1は有効だけど、前者ではそうではない。

232 名前:デフォルトの名無しさん :04/05/14 06:56
というかコピー禁止したい場合は
ふつう両方を private において実装なしにするだろ。

ついでに operator= の戻り値は非 const な。実際に使うことは稀だと思うが。

233 名前:デフォルトの名無しさん :04/05/14 07:11
>>232
生成時以外には値をかえられたくない、と思ってこうすることも
ひょっとしたらあるかと思って。

234 名前:デフォルトの名無しさん :04/05/14 10:15
>>229
12.6.2は"Initializing bases and members"なので、そこで「初期化されない」と定義されているのは、
メンバ(または基底クラス)のうち、初期化リストに現れず、且つPOD型である場合。

8.5 -7- により初期化子が空の括弧 () の場合、「デフォルト初期化」されると決まっている。
そして 8.5 -5- により、POD型の「デフォルト初期化」は「ゼロ初期化」であるとされている。

つまりVCとGCCは準拠しているが、BCCは違反。

235 名前:デフォルトの名無しさん :04/05/14 11:00
>>191 レスありがとです。
template <typename RIt> void func(RIt top,RIt last);
を使ってみます。

236 名前:デフォルトの名無しさん :04/05/14 11:16
>>234
一連の話、VCは .NET2003 からね。2002までは初期化してくれない。

237 名前:デフォルトの名無しさん :04/05/14 12:21
>>234
暗黙のデフォルトコンストラクタがメンバに対して空の括弧の初期化子を
適用することは明示されているのでしょうか?

12.1.7 (ISO/IEC 14882/2003)
The implicitly-defined default constructor performs the set of initializations of the
class that would be performed by a user-written default constructor for that class
with an empty mem-initializer-list (12.6.2) and an empty function body.

これの"empty mem-initializer-list"の解釈の問題だと思うのですが,
私は,mem-initializer-listが全く指定されていないコンストラクタと理解したのですが・・・
(よって初期化子リストに現れず,12.6.2.4により初期化は保証されない,という主張です.)

238 名前:デフォルトの名無しさん :04/05/14 15:37
旧式のヘッダファイル名と
標準C++のヘッダファイル名(拡張子無し)
をソースファイルに両方記述できますか?例えば
#include <windows.h>
#include <string> のように

239 名前:デフォルトの名無しさん :04/05/14 15:48
>>238
なんでできないと思うの?

240 名前:デフォルトの名無しさん :04/05/14 15:52
コンパイルが通らなかったんです。

241 名前:デフォルトの名無しさん :04/05/14 15:53
>>239
なんとなく、統一した方が無難かなと思いました

242 名前:デフォルトの名無しさん :04/05/14 17:40
>>234>>237

struct B
{
int m[1000];
};

int main()
{
B b = B();

std::cout << b.m[0] << std::endl;
}

結果
2621440

何回試してもダメだ。BCCは糞。

243 名前:デフォルトの名無しさん :04/05/14 19:45
c++でフォルダを作成したいんですが、どうしたらいいんでしょうか?


244 名前:デフォルトの名無しさん :04/05/14 20:05
>>243
標準の機能には無い。

245 名前:デフォルトの名無しさん :04/05/14 20:14
>>243
boost::filesystem をドゾー
http://boost.cppll.jp/HEAD/libs/filesystem/doc/operations.htm

ただ、特にパス操作で、ShiftJISのダメ文字に対応してるかどうか確認してない。
どなたかご存知ですか〜?

246 名前:デフォルトの名無しさん :04/05/14 20:27
boostはプロジェクトの命名規則に違反してるから使えんな

247 名前:デフォルトの名無しさん :04/05/14 20:27
>>244
>>245
ありがとうです。
ダメ文字って言うのは\/*とかですか?


248 名前:デフォルトの名無しさん :04/05/14 20:37
「も」とか「表」かな

249 名前:デフォルトの名無しさん :04/05/14 20:42
>>248
なるほど。良く分からないんで自分で調べてみます。ありがとうです。

250 名前:デフォルトの名無しさん :04/05/14 23:25
>237
>暗黙のデフォルトコンストラクタがメンバに対して空の括弧の初期化子を
>適用することは明示されているのでしょうか?
そうではなくて、>234 は POD 型 (ここでは struct A) の () による初期化
自体が zero-initialize になる(からデフォルトコンストラクタは呼ばれない)ので、
0 に初期化されるという主張だと思う。

なお、14882:2003 だと zero-initialize じゃなくて value-initialize となってる。
この例では、結局 zero-initialize と同じ結果になると思われ。



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