5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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 と同じ結果になると思われ。


251 :デフォルトの名無しさん:04/05/14 23:31
未定義と0は違う(スレの流れ読めてないかも)

252 :デフォルトの名無しさん:04/05/14 23:51
>>251
値が不定ってのなら分かるが、未定義となると、デフォルトコンストラクタ
を呼んだ途端にコンピュータがフォーマットされても文句言えんぞ。

253 :デフォルトの名無しさん:04/05/14 23:54
>>252
コンピュータがフォーマットされるってのが
よくわからんがFORTRANみたいになるのか?
それとも紫外線あてるとか・・・

254 :デフォルトの名無しさん:04/05/15 00:13
お前らはこいつらと同じブタ
http://freett.com/esqkft/040507ms/010.jpg

255 :デフォルトの名無しさん:04/05/15 00:33
>>254
かわいい!オシッコ飲みたい!!(;´Д`)ハァハァハァハァ

256 :デフォルトの名無しさん:04/05/15 04:08
腋でもお舐め!
http://freett.com/esqkft/040507ms/161.jpg

257 :デフォルトの名無しさん:04/05/15 08:11
stlって標準で使えるものなんですか?

258 :デフォルトの名無しさん:04/05/15 10:15
まぁ、STLのSはスタンダードのSだし・・・

259 :デフォルトの名無しさん:04/05/15 11:44
>>257
・・・
現在はSTLは標準C++の中のテンプレートライブラリ部分の名前。

260 :デフォルトの名無しさん:04/05/15 12:53
STLはStamp Trader List

261 :デフォルトの名無しさん:04/05/15 13:44
三角形の面積を求めるc++プログラム希望。
大学の課題なんで詳しい人助けてー。

262 :デフォルトの名無しさん:04/05/15 13:52
三角形の面積って 底辺かける高さわる2 ぢゃないのか?

263 :デフォルトの名無しさん:04/05/15 14:03
しかもC++って・・・
Classで三角形だけじゃなくいろいろな面積に繋げるため
inheritanceしろってか?

264 :デフォルトの名無しさん:04/05/15 14:07
>>261
C/C++の宿題をやらせて、お兄ちゃん 22代目
http://pc5.2ch.net/test/read.cgi/tech/1083050221/


265 :デフォルトの名無しさん:04/05/15 14:12
>>263
伝統的な章立てで進行する授業なら
データと型あたりか? そこだと、まだclassが登場してないよな

266 :デフォルトの名無しさん:04/05/15 14:19
これが授業中だったら笑えるな。

267 :デフォルトの名無しさん:04/05/15 14:45
cinとcoutを使うだけで後はCと同じでもよいとか?

268 :デフォルトの名無しさん:04/05/15 14:52
vc++を使ってるんですが、グローバル変数を定義すると
「既に定義されています」
というリンクエラーが出ます。
どこで定義すればいいんでしょうか?
今はsfdafxという全てのファイルから参照されるヘッダに宣言しています。

269 :デフォルトの名無しさん:04/05/15 14:55
>>268
定義はヘッダではなくコード側に

270 :デフォルトの名無しさん:04/05/15 14:55
stdafxが多重インクルードされるから。
VCの場合は
#pragma once

一般的には
#ifndef __STDAFX__
#define __STDAFX__
中身
#endif

とする。
__・・・ __
をヘッダーごとに変える。


271 :デフォルトの名無しさん:04/05/15 14:57
>>270
> stdafxが多重インクルードされるから。
ちがうよ。

272 :デフォルトの名無しさん:04/05/15 15:00
>>271
いろんなところから呼び出されるんだから多重インクルードだろ。
別にインクルードがループしてるって意味で言ったんじゃないぞ?

273 :デフォルトの名無しさん:04/05/15 15:01
>>272
> というリンクエラーが出ます

274 :デフォルトの名無しさん:04/05/15 15:05
みなさんありがとうございます。
>>270の方法でやりましたが、同様のエラーが出ました。
#pragma onceを消して#ifdefを書くんですよね?

>>269
複数のクラスから参照される変数なんですが、
使用するすべてのコードで書くんでしょうか?

275 :デフォルトの名無しさん:04/05/15 15:07
>>274
ヘッダには定義ではなく宣言を書く。
extern int a; // 宣言
int a; // 定義

276 :デフォルトの名無しさん:04/05/15 15:15
>>274
エラー内容(表示される物)書いてくれるのが一番助かるんだが。

277 :デフォルトの名無しさん:04/05/15 15:16
>>250
ようやく納得しました.確かに
A r = A();
の書き方は,8.5.7によりvalue-initializedになり,Aにユーザ定義のコンストラクタが
ないので,8.5.5によりvalue-initializeによってメンバ全てに対するvalue-initializeが保証されて,
結果PODメンバに対してzero-initializeが保証されるわけですね.
ありがとうございました.

278 :デフォルトの名無しさん:04/05/15 15:16
>>274はage荒らしだろ放置しろよ。

279 :デフォルトの名無しさん:04/05/15 15:18
>>274
ちなみに#ifdefじゃなくて#ifndef
つまり
__STDAFX__が定義されてなかったら
{
__STDAFX__を定義する
中身
}(#endif)
というので多重インクルードを防げる。
#pragmaはVCオンリーなのであんまり使わない方がいい。

280 :277:04/05/15 15:18
で,補足として

#include <iostream>

struct A{ char a, b, c, d; };

struct B{
B(){}
char a, b, c, d;
};

int main(int argc, char *argv[]){
A a = A();
std::cout << int(a.a) << std::endl;
std::cout << int(a.b) << std::endl;
std::cout << int(a.c) << std::endl;
std::cout << int(a.d) << std::endl;
B b = B();
std::cout << int(b.a) << std::endl;
std::cout << int(b.b) << std::endl;
std::cout << int(b.c) << std::endl;
std::cout << int(b.d) << std::endl;
return 0;
}

上のコードのようなしょうもない違いが生じるわけですねw.
(VC++7.1では違いは出ませんが,gcc3.2.2では違いが生じます)
Aが>>250に対応し,Bが>>237に対応すると.

281 :デフォルトの名無しさん:04/05/15 15:18
>>279
それ関係ないってば。

282 :デフォルトの名無しさん:04/05/15 15:19
>>279
stdafx自体VCオンリーな感じが(笑)

283 :デフォルトの名無しさん:04/05/15 15:19
>>282
違う

284 :デフォルトの名無しさん:04/05/15 15:21
>>279
つーかVC使ってるんなら
VCの拡張だって理解した上で
#pragma once使ったほうが効率的。

285 :デフォルトの名無しさん:04/05/15 15:21
>>277
はじめに
A r=A();
を持ち出したのは俺だがあってるみたいでよかった。
俺も他人がこの方法で初期化してるのみて「できるの?」
って思ってたから・・・

じゃあ、A()が0初期化保証されるならBCCは違反って事?

286 :デフォルトの名無しさん:04/05/15 15:22
>>279
#pragmaがVCオンリーってのはネタ?

287 :デフォルトの名無しさん:04/05/15 15:23
>>281
関係ないのはわかってるが
#ifndefじゃなくちゃいけないのに#ifdefって書いてあったから。

288 :274:04/05/15 15:23
質問はageで、と以前言われたもので。すいません。
エラー内容は、
error LNK2005: "int TARGET_DAY" (?TARGET_DAY@@3HA) は既に AnalysisManager.obj で定義されています。
というものです。
このほかにも同様のエラー、「グローバル変数XXは既にXXX.objで定義されています」と出ます。
コンソールアプリなんですが、このTARGET_DAYとかをコマンドライン引数から入力してもらって、
その値によって処理を変えようと思うので、グローバル変数にしたいんですが。

グローバル変数をコード内に書くとするなら、その変数を使用する全てのクラスのコード内に記述するんでしょうか?

289 :デフォルトの名無しさん:04/05/15 15:24
>>288
定義は一個だけにする。

290 :デフォルトの名無しさん:04/05/15 15:25
>>288
>>275は無視かよ。

291 :デフォルトの名無しさん:04/05/15 15:28
>>286
#pragma once
ってVCでしかみなかったからオンリーだと思ってたよ・・・
違うんだね。
でも、VC以外では使わない方がいいってのはあってるでしょ?

292 :274:04/05/15 15:28
>>290
あ。
すいません。

つまり宣言は複数用意すると。宣言は使用するクラスのヘッダ内全てで書いてもいいんですか?
それで定義をメインクラスのグローバルスコープの位置でするって感じですかね?

293 :277:04/05/15 15:29
>>285
280をgccで実行してもらえれば分かりますが,A()の書き方で
0初期化保証されるのはAにユーザ定義のコンストラクタを全く定義していないときに
限られますのでご注意を.
ユーザ定義のコンストラクタを定義していない場合の話なら,
当然BCCは違反ってことになりますね.

294 :デフォルトの名無しさん:04/05/15 15:29
>>291
>>279には#pragmaとしか書かれていない。

295 :デフォルトの名無しさん:04/05/15 15:31
>>292
ヘッダファイルは一個に見えてもincludeしたすべてのモジュールに
コンパイル時につなぎ合わされて解釈されるの。
宣言は使用するクラスのヘッダすべてがincludeする別のヘッダに一個かけばいい。
定義はメインクラスんとこでいいよ。
疲れた('A`)

296 :デフォルトの名無しさん:04/05/15 15:31
>>294
#pragma onceって書くのめんどくさかったから・・・

297 :274:04/05/15 15:37
>>295
あーなるほど!良くわかりました。ありがとうございます。
疲れさせてすいませんでした・・・。

298 :デフォルトの名無しさん:04/05/15 15:50
>>296
いや、それは分かるけど今回は全然意味変わってんじゃん。
JavaScriptをJavaと書くようなもんだよ。

299 :デフォルトの名無しさん:04/05/15 16:54
ガイセキ/2計算しろ。5分あれば誰でも書ける。

300 :デフォルトの名無しさん:04/05/15 16:56
#ifndef __Hoge_H__ なんてのをなんでいちいちプログラマが考えにゃならんねん。
#pragma onceにして、プログラマの手から離れたほうがいいに決まってる。
対応してない環境で開発しなきゃいけない状況に陥らない限り、俺は絶対#pragma once使うぞ。

301 :デフォルトの名無しさん:04/05/15 16:59
またインクルードガードに予約された名前だよ。
知らない奴に教えるときくらい気をつけて欲しいもんだな。

302 :デフォルトの名無しさん:04/05/15 18:22
include <iostream>
#include <mah.h>

#define vector00 1,2,3
#define vector01 4,5,6

namespace mytriangle{
class Vect3D{ double x, y, z;
public:
Vect3D(){}
Vect3D(double const&, double const &, double const&);
friend Vect3D OuterProducts (Vect3D const &,Vect3D const &);
inline double Abs3D(){ return sqrt(x * x + y * y + z * z); }
Vect3D &operator=(Vect3D &V){
x = V.x; y=V.y; z=V.z;
}
friend double Square(Vect3D const &, Vect3D const &);
};

Vect3D::Vect3D(double const & X, double const & Y , double const &Z)
:x(X),y(Y),z(Z){}
inlinedouble Det2(double const & a, double const &b,
double const &c, double const &d){ return a * d - b * c;}

inline Vect3D OuterProducts(Vect3D const &v1,Vect3D const &v2 ){ return Vect3D( Det2(v1.y, v1.z, v2.y, v2.z),-Det2(v1.x, v1.z, v2.x, v2.z),Det2(v1.x, v1.y, v2.x, v2.y));}

inline double Square(Vect3D const &v1, Vect3D const &v2 ){ return OuterProducts(v1, v2).Abs3D()/2.;}
}
int main(){
using namespace mytriangle; Vect3D u(vector00), v(vector01); std::cerr << Square(u,v) <<'\n';}

303 :デフォルトの名無しさん:04/05/15 18:28
ごめん inlinedouble -> inline double
あと、main のなかで最後に 1でも返しといて。

304 :デフォルトの名無しさん:04/05/15 18:28
>>300
VC.netにはマクロがついてる。
自動で#ifndef、#define、#endifしてくれる。
名前はファイル名で。

305 :デフォルトの名無しさん:04/05/15 23:44
今頃インクルードガードごときで言い争いですか。アホですね。

306 :デフォルトの名無しさん:04/05/15 23:46
>>305
どこが言い争いにみえたのやら・・・
誰と誰がどういう意見で争ってるのか、言ってみ(w

307 :デフォルトの名無しさん:04/05/16 00:03
305と306が言い争っているかどうかに付いて争っていると見た!。

308 :デフォルトの名無しさん:04/05/16 00:17
翻訳単位を意識させるC++はダサい

309 :デフォルトの名無しさん:04/05/16 00:58
>>308
使いこなせないのはもっとダサい。

310 :デフォルトの名無しさん:04/05/16 01:07
>>309
同意見

311 :デフォルトの名無しさん:04/05/16 01:09
いうまでもない事だが、100%使いこなしている上で批判しているわけだが。

312 :デフォルトの名無しさん:04/05/16 01:14
>>311
悪魔の証明だなw

313 :デフォルトの名無しさん:04/05/16 01:17
まあ>>308>>309は無関係な話だから

314 :デフォルトの名無しさん:04/05/16 01:41
必死だな (プププ

315 :デフォルトの名無しさん:04/05/16 02:43
答えてるヤシは、c++暦どれくらいなんだ?(;´Д`)
さすがに1年以下は居ないだろうな・・・・・・(゚Д゚;)

316 :デフォルトの名無しさん:04/05/16 03:00
>>315
コンパイル単位なんてC++に限らんが、C++始めたのはつい最近だな。10年くらいか。

317 :デフォルトの名無しさん:04/05/16 03:15
よくVC++7.1のANSI準拠度は高いと言われてるけど、
VC++7.1付属のSTLの出来はどう?(6.0ではいろいろ問題があったけど。)
あえてC++を使いこなしてる人のこのスレで意見を聞きたい。

318 :デフォルトの名無しさん:04/05/16 09:53
次のコードがコンパイルできないんですけど、どこが悪いんでしょうか?
コンパイラはMinGWのgcc 3.3.3です。

ソース>
#include <iostream>
using namespace std;

class Test
{
public:
template <class T>
Test& operator<<(const T& rhs)
{
cout << rhs;
return *this;
}
};


int main()
{
Test t;
t << 100 << std::endl;
return 0;
}

エラーメッセージ>
t120.cpp:19: error: no match for 'operator<<' in '(&t)->Test::operator<< [with T = int]((&100)) << std::endl'


319 :デフォルトの名無しさん:04/05/16 10:05
>>318
std::endlの定義を考えてみて。

320 :デフォルトの名無しさん:04/05/16 19:10
仮想メンバ関数を定義したクラスAを継承したクラスBと、さらにクラスBを継承したクラスCがあったとします。

struct A
{
  virtual  void Foo1(void) { std::cout << "A" << std::endl; }
  void  Foo2(void)  { Foo1(); }
};
struct B : public A
{
  void Foo1(void) { std::cout << "B" << std::endl; }
};
struct C : public B
{
  void Foo1(void) {
    std::cout << "C" << std::endl;
    B::Foo2(); }
};
int main( int argc, char *argv[] )
{
  struct C test;
  test.Foo1();
  return 0;
}

これを実行したときに、「CCCCCCCC・・・」と永遠に続いてしまいます。
test.Foo1()を実行ときに「CB」と表示されて終了して欲しいのですが、何か良い手段はないでしょうか?
(B::Foo2()を実行したときに B::Foo1() が呼び出されて欲しい。)
ちなみに、「B::Foo2()」を「B *cls = (B *)this; cls->Foo2();」にしても結果は同じでした。

321 :デフォルトの名無しさん:04/05/16 19:16
C::Foo1() のなかで呼んでいる B::Foo2() は B::Foo1() の間違いでは?

322 :デフォルトの名無しさん:04/05/16 19:17
>>320
キャストしても、Foo1へのポインタは
オブジェクト自身に C のvTblへのポインタが含まれてるので
C::Foo1が呼ばれる。

323 :321:04/05/16 19:17
あー、ごめん。Aのインタフェースを通すのか。

324 :デフォルトの名無しさん:04/05/16 19:18
>>320
struct Bに
void Foo2(void) { std::cout << "B" << std::endl; }
を追加する。

325 :デフォルトの名無しさん:04/05/16 20:07
>>320
> test.Foo1()を実行ときに「CB」と表示されて終了して欲しい

要求がそれだけなら、
void C::Foo1(void) { std::cout << "C" << std::endl; B::Foo1(); }
とか、
void C::Foo1(void) { std::cout << "CB" << std::endl; }
とか、
やりかたはいくらでもある。

326 :320:04/05/16 21:07
実はGTKでATLのようなテンプレートライブラリを勉強がてらに作っていたんですが、
イベントを親クラスにチェーンする機能(ATLのCHAIN_MSG_MAP())を作ろうとしたときに
親クラスのイベントマップをうまく呼び出せなかったんですよね。
(CEventImpl + CWidget -> CWindowImpl -> CBaseWindow -> CFrameWindowという継承を
 行った場合、CFrameWindowからCBaseWindowのイベントマップを呼びたかった)

でも、なんかCEventImplの実装が間違っているような気もするので別の方法を模索してみて諦めます。

327 :デフォルトの名無しさん:04/05/16 21:50
テンプレートで質問なんですが、
template<class Type, int i>
void func(){...]
みたいにテンプレートの引数のところにint iというような記述を
する必要があるときってどんなときですかね?
普通に関数の仮引数にしないのはどういう意図なんでしょうか。

328 :デフォルトの名無しさん:04/05/16 22:01
>>327
定数を最適化。

329 :デフォルトの名無しさん:04/05/16 22:03
>>327
静的な定数として使うとき。
たとえばその関数内で char a[i] とか、 std::bitset<i> とか。

330 :327:04/05/16 22:03
すいません、どうもわからんのですが、関数の仮引数に
constつけるのとは違うのでしょうか?
できれば例か何かあげてもらえないですかね。

331 :デフォルトの名無しさん:04/05/16 22:16
>>330
>>329

332 :327:04/05/16 23:01
あ、そういうことですか・・というか
const int size = 5;
char a[size];
はできますが、sizeが関数の仮引数だとだめなんですね・・・なんでだろ。

333 :デフォルトの名無しさん:04/05/16 23:22
コンパイル時定数

334 :デフォルトの名無しさん:04/05/16 23:44
>>322
たいていの処理系だと、自動変数はスタックにとる。

size がコンパイル時定数なら自動変数のアドレスはすべて
スタックフレームポインタの相対アドレスとして求まるが、
size が可変だと自動変数のアドレスを実行時に全部計算する
必要があって、効率悪くなる。

まぁ gcc みたいに独自拡張で size が可変でも OK っつー
処理系もあるし、alloca() 使えばスタック上に可変サイズ
のデータ領域とれるが、C++ 的には

1) コンパイル時に確定できるならテンプレート引数で
2) 実行時に決まるなら std::vector

というのが推奨。

335 :デフォルトの名無しさん:04/05/17 00:08
定数とかの定義って #define 使ってますか?
何か、名前空間を汚してイヤンな感じがするんですけど、
どうするのがスマートなんですかねぇ?

現在は、

namespace IJIRUNA {
    const int hoge = 123;
    const char * const p = "ふがふが";
};

とかやってるんですが、何かマズいことはありますか?
ほとんどの場合、即値に展開されると思うのですが。。。

336 :デフォルトの名無しさん:04/05/17 00:10
クラスのメンバじゃダメなの?

337 :リンカ-ン:04/05/17 00:13
enum fuck

338 :デフォルトの名無しさん:04/05/17 00:14
>>337
欠陥コンパイラ用のテクニックですね

339 :デフォルトの名無しさん:04/05/17 14:19
欠陥コンパイラとはVisual Studio のことか?

340 :デフォルトの名無しさん:04/05/17 15:23
>>339
.net 2003では大丈夫だった。

341 :デフォルトの名無しさん:04/05/17 16:23
>>335
ヘッダでポインタを初期化すると、
インクルードするソースごとに文字列リソースが作成されるのでは?
>>335の場合、"ふがふが"がソースの数だけ実行バイナリに埋め込まれてしまうはず。
VCなどの最適化処理では対処しきれないと思う。
ソースで宣言している分には問題なし。

342 :341:04/05/17 16:25
補足:
あるソースでポインタpを使ってなければ、そのソースの分に関しては
"ふがふが"文字列リソースは埋め込まれない。

343 :デフォルトの名無しさん:04/05/17 17:29
>>341
もっと調べてから書こうね。

344 :デフォルトの名無しさん:04/05/17 17:44
いつぞやのバカか?

345 :335:04/05/17 21:17
レスどうも。どうやら、ケース・バイ・ケースで一概に言えないようですな。

>>336
なんか、ちと大げさな気が。。。
static const なメンバならいいんですかねぇ?

>>337
enumって定数だけだったやうな(ry

>>341
ヘッダには、もちろんexternつけますよ。即値で埋め込んでくれたほうが
速度的に良さそうな気がしますが、あまりにも長い文字列は、ファイルから読み込むか
プールしとかないとだめでしょうね。

346 :デフォルトの名無しさん:04/05/17 21:58
真っ当なコンパイラなら文字列リテラルは使い回すのがディフォルトで、
使い回さないオプションがついていると思うのだが。

347 :デフォルトの名無しさん:04/05/17 22:04
>>346
真っ当なって時点からただの戯れ言に成り下がったな

348 :261:04/05/17 22:37
授業中ではなかったですw
↓のエラー(ミス)がわからないのですが、詳しい人助けてくださいm(__)m


#include <iostream,h>
#include <math,h>
void main(void){
doble hen-a,hen-b,hen-c,;
doble t,menseki

cin>> a >> b >> c ;
if(a+b>c & b+c>a & c+a>b){
t=(a+b+c)/2
s=sqrt((t-a)(t-b)(t-c));
}
cout>>menseki;

あと、マイクロソフトビジュアルc++はどのように入手できるのですか?
手助けお願いします。



349 :デフォルトの名無しさん:04/05/17 22:41
>>348
.h> -> >
void main -> int main
doble -> double
& -> &&
)( -> ) * (

店で買う

350 :デフォルトの名無しさん:04/05/17 22:43
>>348
Visual Studio C++ .net でも大体同じことできるよ。

351 :261:04/05/17 22:48
>>349>>350さん、ありがとうございます!
>Visual Studio C++ .net はどのように手に入れるんですか?
質問おおくてすみません。

352 :デフォルトの名無しさん:04/05/17 23:07
>>346
使いまわしが可能なのは、あくまでもソース単位(中間ファイル単位)だと思われ。

353 :デフォルトの名無しさん:04/05/17 23:08
>>351
店で買う

354 :デフォルトの名無しさん:04/05/17 23:11
>>352
いや、VCのオプションだと文字列は一カ所に追いやられる。
それを参照する。

355 :デフォルトの名無しさん:04/05/17 23:12
>>351
学生ならアカデミック版がやすくていい。

356 :デフォルトの名無しさん:04/05/17 23:22
>>348
ttp://www.amazon.co.jp/exec/obidos/ASIN/B00009PJOD/ref=sr_aps_sw_6/250-9112563-1390659

357 :261:04/05/18 00:21
いろいろとありがとうございます

358 :デフォルトの名無しさん:04/05/18 01:07
>>352
文字列等のコンストラクタを伴わない定数は、
どのように最適化するかはコンパイラベンダの実装に任されている。
一つになるか複数になってしまうかはツール依存だったと思う。

const定数使った方がデバックが楽なので、個人的にはconst定数の利用を御勧めする。

359 :デフォルトの名無しさん:04/05/18 01:17
要はバグを出さなければいいわけか。

360 :デフォルトの名無しさん:04/05/18 01:30
>>351
winnyで出回ってるよ
買うやつはアフォ

361 :デフォルトの名無しさん:04/05/18 01:31
亀レスになりますが

>319
なんとかなりました。

ostreamファイルでのendlの定義が

namespace std

{

(略)
template<typename _CharT, typename _Traits>
basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os)
{ return flush(__os.put(__os.widen('\n'))); }
(略)
}

となっているので、ようするに _CharT と _Traits の型が決められなかったのが原因でした。

362 :デフォルトの名無しさん:04/05/18 01:36
int hogehoge::hoge(foo* &bar)
{
 // どうのこうの
}
ってメンバのfoo* &bar
ってなんですか?

363 :デフォルトの名無しさん:04/05/18 01:48
>>362
メンバじゃないし。

364 :デフォルトの名無しさん:04/05/18 01:54
日本語は苦手なのねw

365 :デフォルトの名無しさん:04/05/18 02:07
C++用のindentのようなツールはないでしょうか。
きちゃないソースをメンテすることになって泣きそうです。
OSはSolaris、linuxです。

366 :デフォルトの名無しさん:04/05/18 02:09
astyleでも応援しる。

367 :デフォルトの名無しさん:04/05/18 02:13
>>365
emacs の自動整形じゃだめなの?

368 :デフォルトの名無しさん:04/05/18 02:55
>>367
emacsは入っていません

369 :デフォルトの名無しさん:04/05/18 03:05
pthreadをクラスのメンバ関数から生成した場合、スコープはどこまでに
なるんでしょうか?そのクラスのメンバ関数をpthreadで生成したスレッド
関数で加工できますか?それともポインタで渡してしまえば、何でも
Cのように書き換えられちゃったりしますか?


370 :デフォルトの名無しさん:04/05/18 07:23
>>369
>pthreadをクラスのメンバ関数から生成した場合、スコープはどこまでになるんでしょうか?
pthreadは何を入れる変数or関数なのか?

>そのクラスのメンバ関数をpthreadで生成したスレッド関数で加工できますか?
メンバ変数の誤り?加工じゃなくて呼び出し?
どっちにしてもそのスレッド関数とやらがfriendなら自由じゃない?

>それともポインタで渡してしまえば、何でもCのように書き換えられちゃったりしますか?

371 :デフォルトの名無しさん:04/05/18 09:31
>>368
入れればいいじゃん。
どっちにしろなんかツールを新規導入しようとしてるんでしょ。

372 :デフォルトの名無しさん:04/05/18 11:59
std::string の find() は、
一般的に高速と言われているBM法などに比べて
パフォーマンスはどのようなもんなんでしょう?

高速を目指すなら独自実装が必要なんでしょうか?

373 :デフォルトの名無しさん:04/05/18 12:02
STLは実装が違うから自分でソースみれば?

374 :デフォルトの名無しさん:04/05/18 13:48
短い文字列なら単純に検索する方が早いことも多々あるが。

375 :デフォルトの名無しさん:04/05/18 14:46
女子供じゃあるまいしstd/stlになんて頼るなよ。
自作の超チューニングされたコードにかなうものなし。

376 :デフォルトの名無しさん:04/05/18 14:52
>>375
俺も結構自作派。String,Vector、スタックあたりは自作。

377 :デフォルトの名無しさん:04/05/18 14:53
>>375

                        |
                        |  
      ∩___∩              |
      | ノ  _,  ,_ ヽ        ((   |
     /  ●   ● |         (=)
     |    ( _●_)  ミ _ (⌒)   J  ))
    彡、   |∪|  ノ  
⊂⌒ヽ /    ヽノ  ヽ /⌒つ
  \ ヽ  /        ヽ /
   \_,,ノ      |、_ノ

378 :デフォルトの名無しさん:04/05/18 17:01
char chbuff[] = "ORIENT ENTER DENTOO";
この文字列の中にあるENTという文字が幾つあるか検索したいんだけど、
どうすれば良いんでしょうか。
strchrを使って上手く数えられないのかな?
ポインタを動かして読み飛ばしとかってのも考えたんだけど、
上手くいかないっぽ。
何か良い手を教えてもらえませんか?


379 :デフォルトの名無しさん:04/05/18 17:04
人様が書いたライブラリっていうのは、あくまでも書いた人にとって都合のよいライブラリ。
とりあえず使ってみるのはいいけど、高速化/コードサイズ/使いやすさとか追求すると結局最後
は自分で作ることになるよ。もちろん公開されてるライブラリソースは参考にするとしても。

380 :デフォルトの名無しさん:04/05/18 17:09
C++っていうのは、あくまでもBjarne Stroustrupにとって都合のよい言語。
とりあえず使ってみるのはいいけど、高速化/コードサイズ/使いやすさとか追求すると結局最後
は自分で作ることになるよ。

381 :デフォルトの名無しさん:04/05/18 17:14
>>378
strstr() でぐるぐるすれば簡単にできるっしょ。
C++ らしくはないけども。


382 :デフォルトの名無しさん:04/05/18 17:14
>>380
禿同。最近はライブラリだけじゃ物足りなくて
コンパイラにも手を入れ始めるようになったよ。
先週はデフォルト最上位クラスobject、
例外の最上位クラスexceptionを追加して
すべてのインスタンスを統一的に
扱えるようになってもうウハウハ。

383 :ラッキーシリ( ´∀`):04/05/18 17:15
☆★☆★★☆ラッキーシリ☆★★☆★☆

     ⊂⊃    .☆.。.:*・゚
     ∧_∧. /
    ( ´∀`)/ このシリに出会ったあなたは超桃尻。
    /,    つ  近々便秘が舞い込んでくることでしょう。
   (_(_, )
     しし'

☆★☆★★☆ラッキーシリ☆★★☆★☆

384 :デフォルトの名無しさん:04/05/18 17:26
>>381
ありがとうございました。
そんな関数頭になかった><
ガッツり出てきそうです。thx

385 :デフォルトの名無しさん:04/05/18 22:53
>>384
大丈夫、キャリア10年以上、年齢40以上の博士号持ってる自称SEでさえ知らなかったから。

386 :デフォルトの名無しさん:04/05/19 01:28
int i = 1;
をstd::string str;に
入れたい。
str = "1";
をiをつかってやるとどうなる?

387 :デフォルトの名無しさん:04/05/19 01:31
>>386
アスキーコード使えばいい。

388 :デフォルトの名無しさん:04/05/19 01:33
iが
[1-9]\d*
だったらどうするんだよ

389 :デフォルトの名無しさん:04/05/19 01:37
>>386 boost::lexical__cast

390 :デフォルトの名無しさん:04/05/19 01:39
あんな駄作ライブラリ入れなくない

391 :デフォルトの名無しさん:04/05/19 01:40
すまそん
388さんのエクスプレッションの意味って
なんでつか?

392 :デフォルトの名無しさん:04/05/19 01:43
入れなくなくなくなくなくなーい

393 :デフォルトの名無しさん:04/05/19 01:43
と、失敗作が申しております。

394 :デフォルトの名無しさん:04/05/19 01:47
>>386
format
つかえばいいじゃん

395 :デフォルトの名無しさん:04/05/19 01:56
このスレ的には標準ライブラリで

396 :デフォルトの名無しさん:04/05/19 01:56
s/入れなくない/入れなくもない/

397 :デフォルトの名無しさん:04/05/19 01:57
>>386 std::ostringstream

398 :デフォルトの名無しさん:04/05/19 02:22
C++は面倒だね
perlなら
sprintf("%d",$i);
でいいんだけど・・・

399 :デフォルトの名無しさん:04/05/19 02:31
>>398はCもC++も知らない人ですか

400 :デフォルトの名無しさん:04/05/19 02:48
定期的に沸いてくるね、自作厨が。

401 :デフォルトの名無しさん:04/05/19 05:22
>>398
じゃあ、perlで日本語つかるってとこみせてみろよ

402 :デフォルトの名無しさん:04/05/19 05:42
>>401
スレ違いな展開は勘弁

403 :デフォルトの名無しさん:04/05/19 08:09
classAでclassBを作った時にclassB内でclassAへのポインタを得るにはどうしたらいいですか?
classBからclassAのメンバ変数を操作したいんです

404 :デフォルトの名無しさん:04/05/19 08:24
#include <sstream>
#include <string>

std::ostringstream oss;
int i = 1;
oss << i;
std::string str = oss.str();


405 :デフォルトの名無しさん:04/05/19 08:37
>>403
class B
{
public: B(class A* ref);
};
class A
{
 B b_;
 void func() { b_ = new B(this); }
};

406 :デフォルトの名無しさん:04/05/19 08:45
メンバ変数をいじりたいならfriendなりも必要な気がするが。

407 :デフォルトの名無しさん:04/05/19 08:48
なにくだらねーこといってやがる

408 :デフォルトの名無しさん:04/05/19 11:16
>>405
Thanx
けど、面倒なのね

409 :デフォルトの名無しさん:04/05/19 11:41
オブジェクトを下の様な方法で解放する場合、何か問題が起こる場合はあるでしょうか?
(実際にはユーザー定義のデストラクタがあります)
抽象クラスAから派生した複数の型のクラスを格納して一括して解放したいのですが‥‥

class A
{
 public: virtual void Delete() = 0;
};

class B : public A
{
 public: virtual void Delete() { delete this; }
};

main()
{
 B *b = new B;
 A *a = b;
 a->Delete();
}


410 :デフォルトの名無しさん:04/05/19 11:53
>>409
仮想デストラクタをAに定義してれば普通にAのポインタでdeleteすれば
派生もokだが

411 :デフォルトの名無しさん:04/05/19 11:53
>>409
デストラクタをvirtualに、ではいかんのか?

412 :409:04/05/19 13:35
>>410-411
そーいえばそんなものがあったなぁ‥‥
アリガトン

                      ミ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」   ノ∩
―――――――――――――‐┬┘ ⊂   ヽ
                        |    /( 。A。 )っ あらよっと
       ____.____    |    U ∨ ∨
     |        |        |   |




413 :デフォルトの名無しさん:04/05/19 15:39
とあるソースを見ていたら、
namespace A {
// ここに関数やクラスなどの宣言がずらずらと
}
using namespace A;
というヘッダファイルがありました。
名前空間の終わりの直後にusing namespaceをしては名前空間の意味がないと思うのですが、何か意味があるのでしょうか?

414 :デフォルトの名無しさん:04/05/19 15:52
>>413
たぶん、無名の名前空間ってのを知らない奴が書いたのでは?

415 :デフォルトの名無しさん:04/05/19 15:56
>>413
名前空間で囲っておけば名前が衝突しても簡単に回避できるからだろう。
using指令を使ったところで名前空間の意味がなくなるわけではない。

416 :413:04/05/19 16:14
>>415
そうなんですか。
知りませんでした。

ありがとうございました。

417 :デフォルトの名無しさん:04/05/19 16:30
>>415
だから、無名の名前空間を知らんのか?

418 :デフォルトの名無しさん:04/05/19 16:34
>>417
名前なし名前空間は普通ヘッダファイルでは使わないだろ。
翻訳単位ごとに別の名前が宣言されるからな。

419 :デフォルトの名無しさん:04/05/19 16:50
>>418
あ、ヘッダファイルか。そうだな、勘違いしてたよ。
じゃあ >>413の答えは、「意味なし」は言い過ぎにしても、「台無し」が正解じゃないのか?


420 :デフォルトの名無しさん:04/05/19 17:13
いや415でいいじゃん。何かしら意味があったわけだし、
413もそれを知ることができたわけだし。

421 :デフォルトの名無しさん:04/05/19 17:19
てきとーに作ってたら名前がかち合ったのでnamespaceでくくった。
しかしすでにコード書いた部分をnamespaceを明示するように修正するのは面倒。
なのでついでにusingした。

422 :デフォルトの名無しさん:04/05/19 17:21
そうですか

423 :デフォルトの名無しさん:04/05/19 17:23
↓ヘッダでusing namespace std するよ派とするなよ派の喧嘩

424 :デフォルトの名無しさん:04/05/19 17:25


│ ∧_∧ 
↓ ( ・ω・ )
■p⊂  と )
   (_(_ろ

425 :デフォルトの名無しさん:04/05/19 17:26
台無しっつうより能無しだな

426 :デフォルトの名無しさん:04/05/19 17:27
  ∧_∧ 
  ( ・ω・ )
■b⊂  と )
|  (_(_ろ





427 :デフォルトの名無しさん:04/05/19 17:33
ATL や、WTL はデフォでそうなっているわけだが。


428 :デフォルトの名無しさん:04/05/19 18:22
インテリセンスの為だけに、名前空間を使ったとか?

429 :デフォルトの名無しさん:04/05/19 18:36
>>428
なんか誤解してないか?
名前空間の特徴のうち、

・Koenigの自動照合
・リンク時のシンボルレベルでの衝突の回避
・(名前空間内ではなくて)ユーザーコードの修正によるコンパイル時点での衝突の回避

は、using namespaceをするしないに関わらず機能するぞ。

430 :デフォルトの名無しさん:04/05/19 21:00
今までVBを使ってきたのですが、いい加減乗り換えようと最近C++の勉強を始めました。
そこで現在、開発環境をどれにするかで悩んでいます。
条件としては、
・ 言語: C++ (当たり前か・・・)
・ フリーソフトウェア(≒オープンソース)である。
・ RAD環境が整っており、簡単にグラフィカルなアプリが作れる
・ 環境が日本語
・ WindowsでもX Window Systemでも動作可能
・ インターフェースは
Winなら普通のLook&Feel
Xなら(できれば)GTK+

WideStudioも検討しましたが、ランタイムが重過ぎたり、
UIが独自で扱いにくい、そして別スレでの評判(作者云々)で
できれば検討から外したいと思っています。

無理な話だとは思いますが、このような環境をご存知の方居られましたら
ぜひご教授願います。

431 :デフォルトの名無しさん:04/05/19 21:14
そうですね。まず・・・環境うんぬんの前に、C++が本当に扱うことができるようになるのか、じっくりと検討してみるのがよろしいと思います。
あと、そんな環境ありません。あなたが本当にやる気があるのなら、フリーウェアの項は撤廃すべきです。

432 :デフォルトの名無しさん:04/05/19 21:18
そんな都合のいいものがあるわけ内だろ。

433 :430:04/05/19 22:01
>> あと、そんな環境ありません。
確かに無理難題だったかもしれません。条件を厳しくし過ぎてしまいました。

>> C++が本当に扱うことができるようになるのか、じっくりと検討してみるのがよろしいと思います。
とりあえず、 http://www.asahi-net.or.jp/~yf8k-kbys/cpp0.html には目を通し、大枠では理解できたかと感じました。
目を通しただけで、実習としてのコーディングは全てざっと読んでから、と考えていました。
そして大分(内容の6割くらいか?)理解できたと感じたので、コーディングのための環境を揃えようと思い立ちました。
しかし、他のプログラムのソースを見ると、どうやらテキストベースとグラフィックベースのプログラミングでは、
随分差があるように感じました。多分これは間違いではないと思います。
それに、私はテキストベースのソフトを作るつもりは当分無いので、できることなら初めからGUIのやり方に慣れよう、
と思ったわけです。
また私は現在、できる・できないの問題でなく、「できる所までやってみよう」という趣旨のもと、言語の学習を進めています。
どうせ趣味としてのプログラミングで、納期なんて物も無いですから、気楽に学習しています。

>> あなたが本当にやる気があるのなら、フリーウェアの項は撤廃すべきです。
意図が掴めなかったので、これについての詳しい説明をお願いします。

VBのぬるま湯に長く浸かっておりましたので、皆様には間の抜けた質問をしてしまうかもしれませんが、
頑張って慣れてゆこうと思いますので、どうか宜しくお願い致します。

434 :デフォルトの名無しさん:04/05/19 22:06
Java か C# のほうがいいんじゃないの?
C++ で GUI なんて、C++そのものの勉強、プラットフォームの勉強の後じゃないと理解できないと思う。
少なくとも、RADが期待できる言語ではない。

435 :430:04/05/19 22:13
>>434
Javaは重いとか、Webアプリ向けでスタンドアロンには向かないという
印象が強いのですが、じっさいのところどうなんでしょう。

436 :デフォルトの名無しさん:04/05/19 22:16
>>435
いや、そんなところでワガママ言ってるようじゃ
Windows でも X でもって所でどうしようもなくなる気が。

言語的にはスタンドアロンに向かないことはない。
誰も使ってないだけで。

437 :デフォルトの名無しさん:04/05/19 22:22
>>430
このスレ http://pc5.2ch.net/test/read.cgi/tech/1065627704/ から辿れるツールキットのソースを読んで、
それでもC++を使いたいと思ったら戻って来い。

438 :デフォルトの名無しさん:04/05/19 22:23
C++を勉強し始めて2週間です。
ソートプログラムを書いていて疑問に思ったんですが、
バブルソートとクイックソートとバブルソートなどは
実際の現場!?ではどのように使い分けているのでしょうか?
・プログラムのしやすさ
・使用メモリの大きさ
・速さ
などを考えたんですが、実際はどうなんでしょうか?

439 :デフォルトの名無しさん:04/05/19 22:29
基本はstd::sortとstd::stable_sort。場合によってはstd::map系。
いちいちソートなんぞ書いてられるか。

自分で書くとしたらcomb sortぐらい。

440 :デフォルトの名無しさん:04/05/19 22:31
>>438
そんなことをつらつら考えるより、ライブラリを使った方が早い。
特殊用途以外では気にすることもない。

441 :デフォルトの名無しさん:04/05/19 22:31
Boostって完全に現行標準ライブラリとは別の付加機能になってる
のでしょうか?それとも、もしかして将来、標準ライブラリの一部と
取って代わるようなこともありえるのですか?

442 :デフォルトの名無しさん:04/05/19 22:33
将来のことは誰にも分からない。

443 :デフォルトの名無しさん:04/05/19 22:34
>>431,432,434
要するに、C++でRADというのは実質無理なのでしょうか?
私がRADにこだわるのは、便利で手軽、保守が簡単であるという点と、なにより
ネット上に存在する多くの資料を見て嫌気が差したからでもあります。

私のC++を学習しようとする理由のひとつが、「Windows以外でも走らせたい」ということであり、
もちろんこれはJavaでもできますが、マイナーであるし、Java Start(だったっけ?) という
Sun版のJVMについていたサンプルのUIに良い印象を受けなかったこともあり、良い印象を持っていません。

それに、バイトコードを実行するので、性能も犠牲になります。
ですから、折角なら前々から考えていたC系言語をやってみよう、と考えたのです。

宜しければ、この際RADには拘らないので、C++でのGUIプログラミングを始めるにあたって
分かり易いサイト、もしくは書籍等を紹介して頂けないでしょうか。
もちろん、C++の基礎に関しては、分かり易い情報を多く見つけることが出来ましたので、
そこら辺の知識が前提となっていても構わないです。
ネット上の資料は、難しいか、VC++関係のものばかりで入門用の情報が見つかりませんでした。

何度もご迷惑をお掛けする事になってしまいましたが、どうかよろしくお願いします。

>>435
平仮名で送信してしまった・・・恥ずかしい


444 :デフォルトの名無しさん:04/05/19 22:39
C++ Builderとか

445 :デフォルトの名無しさん:04/05/19 22:48
RADって必要?
っていうか、RADってmodelとviewなんかぐちゃぐちゃに書くやつが
多くていやなんですが・・・
VC++みたく、DOC/VIEWで完全に切り分けて、初心者を除外して欲しい
仕事しずらいったらありゃしない

446 :デフォルトの名無しさん:04/05/19 22:51
GUIだけならあってもいいけどな。楽だし。

447 :デフォルトの名無しさん:04/05/19 22:53
>>443
クロスプラットフォームのライブラリ使うにはそれなりのC++の知識が必要。
とりあえずウインドウズでGUIの基本を学ぼう。
まずMSのサイトでC++のコンパイラを落としてきて、プラットフォームSDKをインストールしましょう。
その次に「猫でもわかるプログラミング」でググって、出てきたページを1からやりましょ。リソースエディタなんかなくても手書きで十分。

あと、VisualStudioのMFCならダイアログエディタで作ったダイアログをクラスに落とすことができるから、いいRADになると思うよ。

448 :デフォルトの名無しさん:04/05/19 23:16
>>443
「プログラミング言語C++ 3版」
これを書店でつらつらと眺め、全部理解できそうだと思ったら買って勉強する。
思いとどまるなら思いとどまる。
Webサイトの解説を読んで分かった気になっても、それは気持ちだけの話だからね。

449 :デフォルトの名無しさん:04/05/19 23:19
>>430>>443
俺もそう思ってwxWindowsを使ってる。RAD環境も(一応)ある。
恐らくこいつで不満は出ないと思う。
聞きたいことがあればwxWindowsスレで聞いてくれたら教えてあげるかも。

450 :デフォルトの名無しさん:04/05/19 23:40
>>441
別の付加機能。

451 :デフォルトの名無しさん:04/05/20 01:02
Qt devel + Kdevelop
glade + anjuta
kylix3
などと言ってみる。

452 :デフォルトの名無しさん:04/05/20 01:10
なんで勉強したいのにRADよ
覚えられないだろ

453 :デフォルトの名無しさん:04/05/20 01:58
可変長引数を処理する方法を教えてください。m(__)m

454 :デフォルトの名無しさん:04/05/20 02:01
>441
>Will the Boost.org libraries become part of the next C++ Standard?
>
>Some might, someday, but that is up to the standards committee.
>Committee members who also participate in Boost will definitely be
> proposing at least some Boost libraries for standardization.
>
>Libraries which are "existing practice" are most likely to be accepted
> by the C++ committee for future standardization. Having a library
> accepted by Boost is one way to establish existing practice.

http://www.boost.org/more/faq.htm より引用してみたが、質問の意味が違うのか。
基本的に標準ライブラリに「取って代わる」ようなものではない(一部あるかも知れないが)。
ただし追加として標準ライブラリに採用される可能性はもちろんある。

455 :デフォルトの名無しさん:04/05/20 02:16
>453
可変長引数=引数の個数が可変って解釈でいいんだよな。
で、具体的に何がしたいのよ。
それだけだと cstdarg 使え、で終わってしまうわけだが。
ttp://www.kouno.jp/home/c_faq/c15.html

456 :デフォルトの名無しさん:04/05/20 03:39
>>443
やー、まー、なんつーか。
多分あんたがVBで作ったアプリよりJavaのバイトコードをJIT搭載環境で動かした方がずっと速いから。
いきなり完璧なソフトなんてつくれっこないんだし、性能なんてもっとも難易度の高い分野のひとつ
なんだから考慮するだけ無駄だっての。
だいたい、基礎を分かった気になってるようだけど、それなら何で入門サイトなんか聞きたがるの?

開発環境で日本語を要求してる当たり、英語の資料は全部難しいんだろうね。


457 :デフォルトの名無しさん:04/05/20 03:44
なんか、学問に王道を要求した王様のようだな。
寧ろPerlでcgiでも作ってみたら?
制約された条件で、如何に使いやすいGUIを提供できるかいい勉強になるよ。

458 :デフォルトの名無しさん:04/05/20 05:55
>>443

(゚д゚)ハァ?

あなたは、何か勘違いしてませんか?このスレの住人はガッコの先生じゃ
ありませんよ。自分で歩ける様になってから尋ねて来てくださいね。


459 :デフォルトの名無しさん:04/05/20 07:32
.datファイルで保存した20x2のテーブルを
読み込みたいのですけど、、

#include <stdio.h>
#include <math.h>

#define M 21
#define N 2
void main(void)
{
int V, T;
   int i;
int array[M][N];

for(i=0, i<21, i++);{

FILE *ifp; /* declare pointers for in and out */

ifp = fopen("in.dat", "r");
fscanf(ifp, "%d %d", &V, &T);
printf("%d %d", array[i]);
}}
これで駄目だったので、どこが悪いですか?

460 :459:04/05/20 07:37
ごめんなさい。21x2のテーブルでした。

461 :デフォルトの名無しさん:04/05/20 07:40
>>459
>これで駄目だったので、どこが悪いですか?
ちゃんと勉強してないのが悪い。
質問の仕方が悪い。


462 :デフォルトの名無しさん:04/05/20 07:49
つーか、そもそもCスレで聞くべきだろ

463 :デフォルトの名無しさん:04/05/20 08:11
arrayにはどこで代入してるんだよ。おめでてーな。

464 :デフォルトの名無しさん:04/05/20 10:26
>>459
頭?
0から勉強し直さないと無理。

465 :デフォルトの名無しさん:04/05/20 12:39
>>461-464
お前ら糞だな。ぐちゃくちゃ書き込むぐらいなら、一言でちゃんとと教えてやれ。

それと
>>462
C++はCの仕様を包含してることを忘れるなアホ。

466 :デフォルトの名無しさん:04/05/20 12:49
>>465
といいながら一言で教えてない罠
あとCを包含してるといってCの話題をC++スレでやったら
Cスレと分かれてる意義が薄れ、話題が分散してしまう。
ということで >>462に同意

467 :デフォルトの名無しさん:04/05/20 13:15
>>465
C++にはstdio.hもmath.hもないが

468 :デフォルトの名無しさん:04/05/20 13:24
つーか>>465が質問者だろ。教えてくれないからキレてるだけだ。

469 :デフォルトの名無しさん:04/05/20 13:25
>>465
早く言い訳しろよ。

470 :デフォルトの名無しさん:04/05/20 13:37
Cスレに相応しい質問はすべて、C++スレにおいても相応しい質問なのである。
だから答えないお前らはアホなのである。基地外なのである。ゴミ以下なのである。
ていうか俺の質問には絶対に答えなくてはならない、これは全宇宙的な戒律なのである。

って、さっき>>465が部屋の隅っこで呟いてたよ。

471 :デフォルトの名無しさん:04/05/20 14:21
>>467
>C++にはstdio.hもmath.hもないが
アホかお前?

472 :デフォルトの名無しさん:04/05/20 14:25
>>470
あぁ体育座りしながらな

473 :デフォルトの名無しさん:04/05/20 14:25
>>471
お前がアホ。
つうか、もうヤメレ。
はい、次。

474 :デフォルトの名無しさん:04/05/20 14:35
わかった、おまえらアホだ。

しかし俺のほうがもっとアホだ
アホって誉め言葉でしょ

475 :デフォルトの名無しさん:04/05/20 14:36
画面にHello World!と表示するプログラム作って

476 :デフォルトの名無しさん:04/05/20 14:42
DISPLAY "Hello World!"

477 :デフォルトの名無しさん:04/05/20 14:43
>>471
cstdio のファイルの中身すら見たことない超初心者の >>467 をいじめてやるなよ。

478 :467:04/05/20 14:45
C++では stdio.h は絶対ないことは間違いない。

479 :デフォルトの名無しさん:04/05/20 14:46
>>467
皿仕上げ

480 :467:04/05/20 14:48
うすかわの表面しか理解してないことに気づきました。
首吊ってきます。


481 :デフォルトの名無しさん:04/05/20 14:49
恥さらしあげ

482 :デフォルトの名無しさん:04/05/20 14:56
>>447
cstdioの中身が

namespace std {
#include <stdio.h>
}

とかになってるって事か?
規格と実装は(略

483 :デフォルトの名無しさん:04/05/20 14:56
<iostream>しか使わないのでのstdio.h は消してました。
通りでコンパイルできなかった理由が初めてわかりました。

484 :デフォルトの名無しさん:04/05/20 15:01

operator<<=, って演算子があるけど、
こいつを文字列に対して、例えば以下のように多重定義する。
wstring & operator<<=( wstring & lhs, string const & rhs )
{
 vector< wchar_t > buf;
 buf.reserve( mbstowcs( 0, rhs.c_str(), MB_CUR_MAX ) );
 mbstowcs( &b[0], rhs.c_str(), MB_CUR_MAX );
 wstring( b.begin(), b.end() ).swap( lhs );
 return lhs;
}
すると、ナロー文字列をワイド文字列に変換する際に以下のようにかける。
wide <<= narrow;
とても C++ らしいと思うのだがどうだろう?


485 :デフォルトの名無しさん:04/05/20 15:06
ナロー文字列なんて言葉を使うな。

486 :デフォルトの名無しさん:04/05/20 15:08
なんだと、んナロー

487 :デフォルトの名無しさん:04/05/20 15:38
>>477
C++に*.hはない。

488 :デフォルトの名無しさん:04/05/20 15:47
>>487
規格嫁

489 :デフォルトの名無しさん:04/05/20 15:51
>>488
optional

しかも、厳密にはcstdioがstdio.hを取り込むのではなく、
stdio.hで各関数をグローバルにusing std::printf;みたいな事するようになってる。

490 :デフォルトの名無しさん:04/05/20 16:00
さらし上げ
>>487
アホの活け作り。Cの処理系なしに、pure C++だけで動く処理系あれば言ってみろ。糞が

491 :デフォルトの名無しさん:04/05/20 16:00
すり替え一名様ご案内〜

492 :デフォルトの名無しさん:04/05/20 16:11
>>488
オプションであってもそれが使えなければCとの互換性は保てない。
DではなくてあくまでもよりよいCがC++だから。

493 :デフォルトの名無しさん:04/05/20 16:11
なんで規格の話してる奴に処理系の具体例を求めているんだろう(´・ω・`)

494 :デフォルトの名無しさん:04/05/20 16:12
なんで処理系の話をしてるのに勝手に規格の話を持ち出してんの?

495 :デフォルトの名無しさん:04/05/20 16:15
だから結論はこれだろ。

> Cスレに相応しい質問はすべて、C++スレにおいても相応しい質問なのである。
> だから答えないお前らはアホなのである。基地外なのである。ゴミ以下なのである。
> ていうか俺の質問には絶対に答えなくてはならない、これは全宇宙的な戒律なのである。

496 :デフォルトの名無しさん:04/05/20 16:15
規格はstdio.hをインクルードするなとはなってないよ。

497 :デフォルトの名無しさん:04/05/20 16:18
>>492 あくまでもよりよいCがC++だから。

それはお前の中だけだろう。
Cと矛盾する仕様もいくつか含んでいるし
C99に至っては完全に枝分かれしたような状態なのに。

498 :デフォルトの名無しさん:04/05/20 16:19
C++の要件にCとの互換性があるなんて初耳だぞ。

499 :デフォルトの名無しさん:04/05/20 16:20
C++ソースにおいてがstdio.hを直接includeして何か問題あるようなら、
warningなりerrorなりを出すべきだな。
簡単にできるはずだが、現実はそうなっていない。

500 :デフォルトの名無しさん:04/05/20 16:23
>>499
だれもそんな事は言っていない。
C++標準以外のヘッダやライブラリは使えないとでもいうつもりか?

501 :デフォルトの名無しさん:04/05/20 16:23
>それはお前の中だけだろう。

お前何言ってる?
C++はよりよいCを目指して作られた処理系ってこと知らないのか?

502 :デフォルトの名無しさん:04/05/20 16:25
>>500
アフォかお前。
Cの標準ライブラリをincludeしたときにwarning出すぐらい簡単だと
言ってるんだよ。自前のファイルのincludeをハネル必要なんかないだろうが。

503 :デフォルトの名無しさん:04/05/20 16:27
>>501
目指して作られた事と、実際にC++がCのスーパーセットであることに相関関係はないぞ。

504 :デフォルトの名無しさん:04/05/20 16:29
>>502
C++の処理系がCのヘッダファイルを「わざわざ」認識して警告する必要があるのか?
アフォとか言う前に、プリプロセッサの仕事を良く考え直してみろ。
取り込んだヘッダがC++の文法と矛盾していなければ問題なくコンパイルできて何が悪い?

505 :デフォルトの名無しさん:04/05/20 16:29
>目指して作られた事と、実際にC++がCのスーパーセットであることに相関関係はないぞ。

頭悪いなお前。言ってることのロジックが成り立ってないこともわからんのか?

506 :デフォルトの名無しさん:04/05/20 16:31
>>505
はぁ。


507 :デフォルトの名無しさん:04/05/20 16:32
>取り込んだヘッダがC++の文法と矛盾していなければ問題なくコンパイルできて何が悪い?
全く問題ないよ。だから使うことに何の問題もない。
お前、考えてから書き込めや。

508 :デフォルトの名無しさん:04/05/20 16:35
>>504
>C++の処理系がCのヘッダファイルを「わざわざ」認識して警告する必要があるのか?
全くないよ。

509 :デフォルトの名無しさん:04/05/20 16:35
すげぇ、まだやってたんだ。
お前ら、全員馬鹿だってば。
いいかんげんにヤメレ!

510 :デフォルトの名無しさん:04/05/20 16:36
基本的にC++はCとは基本的に別の言語であって、
C++の言語仕様には、Cとの多くの共通点があるだけ。

>>507
使う事に問題があるなんて誰も言ってないだろうが。
Cのstdio.hを使うのならそれはC++スレの範疇ではないと言ってるだけだ。
C++は決してCを包括しているわけではない。

511 :デフォルトの名無しさん:04/05/20 16:39
だれか、これは何をしたいのか教えてくれ。
何でやたらキャストばかり・・・
int main(){
int y[] = {1,2,3,4,5,6,7,8,9,10};
int *ip;
long L1;
long L2;

L1 = (long)y;
cin >> L2;
ip = (int*)(L1 + (L2 * sizeof(int)));
printf("%d\n",*ip);

return 0;
}

512 :デフォルトの名無しさん:04/05/20 16:40
あと、sizeof(int)をかける理由はいったいなに?

513 :デフォルトの名無しさん:04/05/20 16:41
いや違う。
C++はCを包括している。

514 :デフォルトの名無しさん:04/05/20 16:45
>>510

基本的にC++はCの完全なるスーパーセットであって、
C++の言語仕様は、Cを完全に包含していなければならない。


515 :デフォルトの名無しさん:04/05/20 16:47
>>514
頭が古いですね。

516 :デフォルトの名無しさん:04/05/20 16:48
>>511
それが意図しているのは多分、
int main(){
int y[] = {1,2,3,4,5,6,7,8,9,10};
int *ip;
long L2;

cin >> L2;
ip = y + L2;
printf("%d\n", *ip);

return 0;
}

つまり、入力された数に1を足して表示する。

517 :デフォルトの名無しさん:04/05/20 16:48
>>511
y[i] = *(y + i)
を確かめたいんじゃないの?

518 :デフォルトの名無しさん:04/05/20 16:49
>>514
そんなこと、どこに書いてあった?

519 :デフォルトの名無しさん:04/05/20 16:49
おお。いい具体例が出てきた。
>>507
>>511にこんなキャストはCのキャストだからCスレに行けと言うのか?
それともcinさえあればC++スレでOKなのかい?

520 :デフォルトの名無しさん:04/05/20 16:57
C++はC言語を継承する言語であり、若干の例外を除いてCをサブセットとしてサポートしている。

521 :デフォルトの名無しさん:04/05/20 16:58
>>512
int *でポインタ演算をする代わりに、longにキャストして、ポインタ演算の真似事をして、
再びint *にキャストしている。
ポインタの中身が通常の整数であるような実装では、ポインタの中身はバイトのアドレスで、
intの配列の要素を指しているポインタの数値にsizeof(int)分だけ足せば
その配列の次の要素を指すようになる。だから、
L2 * sizeof(int)
を足せば、L2個先の要素を指すようになる。
但し、上に書いたことは規格で保障されてはいない。
実際、ポインタをlongにキャストして再び元に戻すと値が失われる処理系があると思う。

522 :デフォルトの名無しさん:04/05/20 16:58
stdint.hとか_ComplexとかもいつのまにかC++の言語仕様になってそうだなw

523 :デフォルトの名無しさん:04/05/20 17:00
>>520
それが「C++はCとは別の言語だが、Cとの共通点を多く含む仕様」って物なんだよ
ISO C++はCとは別の言語。
仕様に重複個所があったとしても、それぞれCの要件、C++の要件で別物なの。

524 :デフォルトの名無しさん:04/05/20 17:02
若干の例外を除けばC++はCのスーパーセットである。
--- 中略---
C++とCの間のすべての違いはコンパイラによって診断できる。



525 :デフォルトの名無しさん:04/05/20 17:05
>>523
お前の頭はスでもはいってるのか?
>ISO C++はCとは別の言語。
当たり前。C++はCのスーパーセット。

526 :デフォルトの名無しさん:04/05/20 17:09
つーかCスレでもC++スレでもなく宿題スレ行けよ

527 :デフォルトの名無しさん:04/05/20 17:11
>>524
C++コンパイラがエラーなり警告なり出さない書式はすべてC++と認めて構わないってことだな。

528 :デフォルトの名無しさん:04/05/20 17:13
>>511
いっそこういうのは
gcc version 3.2.3 (mingw)にて想定どうりの動作確認
#include <iostream>
void hello(){
    std::cout << "hello world\n";
}
void f(){
    long p;
    *(&p+2)=reinterpret_cast<long>(&hello);
    std::cout << "f\n";
}
int main(){
    f();
    std::cout << "after f\n";
    return 0;
}


529 :デフォルトの名無しさん:04/05/20 17:14
>>525
> 当たり前。C++はCのスーパーセット。
頭が古いですね。

530 :デフォルトの名無しさん:04/05/20 17:15
>>525
おまえは文字定数の型の違いを知らないのか?
暗黙のintを知らないのか?
整数とポインタ間の暗黙の変換を知らないのか?
_Complexや"%lf"を知らないのか?

>>526
宿題スレに馬鹿な議論を持ち込もうとせんでくれ。

531 :デフォルトの名無しさん:04/05/20 17:17
>>530
おまえはちょっと冷静になれ。
元質問の>>459を宿題スレでやれってこったろ。

532 :デフォルトの名無しさん:04/05/20 17:20
元はといえば>>459が逆切れして煽ったのが悪い

533 :デフォルトの名無しさん:04/05/20 17:21
>おまえは文字定数の型の違いを知らないのか?
>暗黙のintを知らないのか?
>整数とポインタ間の暗黙の変換を知らないのか?
>_Complexや"%lf"を知らないのか?
はぁ?それを知ってることに対してお前は何を言いたいんだ?
_Complexは知らんな。

534 :デフォルトの名無しさん:04/05/20 17:25
厨の逆切れにまんまと乗せられたこの人たちっていったい・・・

535 :デフォルトの名無しさん:04/05/20 17:25
言っとくが>>459ははじめにファイルリードのリスト示しただけで、それ以降
絡んでないのだが。同一人物と思ってる時点でお笑いだな。

536 :デフォルトの名無しさん:04/05/20 17:27
>>535
おまえが459かよ。取りあえずは責任とって氏んでくれ。

537 :デフォルトの名無しさん:04/05/20 17:28
>>535
本当だ、IPを確認したら別人だったよ!

538 :デフォルトの名無しさん:04/05/20 17:30
>>537
ふーん。そのIP晒してくれよ。

539 :デフォルトの名無しさん:04/05/20 17:32
何このスレ

540 :デフォルトの名無しさん:04/05/20 17:33
つかぬことをお聞きしますが
仮想アドレス空間でのコード領域においてメインルーチンは先頭に配置されるますよね
従って、関数名の「main」はメインルーチンの実行コードを指すポインタなんですかね?
それに付随して、他のサブルーチン内でmain()を呼び出すことは出来ますでしょうか?

541 :デフォルトの名無しさん:04/05/20 17:38
関数名はinline展開されてなければ実行アドレスを指すものと解釈できる。
main()を呼び出すことも可能だが、それはよくない書き方。

542 :デフォルトの名無しさん:04/05/20 17:45
98年のC++に対してC99の仕様持ち出してどうすんの?

543 :デフォルトの名無しさん:04/05/20 17:53
>>541
サンクス。
「main」も関数ポインタと理解して良かったんですね

544 :デフォルトの名無しさん:04/05/20 17:56
>>「main」も関数ポインタと理解して良かったんですね
それは違うよ。ポインタとして扱いたければ関数へのポインタを宣言して
main()を指すようにすれば。ただし、君がやろうとしてることは恐らく正しい
コーディング法ではないと思うけど。

545 :デフォルトの名無しさん:04/05/20 17:57
mainは呼んじゃダメ、とか規格になかった?

546 :デフォルトの名無しさん:04/05/20 17:58
>>543
もうちょっと素直に「main()も関数なんですね」と言え。

547 :デフォルトの名無しさん:04/05/20 18:02
int main(); //前方宣言

int funcx()
{
int (*f)();
f = main;

f();
}

int main()
{
 //実体

funcx();
}

無限ループになるよ。

548 :デフォルトの名無しさん:04/05/20 18:04
関数ポインタというと少し表現がアレでしたが
要は、mainがメインルーチンの関数名(先頭アドレス)としてソース上で表現されている
ということを確認したかったんです

549 :デフォルトの名無しさん:04/05/20 18:08
-Sつけてアセンブルコード見ればすぐわかるよ。

550 :デフォルトの名無しさん:04/05/20 18:13
,codファイルをエディタで開くのってどうやるんですか

551 :デフォルトの名無しさん:04/05/20 18:15
>vi file.cod

552 :デフォルトの名無しさん:04/05/20 18:18
重ね重ねサンクス

553 :デフォルトの名無しさん:04/05/20 18:22
>>547
それがなんなの?

554 :デフォルトの名無しさん:04/05/20 18:26
基底ケース無い再帰呼び出しだな

555 :デフォルトの名無しさん:04/05/20 18:29
typeidさえあればdynamic_castはなくてもいい。

556 :デフォルトの名無しさん:04/05/20 18:31
>>553
>>544に書いたことを>>547に書いたんだが、なんか問題でもあるのか?

557 :デフォルトの名無しさん:04/05/21 06:49
>>527
C++標準に存在しないstdio.hとか使ったソースを持ってきたら
実装依存だから専用スレへ誘導するべきだな。


558 :デフォルトの名無しさん:04/05/21 09:22
動的多次元配列(boostのmulti_arrayに配列の大きさをリサイズする機能がついた物)を
使いたいんですけど、そういった物が使えるライブラリはないでしょうか?

559 :デフォルトの名無しさん:04/05/21 11:19
テンプレートを使用したクラスで宣言部と実装部を別々のファイルに記述することはできないのでしょうか?
(宣言部のファイルで#include "source.cpp"とかはなしで)

実装部を別ファイルにするとリンカがエラーを吐いてくれるので‥‥


560 :デフォルトの名無しさん:04/05/21 11:33
>>559
exportを使える環境以外では無理。

561 :デフォルトの名無しさん:04/05/21 11:33
>>557
いや、ここでやったらいいよ。

562 :デフォルトの名無しさん:04/05/21 11:36
>>559
export

563 :デフォルトの名無しさん:04/05/21 11:38
>>561
Cのヘッダだけは良しとする合理的理由が説明されてない
てことはunistd.hとかwindows.hもありだな。
ホント何でもありなんだな、C++スレは。



564 :デフォルトの名無しさん:04/05/21 11:46
Cの規格にwindows.hがあるそうです。

565 :デフォルトの名無しさん:04/05/21 11:48
>>563
>>561の行間嫁。一行だけどな。

566 :559:04/05/21 11:51
>解説
>export キーワードは将来の実装用に予約済みですが,このリリースでは効果を持ちません。

orz

567 :デフォルトの名無しさん:04/05/21 12:21
exportが使えるコンパイラ(フロントエンド)はcomeau以外まだ無いのかな。
comeauはちょっと手が出しにくいなあ。
注文書にクレカの表裏のコピー添付してサイン入れてfaxか郵送しろってのが・・。

568 :デフォルトの名無しさん:04/05/21 12:35
>>564
そりゃ初耳だ。C++の規格にはCが含まれていると言う事か。

569 :デフォルトの名無しさん:04/05/21 12:40
>>568
もういいって。

570 :名無しさん@Vim%Chalice:04/05/21 13:18
>>558
http://www.boost.org/libs/multi_array/doc/reference.html#synopsis
boost::multi_array は resize 出来るぞ

571 :デフォルトの名無しさん:04/05/21 14:36
>>559
> テンプレートを使用したクラスで宣言部と実装部を別々のファイルに記述することはできないのでしょうか?
> (宣言部のファイルで#include "source.cpp"とかはなしで)
>
> 実装部を別ファイルにするとリンカがエラーを吐いてくれるので‥‥
私はg++(3.3.3)を使っているのですが,
テンプレート引数に与える型が限られている場合,
例えば,以下のようにクラステンプレートAがあって,
テンプレート引数としてintとfloatでしか実体化しない場合には,
$ cat a.h
template <typename T> struct A {A ();};
$ cat a.cpp
#include "a.h"
#include <iostream>
template <typename T> A <T>::A () {
std::cout << typeid (T).name () << std::endl;
}
template class A <int>;
template class A <float>;
$ cat test.cpp
#include "a.h"
int main () {
A <int> a0;
A <float> a1;
return 0;
}
なんてことをしてます.
これって,仕様としてはOKなのでしょうか? gcc以外のみなさん,これ動きます?


572 :558:04/05/21 14:43
>>570
あ、そうなんですか。
翻訳されたところしか読んでなくて、てっきりreshapeしかないと思い込んでいました。
どうも失礼しました。

573 :デフォルトの名無しさん:04/05/21 14:52
>>571
規格上はOK。

574 :571:04/05/21 14:59
>>573
> 規格上はOK。
あっ,どうも.そうですか.安心しました.


575 :デフォルトの名無しさん:04/05/21 15:27
コンパイルできるんですが、正しく出力されません
STLport使ってるんですがそれが原因でしょうか?
#include <iostream>
int main()
{
  using namespace std;
  wchar_t s[] = L"波浪";
  wcout << s << endl;
  return 0;
}

576 :デフォルトの名無しさん:04/05/21 15:29
>>575 locale

今のSTLPortでもimbueしてやんないとだめかもしれない。
http://www.tietew.jp/cppll/archive/1484

577 :デフォルトの名無しさん:04/05/21 15:31
>>575
STLportは知らんが、VC7.1だと
setlocale(LC_ALL, "Japanese_Japan.932" );
こういうのが要るが、そのへんはどうか

578 :575:04/05/21 15:57
wcout.imbue(std::locale("japanese"))
を加えたら正しく出力できました
setlocale(LC_ALL, "Japanese_Japan.932" );
はだめでした。Japanese_Japan.20932とかもだめでした
ありがとうございました



579 :デフォルトの名無しさん:04/05/21 19:29
iostream のロケールは、C の setlocale に影響されないのでは?
C++ 使っている場合、setlocale よりも、locale::global を使ったほうがいい。

580 :デフォルトの名無しさん:04/05/22 07:18
unsigned int uInt = 0xFFFFFFFF;

があり、これを int として解釈したい場合、

static_cast<int>(uInt);
reinterpret_cast<int&>(uInt);

とすると -1 になり同じ結果が得られますが、用法としてはどちらが正しいのでしょうか。
或いはどちらも正しい?

581 :デフォルトの名無しさん:04/05/22 07:28
どっちも正しい。
再解釈だけが目的ならstatic_cast

582 :デフォルトの名無しさん:04/05/22 07:52
ありがと。
未だに static と reinterpret の区別が曖昧なもので。
もう一回勉強してみます。

583 :デフォルトの名無しさん:04/05/22 07:58
reinterpret_cast は、アーキテクチャ依存になるような危険な変換を行うときに
最後の手段として使う物だす

584 :デフォルトの名無しさん:04/05/22 08:01
static_castは指定された型になるように変換
reinterpret_castはビットパターンをそのままコピー

585 :デフォルトの名無しさん:04/05/22 11:01
>583
変換元の値が、変換先の整数型の上限を超えている場合は、そもそも実装依存だよ。
static_cast 使おうが reinterpret_cast 使おうが。

> 4.7 Integral conversions
> 3 If the destination type is signed, the value is unchanged if it can be represented in
> the destination type (and bitfield width); otherwise, the value is implementationdefined.

586 :デフォルトの名無しさん:04/05/22 13:17
lexical_castは文字列と数値の相互変換

え・・・?およびでない?

587 :デフォルトの名無しさん:04/05/22 16:15
>>585
ふーんimplementationdefinedだったのか。undefinedだと思っていた。
くそー手元に規格票がなくて調べようがない・・・

588 :デフォルトの名無しさん:04/05/22 16:32
例えば
struct A {
char str[10];
int b;
int c;
} ;
という構造体で渡されてくるデータがあるとします。
これを以下のような型へのポインタを引数に取る関数(この中は
事情があって手を入れられない)に渡したいのですが、
struct B {
int b;
int c;
} ;

この場合、struct B b1;を作りそこに対応メンバーをコピーして
から渡す方法がありますが、参照でコピーせずにやりたいのですが
うまくいきません。どうやったら良いでしょうか?


589 :デフォルトの名無しさん:04/05/22 16:40
>>588

struct A : B
{
char str[10];
};


590 :デフォルトの名無しさん:04/05/22 16:44
>>588
無理。きれいな方法はない。
おそらくAの設計ミス。

どうしてもやるなら、
struct A {
char str[10];
B b;
};

物理的なレイアウトに
制約がなければ
struct A : B {
char str[10];
};

これは保証なし
struct C {
char str[10];
B b;
};
union {
A a;
C c;
};


591 :デフォルトの名無しさん:04/05/22 16:46
>>588
reinterpret_cast< B* >( reinterpret_cast< char* >( &a ) + offsetof( A , b ) )
とりあえず動くものはできるかもしれないけど、激しくおすすめできない。
int ふたつくらいならコピーしてしまう方がいい。

592 :588:04/05/22 16:55
>>589-591
なるほどやはり参照で逃げるのは無理のようですね。
引数の渡し方にばかり目がいき、>>589を忘れてました。
これが一番本質的な解決策ですね。どうもありがとうございました。


593 :デフォルトの名無しさん:04/05/22 16:58
なんだ。Aは変更しても良かったのか。

594 :デフォルトの名無しさん:04/05/22 21:59
dynamic_castっていまいちわからないのですが、
どういうときに使うのでしょうか?

595 :デフォルトの名無しさん:04/05/22 22:06

http://www.fides.dti.ne.jp/~oka-t/cpplab-cast.html

596 :デフォルトの名無しさん:04/05/22 22:08
>>594


597 :デフォルトの名無しさん:04/05/22 22:08
>>594多相的な仮想基底クラスを継承している派生クラスのインスタンスの部分オブジェクトを指し示している仮想基底クラスのインスタンスへのポインタをダウンキャストするとき

598 :デフォルトの名無しさん:04/05/22 22:15
javaでコレクションクラスから要素を取り出す時に
なんか気持ちの悪いキャストをするだろ?アレ

599 :594:04/05/22 22:21
レスどうも。
う〜む、どうも俺には難しいなぁ。
いちおう基底→派生の変換で、なおかつ基底クラスが仮想関数
をもっていなけりゃいけないってことですが、何の役に立つのかな。
static_castでもできそうな・・・。

600 :デフォルトの名無しさん:04/05/22 22:23
>>599
実行時にチェックしてくれる。

601 :594:04/05/22 22:28
実行時チェックということですが、ということはstatic_castの方が
危険があると・・・しかし、そもそも何をもってキャスト成功・失敗が
分岐するのでしょうか。


602 :デフォルトの名無しさん:04/05/22 22:29
>>599
dynamicだから実行時に行うんだよ。当たり前だけど

それ以外のキャストはコンパイル時に決定するだろ

603 :デフォルトの名無しさん:04/05/22 22:32
知りたいのはC++での有用な使い道ってことだろ

604 :デフォルトの名無しさん:04/05/22 22:44
>603
俺が最近使ったのは、スクリプト言語を実装したとき。スクリプト言語側は
C++ ほど豊富な型情報を持たせなかったので、スクリプトにポインタを
渡した段階で基底クラス型のポインタに。

で、受け取ったポインタを元の型に復元するときに dynamic_cast してた。

605 :デフォルトの名無しさん:04/05/22 22:47
>>601
> 何をもってキャスト成功・失敗が分岐するのでしょうか。

ポインタのキャストが失敗すればヌル。
参照のキャストが失敗すればbad_cast。

606 :594:04/05/22 23:59
なんとなくわかってきました。ありがとうございました。
あとは自分でつめてみます。

607 :デフォルトの名無しさん:04/05/23 10:34
>>587
安いんだから、買っとけ。

608 :デフォルトの名無しさん:04/05/23 21:28
GoF本のstateパターンの使用を検討しています。
何かの本にはvirtual関数はバーチャルテーブル見る分遅いと書いてあった気がします。
virtual関数を使用せずstateパターンと同じような効果を得られるお勧めのパターンがあったら教えてください。


609 :デフォルトの名無しさん:04/05/23 21:37
>>608
速度は計測してから判断せよ。ただ、目安としては
vtableは相当速度に厳しいとき以外はまったく問題にならないから安心しろ

610 :デフォルトの名無しさん:04/05/23 21:53
おお。為になる御意見サンクス。


611 :デフォルトの名無しさん:04/05/23 23:21
>608
switch - case だってジャンプテーブル持つことになるから、本質的に
変わらんよ。

それと状態遷移に関しては、入退場動作をどうするか、複合状態(状態の
ネスト)をどうするかの方が大きな問題。複合状態を全く扱わないってのも
一手だが、複雑になってくると破綻しがち。

612 :デフォルトの名無しさん:04/05/23 23:37
そこで boost::fsm ですよ。

613 :デフォルトの名無しさん:04/05/23 23:46
>>608

速度については>>609,>>611の言うとおり。
「何かの本にはコンパイラはアセンブラより遅いとあった気がします」
といってるのと同じだよ。

普通にプログラムを組む場合、バーチャルテーブルなんかより
自分自身がつくりあげるアルゴリズムの方がよっぽど速度に
影響を与えていることが多い。


614 :デフォルトの名無しさん:04/05/24 00:35
dynamic_castで参照のキャストが失敗したときに
bad_cast例外が出るなんて知らなかったYO!
どこに書いてあるんだYO!!!

615 :デフォルトの名無しさん:04/05/24 00:51
てかいったいどこに書いていないんだよ。

616 :デフォルトの名無しさん:04/05/24 00:54
VS.NETをインストールしたらcl.exeでコマンドラインからコンパイル
できないのですが、なぜですか?



617 :デフォルトの名無しさん:04/05/24 00:54
>>614
こことか。
http://www.google.co.jp/search?hl=ja&q=dynamic_cast+bad_cast&lr=lang_ja

例外でなかったら、他にどうなると思ってたんだ?

618 :デフォルトの名無しさん:04/05/24 00:57
>>617
NULLの詰まった参照

619 :デフォルトの名無しさん:04/05/24 01:06
>>618
そんなもん、言語仕様上には存在しない。
ヌルポインタをデリファレンスした時点で未定義。

620 :デフォルトの名無しさん:04/05/24 15:12
WinプログラムですべてC++で記述してる椰子ってどのくらいいるの。
おれば、C++はエンジン部分のdllを作ることしか使ってない。てか、使えない。
GUIの部分はC#に頼りきり。C++でやろうとしたんだけど、難しすぎてあきらめた。

621 :デフォルトの名無しさん:04/05/24 16:43
ノシ

622 :デフォルトの名無しさん:04/05/24 17:03
ノシ

623 :デフォルトの名無しさん:04/05/24 17:06
C++でGUI作りなんてペンギンが100m走やるようなもんだ

624 :デフォルトの名無しさん:04/05/24 17:15
かわいいじゃないの

625 :デフォルトの名無しさん:04/05/24 17:18
わざわざペンギンを選ぶのは、なんか狙ったの?

626 :デフォルトの名無しさん:04/05/24 17:47
>>620
普通は自作か他作のGUIライブラリを使います。C#なんて使いません。

627 :デフォルトの名無しさん:04/05/24 18:00
>>620
普通はVBかC#を使います。C++なんて使いません。

628 :デフォルトの名無しさん:04/05/24 18:17
>>626
よっぽど暇なんだね。

629 :デフォルトの名無しさん:04/05/24 18:20
そこでFOXですよ

630 :デフォルトの名無しさん:04/05/24 18:35
そこで notus ですよ

631 :デフォルトの名無しさん:04/05/24 18:44
そこでCUIですよ

632 :デフォルトの名無しさん:04/05/24 19:02
Fox っていうとSH3プロジェクトなんだが。

633 :デフォルトの名無しさん:04/05/24 19:07
それはよかったですね

634 :デフォルトの名無しさん:04/05/24 21:08
MFCでがりがり作ってますが、何か?

635 :デフォルトの名無しさん:04/05/24 21:26
時代はWTL

636 :デフォルトの名無しさん:04/05/24 21:28
C++Builder>>>>>>>>>>>>>>VC++

637 :デフォルトの名無しさん:04/05/24 21:42
時代はOTL

638 :デフォルトの名無しさん:04/05/24 21:51
http://otl.sourceforge.net/

639 :デフォルトの名無しさん:04/05/24 23:20
wxWidgetsをどうぞ
【GUIライブラリ】wxWindowsでのひょーん
http://pc5.2ch.net/test/read.cgi/tech/1052186697/


640 :デフォルトの名無しさん:04/05/24 23:27
おまいら内容ないのセコいプログラムを派手な総天然色の画面で誤魔化そうなんて(ry

641 :デフォルトの名無しさん:04/05/24 23:38
stateパターンでひとつ
状態Aの処理内で状態Aから状態Bに切り替えたくなったのですが
どうすればいいのでしょうか。そもそもAはBがあることすら知らないのですが

642 :デフォルトの名無しさん:04/05/24 23:40
Observer作って管理汁

643 :デフォルトの名無しさん:04/05/25 02:18
クラスのメンバ関数の中で、struct sigaction の
void (*sa_handler)(int); に、同じクラスの別のメンバ関数
を登録したいのですが、コンパイラに型が違うと怒られて
弾かれてしまいます。こういう場合は、どうやってセット
するんでしょうか。

644 :デフォルトの名無しさん:04/05/25 02:54
>>643
class内でstatic void foo(int bar);なるメンバ関数なら登録できると思われ。
staticじゃないメンバ関数は呼び出し手順が違うので登録できないかと。

645 :デフォルトの名無しさん:04/05/25 03:01
C++って、Cを知らないとできないの?
先にC言語勉強したほうがいい?

646 :デフォルトの名無しさん:04/05/25 03:04
Yes

647 :デフォルトの名無しさん:04/05/25 03:22
>>645
C++からでいいでしょ。
Cのライブラリもどうせ覚えなあかんけど、それを最初に済ましておく必然性も無いような。

648 :デフォルトの名無しさん:04/05/25 04:05
C++の説明が、Cの基本的な知識(文法など)の習得を前提にしているので、
そういったところを知らない(C/C++を初めて触るというレベル)というのであれば
Cを勉強したほうがいいんでないの?


649 :デフォルトの名無しさん:04/05/25 04:35
>Cのライブラリもどうせ覚えなあかんけど
ライブラリの勉強なんかしてどうすんの
Cやるときにでもライブラリなんて後回しでいいよ。

650 :デフォルトの名無しさん:04/05/25 04:36
malloc,free
はC++やる上で必須だろ?

651 :デフォルトの名無しさん:04/05/25 04:38
プリプロセッサのディープな使い方も是非やりこんでないと

652 :デフォルトの名無しさん:04/05/25 04:42
>>648
同意。

>>650
new delete でいいじゃん。

653 :デフォルトの名無しさん:04/05/25 05:18
ポインタは必須だな。
int *((*)f())[]

654 :デフォルトの名無しさん:04/05/25 05:20
リスト構造ぐらいすらすら書けるようになってからC++ やりゃいいんじゃない?

655 :デフォルトの名無しさん:04/05/25 05:23
アセンブルコードが大体予測できるようにならないとしょーもないC++プログラマ
になることは間違いない

656 :デフォルトの名無しさん:04/05/25 05:26
C++はCとは別な言語だからやる意味はない。

657 :デフォルトの名無しさん:04/05/25 05:32
Cからはじめるより
C#まず勉強してGCに慣れ親しんでから
C++やるのがいいと思うよ。
ちょうど
オートマに慣れてからミッション運転する感じかな。

658 :デフォルトの名無しさん:04/05/25 05:35
>>657
C#?
http://www.kmonos.net/alang/d
やっぱDだろ?DからはじめてC++

659 :デフォルトの名無しさん:04/05/25 07:41
>>657
オートマにもミッションはありますが何か。

660 :デフォルトの名無しさん:04/05/25 08:43
いや、JavaをはじめてからC++だな。

661 :デフォルトの名無しさん:04/05/25 08:59
Javaの前にJavaScriptだろ。

662 :デフォルトの名無しさん:04/05/25 09:00
C+ASMやってからがいいなあ

自動変数がスコープを抜けるとデストラクタが呼ばれるとかいうのを
asmレベルで確認できるぐらいじゃないと
わけわからんところで躓く気がする

663 :デフォルトの名無しさん:04/05/25 10:24
>>659
マニュアルと言いたかったんだろう

664 :デフォルトの名無しさん:04/05/25 13:11
オートマ(C#)で鳴らすと同時に、車の内部構造(ASM)も勉強しる。

665 :デフォルトの名無しさん:04/05/25 13:14
Cからはじめるより
emacs lispまず勉強してGCに慣れ親しんでから
C++やるのがいいと思うよ。
ちょうど
オートマに慣れてからミッション運転する感じかな。

666 :デフォルトの名無しさん:04/05/25 13:20
ウンコする人間(C#)は下水道(ASM)がどうなっているか知る必要はない。
そういう汚れ仕事はそれ専用の人間に任せればいいのさ。

667 :デフォルトの名無しさん:04/05/25 14:34
Cからはじめるより
Eiffelまず勉強してGCに慣れ親しんでから
C++やるのがいいと思うよ。
ちょうど
オートマに慣れてからミッション運転する感じかな。

668 :デフォルトの名無しさん:04/05/25 14:37
C++でエンジン作って、
Cでラッピングして__stdcall でエクスポートするdll作って、
C#でそれをインポートしてGUI作る
ってのが効率のいいWindowsアプリ作りの作法ってことでいい?

669 :デフォルトの名無しさん:04/05/25 14:52
C++でエンジンをCOM形式で作ってDelphiでそれを利用するのがいいんじゃないか

670 :デフォルトの名無しさん:04/05/25 14:55
車を運転する者から言わせてもらうと、
>オートマに慣れてからミッション運転する感じかな。
つまり、エンストしまくりだし、全く使いこなせないってことですね。

671 :デフォルトの名無しさん:04/05/25 15:46
C++で基底クラスのデストラクタにvirtualをつけると
なぜ適切にデストラクタが呼び出されるのか理解に詰まってるので教えてください。

たとえば以下のような基底クラスと派生クラスがあったコードの場合

class CParent {
int m_nSize;
public:
CParent(int nSize =0) : m_nSize(nSize) {}
~CParent(){}
};
class CChild : public CParent {
int* m_lpnData;
public:
CChild(int nSize =0) : CParent(nSize), m_lpnData(new int [nSize]){}
~CChild(){ delete [] m_lpnData; }
};
int main() {
CParent* p =new CChild(10);
delete p;
return 0;
}

このようにするとpがCParentのポインタのためCChildのデストラクタが呼ばれないのはわかります。
しかし、ここでCParentのデストラクタにvirtualを付加すると、なぜCChildのデストラクタから適切に
呼ばれるのでしょうか。
virutalは派生クラスで関数をオーバーライドするときに使うものだと理解しています。
関数がオーバーライドされている場合は、ポインタが基底クラスのものでも実行時型が
派生クラスのものであれば、派生クラスのオーバーライドした関数が呼ばれるのはわかります。
しかし、関数をオーバーライドしていない場合は基底クラスの関数が呼ばれると思います。
このコードの場合、派生クラスでは基底クラスのデストラクタをオーバーライドしているわけではないですし、
デストラクタの名前ももちろん違うのに、なぜCChildのデストラクタが呼ばれるのでしょうか?

672 :671:04/05/25 15:57
結局こんな風になるのではないかと考えてしまっています。

@delete p; が実行される。
ApはCParentのポインタなので、~CParent()を実行しに行く。
Bpの指す実行時型はCChildなので、CChildに~CParent()がオーバーライドされてないか見に行く。
CCChildにオーバーライドされた~CParent()が見つからないので、CParentの~CParent()を実行する。

673 :デフォルトの名無しさん:04/05/25 16:12
>>671
関数のオーバーライドと同じだ。

674 :デフォルトの名無しさん:04/05/25 16:15
エンジン作りはトヨタには無理だな

675 :671:04/05/25 16:29
>>673
関数のオーバーライドは
名前も返り値も引数も同じ関数が必要なんじゃないですか?

676 :デフォルトの名無しさん:04/05/25 16:32
デストラクタは関数じゃないし。

677 :デフォルトの名無しさん:04/05/25 16:39
>>671
仮想デストラクタにするということは、デストラクタのポインタを持つということだ。
だから、delete p で、CParentのデストラクタではなく、ポインタが指すデストラクタ、
すなわちCChildのデストラクタが呼び出される。
仮想デストラクタになってなければ、delete pはCParentのデストラクタしか呼べない。
わかった?

678 :671:04/05/25 18:45
>>676
デストラクタはインスタンスが開放されるときに呼ばれる
関数と本などには書いてありましたよ

>>677
ではポインタの指す実行時型のデストラクタから呼びに行くというのは
deleteの仕様ということになるのでしょうか?
なんとなくわかりました

679 :デフォルトの名無しさん:04/05/25 18:46
ほんとにC知らなくてもC++できるの?

680 :デフォルトの名無しさん:04/05/25 18:56
>>678
うーん、本当にわかったのかなぁ。
deleteの仕様云々は関係ないんだけどな。結果的にそれはdeleteのときに起こるわけだけど。
デストラクタが呼ばれる、それは仮想か否かという、極めてシンプルな話なんだよな。

>>679
Cを知らなくてもC++を習得することは出来る。

681 :デフォルトの名無しさん:04/05/25 19:14
>>679
俺はCを飛ばして一気にC++に行ったよ。
しかもPerlから。

682 :デフォルトの名無しさん:04/05/25 19:20
>>679
それって昔からある議論だね。たしかにC++からでもOKだが、
昔は多くのC++書籍がCの知識前提のような書き方だったからなぁ。
Cの標準ライブラリは使うことあるんじゃないかな。
それぐらい覚えれば大丈夫か?

683 :デフォルトの名無しさん:04/05/25 19:29
>>682
裏を返せば、入門書の問題ってことでしょ。
Cの標準ライブラリも「使える」というだけで、使う必要はない。
はっきり言って、目標がC++なら、Cから覚えるのは遠回り。
ちょっとした練習プログラムだって、わざわざprintf使うより、
いきなり coutでいいでしょ。scanfにいたっては、勘弁してよ状態だし。

684 :デフォルトの名無しさん:04/05/25 20:08
その後、どう説明すればわかりやすいか、いろいろ考えてみた。

>ではポインタの指す実行時型のデストラクタから呼びに行くというのは

いやいや、pがCParentのポインタである以上、あくまでCParentのデストラクタを呼び出そうとする。
ところが、CParentのデストラクタを仮想にしておくと、デストラクタのありかはインスタンスをみてね、となるわけ。
で、みてみると、pが指していたのは実はCChildクラスのインスタンスだったので、
なんとCChildのデストラクタを指しているわけですよ。

さて、ここで基本的な前提知識として、CChildはCParentの派生クラスなので、CChildのデストラクタは、
CParentのデストラクタを呼び出します。これは仮想にしてるかどうかとは関係の無い話。

めでたしめでたし。

685 :デフォルトの名無しさん:04/05/25 20:18
Cの標準使わないって、assertとかmath系とか
C++の機能にあるんでしょうか?

686 :デフォルトの名無しさん:04/05/25 20:24
>>685
ライブラリに機能もへったくれもないが。
>>683の揚げ足取りですか? だからといって、「Cから学べ」にはならんでしょ。
if文はCの機能だから〜、なんて言う奴いないよね。

687 :デフォルトの名無しさん:04/05/25 21:09
>>681
ナカーマ。

688 :デフォルトの名無しさん:04/05/25 21:33
>>686
別に揚げ足取りというわけではないが、Cから学ぶ学ばないに
対してではなく、C標準ライブラリを使う必要はないと
きっぱり言ってることに対して、聞いただけ。自分はC++
標準ライブラリ、まだよく把握してないんで。

689 :デフォルトの名無しさん:04/05/25 22:14
>scanfにいたっては、勘弁してよ状態だし。
まともなCプログラマはscanfなんて使わない。

690 :デフォルトの名無しさん:04/05/25 23:18
素人Cプログラマはscanfなんて使えない。

691 :デフォルトの名無しさん:04/05/25 23:21
関数をブランドで判断してるテキトー野郎にプロもアマもないだろ

692 :デフォルトの名無しさん:04/05/25 23:22
特にこの板でまともな批判ができた香具師は皆無

693 :デフォルトの名無しさん:04/05/25 23:56
>>688
そうだよなあ、

 全 く

必要ないと、断言できるのかできないのか
俺様もぜひ拝聴してみたいものだ (ケケケ

694 :デフォルトの名無しさん:04/05/26 00:02
こっちにも現れたのか。

695 :デフォルトの名無しさん:04/05/26 00:06
結論:VC++でコンパイルできればなんでもいい。

696 :デフォルトの名無しさん:04/05/26 02:01
>>695
うむ。

697 :デフォルトの名無しさん:04/05/26 02:08
g++ -ansi -pedantic -Wall
で警告もエラーもでなければなんでもいい。

698 :デフォルトの名無しさん:04/05/26 03:45
オメコウィルス作りたいんですが

699 :デフォルトの名無しさん:04/05/26 13:02
非常に簡単なソフトでプラグイン対応のものを実装したいのですが,
プラグイン対応のソフトを実装する為に有用な資料等を御存知ありませんか?

現在はDLLを追加する度に,ソフト本体に修正を加える必要があります.
これを設計から見直して,プラグイン形式とゆーか本体には一切修正を加えずに機能拡張をしたいのです.


700 :デフォルトの名無しさん:04/05/26 13:24
>>699
SPI_API.TXTは?


701 :デフォルトの名無しさん:04/05/26 13:38
例えばアーカイバとかなら、まずDLLをロードする。
そのDLL内の決まった名前の関数で、対象のファイルが
自分のサポートしている形式かをチェック。
サポートしてなければ次のDLLを読み込んで、
そのDLL内の同じ名前の関数でチェック。
サポートしてるDLLが見付かれば、そいつで圧縮とか展開とか。
DLLの検索方法は決まったフォルダ内のDLLを全検索とか、
特別にそれ用に決めた拡張子を使って判別するとか。
って辺りが単純な方法。

702 :699:04/05/26 14:32
>>700
DLL側の知識も重要ですが,如何せん私にはレベルが高すぎました…

>>701
なるほど.
分かり易い説明,有難う御座います.

ところでDLLを用いた拡張コンポーネントと,ネットワークによる分散は共存可能なものでしょうか?
具体的にはDLLにて拡張コンポーネントを読み込み,実行はネットワーク上の別の計算機で行う状況です.
また(実現の可能性は取り敢えず考えずに)ネットワーク上のDLLを読み込んで,分散処理といった処理は可能なのでしょうか?

DLLの動的なロードはなんとかなりそうですが,前述の分散に関しては検索キーワードが思いつきません…
御力をもう少し貸して頂けませんか?


703 :デフォルトの名無しさん:04/05/26 15:11
単にコードがどこにあるか、というだけの問題じゃないか?

704 :デフォルトの名無しさん:04/05/26 15:14
自作板絡みだけど、なんか面白いコードが出てたので貼り。
unionのこの使い方、どうなんですか?

void swap (unsigned char *c);
int main(int argc, char* argv[])
{
 static union{
 unsigned short iPort;
 union {
  unsigned char cPort[2];
  };
 };
 iPort=0xFFEE;
 printf("[変換前:%X:" ,iPort);
 swap(cPort);
 printf( "変換後:%X%X]\n",cPort[0],cPort[1]);
 return (0);
}

void swap (unsigned char *c){
 unsigned char tmp;
 tmp = c[0];
 c[0] = c[1];
 c[1] = tmp;
}

705 :デフォルトの名無しさん:04/05/26 15:16
RPC/RMI的なことをやりたいんだとは思うが、お前の力量じゃ無理だからやめとけったほうがいいか?
それ以前にDLLだのはいい加減スレ違いなんだが。

706 :デフォルトの名無しさん:04/05/26 15:19
Linuxでマルチスレッドアプリケーションを作ってるんだけど、
なんか途中でプロセスが死ぬ。
しかも何も出力されないから原因がわからないし、
どのスレッドがエラーしてるのかもわからない。

こういう時ってなんかうまくデバッグする方法ない?



707 :デフォルトの名無しさん:04/05/26 15:21
>>704
htons/ntohs?

708 :デフォルトの名無しさん:04/05/26 15:46
>>704,707
実はネットワーク系ライブラリ関数のhtons()等より、
直接バイトシフトしたマクロやインライン関数の方が実行速度が速かったりする。
是非、お試しあれ。

709 :デフォルトの名無しさん:04/05/26 15:46
>>704
無名 union 変数か・・・alias みたいな感じ。
ファイルやバイト列等のバイナリのデータをパースして適切なな型に変換して、
ってときに型変換オペレータを省略できるね。


710 :デフォルトの名無しさん:04/05/26 15:49
>>706
coreは出てないの?

711 :デフォルトの名無しさん:04/05/26 15:55
>>706
とりあえずgdb使え。話はそれからだ。

712 :デフォルトの名無しさん:04/05/26 15:58
>>706
ない。
マルチスレッドプログラムを対話デバッグしようとする行為自体が無謀&無駄。

>>710の指摘しているように、coreからあぼーと位置を特定することは出来るけど、
結局は場当たり的な解析になりがち。
この問題が解決しても、いずれ他にあぼーとされる箇所が現れることでしょう。
多くの開発者は自前のトレース関数・トレースマクロを使ってトレースしている。
素直に通常のデバッグをあきらめて、トレース出力関数の作成に勤しんだ方が建設的だと思うね。

713 :712:04/05/26 16:00
>>711
釣りはヤメレ(w

714 :デフォルトの名無しさん:04/05/26 16:01
>>704
union {
  unsigned char cPort[2];
  };
これの意味がわからんのだが、どういう意味があるの?

715 :699:04/05/26 16:04
>>703
確かに.

>>705
そうですね,RMI,Horb的な感じです.
スレ違いですか,申し訳ない.

いろいろと有難う御座いました.


716 :デフォルトの名無しさん:04/05/26 17:23
CUIでテトリスを作ってるんですが
ブロックが動くたびに新しい画面を改ページで再描写していると
プレイが長引くと画面がスクロールしまくってDOS画面が
重くなりそうで心配です。
CUIで一旦表示した画面(文字をならべて作った二元配列)を
一旦消してその場に新しい画面を再描写する方法はないでしょうか
TELNETのCUI上で普通にアニメーションしているテトリスを
むかしやったことがあるのですが、いったいどうやってるんでしょうかね

717 :デフォルトの名無しさん:04/05/26 17:28
OSと処理系はなんだ?

718 :デフォルトの名無しさん:04/05/26 17:32
>>716
完全にスレ違いじゃないか。

719 :デフォルトの名無しさん:04/05/26 17:38
>>716
エスケープシーケンスとかで変更部分だけ書き換えれば良い。
テトリスなら、変更部分はほとんど矩形とみなせるので楽だろう。

つーかここはC++相談室ですぜ、旦那。

720 :デフォルトの名無しさん:04/05/26 17:42
コンストラクタで例えば

MyClass::MyClass():
my_int(10),my_int(20)
{
}

なんていうメンバ変数の初期化の仕方ってどうよ?
こんな書き方していいっていう本見たことないんだが。

721 :デフォルトの名無しさん:04/05/26 17:45
VC++をコンパイラに使って、簡単な実験プログラムをMFC使用せずに
ネットのソースや猫でもわかるを見て試行錯誤してるのですが。
現在作ろうとしてるのが初めてDialogをメインでCreateWindowなどを使わない方法なのですが、
どうもDialogリソースにクラス名を入れると起動後すぐに終了したり、
WM_KEYUPなどのウィンドウメッセージが反応しないなどの壁にぶつかってます。
特に後者はどのようにしたら解決出来るでしょうか?WM_COMMANDなどは正常に反応します。

Window生成したソースだとちゃんとWM_KEYUPなど動いてくれます。
いまいち生成されたWindowとリソースエディタで作ったDialogの違いが分かってないようです。
Dialogを、この生成されたWindowのようには扱えないのでしょうか。
どうかご教授よろしくお願いします。

722 :デフォルトの名無しさん:04/05/26 17:46
MFC専用スレGirl

723 :デフォルトの名無しさん:04/05/26 17:52
>>720
そりゃ、持ってる本が悪い。
そう書くべきなのだ。

724 :デフォルトの名無しさん:04/05/26 17:54
>>720
Effective C++ 買え

725 :720:04/05/26 17:56
>>723 , >>724
そうか。そうだったのか。オレが悪かった。
EffectiveC++持ってるけど、ちょっとしか読んでない。

726 :デフォルトの名無しさん:04/05/26 18:06
>>704
C++だとこの記述でもインスタンス出来るんでしょうか?

727 :デフォルトの名無しさん:04/05/26 21:20
>>726
はじめて知ったけど、無問題らしい。
http://black.sakura.ne.jp/~third/programming/cpp/cpp44.html


728 :デフォルトの名無しさん:04/05/26 21:25
>>727
ちょっと待てよ、初めて知ったって・・・。
C++を勉強してなかったのか?
URL示してまで答えるほどのことでもないぞ。

729 :デフォルトの名無しさん:04/05/26 21:27
つーか、見辛いだけで使う必要が無い。

730 :デフォルトの名無しさん:04/05/26 21:27
最適化で実行時にメモリ上に存在しなくなるのか?ということを
きいているのではないの

731 :デフォルトの名無しさん:04/05/26 22:05
>>729 同意
無名共用体の用途が全然わからない。

>>730
参照がなければコンパイラによって消え去ってしまうよう運命にあるような。


732 :デフォルトの名無しさん:04/05/26 22:17
>>731
全然わからないなどと開き直るな。
教えてくださいと言え。

733 :デフォルトの名無しさん:04/05/26 22:19
教えて下さい。おながいします。m(_ _)m

734 :731:04/05/26 23:22
>>732
だれがお前ごときに教えを乞うかよ。ボケ。だまってろ。
ぶち殺されたいか?

735 :デフォルトの名無しさん:04/05/27 00:11
>>734
通報しますた

736 :デフォルトの名無しさん:04/05/27 00:29
>>734
なんだ、おまいも使い道わからんのじゃないか(w

737 :デフォルトの名無しさん:04/05/27 00:32
>>732-736 自演ご苦労

738 :デフォルトの名無しさん:04/05/27 01:00
>>723
>そう書くべきなのだ。

え?
コンストラクタが複数種ある場合など、
いちいちあのようなメンバ変数初期化コードを書くのはウザイと思うなぁ。

739 :デフォルトの名無しさん:04/05/27 01:04
>>738
代入ならウザくないのか?
値を設定しないのも問題外だろ。

740 :デフォルトの名無しさん:04/05/27 01:07
初期化→代入が気にならない、参照メンバが無いとかなら気にする必要は無いけど
普通は>>723 の通りにすべきだろ。

741 :721:04/05/27 01:31
>>722
MFCを「使用せずに」とのことですけど。。

742 :デフォルトの名無しさん:04/05/27 01:51
Win32質問箱

743 :721:04/05/27 02:02
ありがとうございます。そちらで移動させていただきます。m(_ _)m

744 :デフォルトの名無しさん:04/05/27 02:46
my_intを二回初期化して何が嬉しいのか分からん。

>>739
代入だと、init( void )を一発書いておいて、複数のコンストラクタから呼べばいいよね?

745 :デフォルトの名無しさん:04/05/27 02:52
>>744
EffectiveC++嫁

746 :デフォルトの名無しさん:04/05/27 03:03
何章?


747 :デフォルトの名無しさん:04/05/27 03:04
>>745
EffectiveC++読んだことあるけど、
コンストラクタ内での代入が駄目だって記述とかあったか?

748 :デフォルトの名無しさん:04/05/27 03:11
>>747
お前はバカかアホのどっちかだ。どうせ読んだの表紙だけだろ。
http://www.google.com/search?hl=ja&ie=UTF-8&safe=off&q=Effective+C%2B%2B+%E4%BB%A3%E5%85%A5%E3%82%88%E3%82%8A%E3%82%82%E5%88%9D%E6%9C%9F%E5%8C%96%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


749 :744:04/05/27 03:20
書き方が悪かったが、俺は初期化派ね。コンストラクタで代入などせんよ。

んな事より、my_intを2回初期化しているのに突っ込みが無いのは何で?

750 :デフォルトの名無しさん:04/05/27 03:22
単に初期化子の例を挙げたかっただけだろ。
それくらい読み取れ。

751 :デフォルトの名無しさん:04/05/27 07:59
コンストラクタに初期化子があるなら、
デストラクタにも同様の状態があるべきだ。

あれ、デストラクタ呼び出し中って仮想関数どうなるんだっけ

752 :デフォルトの名無しさん:04/05/27 10:01
初期化子なしでコンストラクタで代入すると
先にデフォルトコンストラクタが呼ばれてから
代入演算子が呼ばれるので無駄。
代入でも問題ないのはPODときぐらいだな。

753 :706:04/05/27 10:46
>>710,>>711,>>712
coreファイル吐かないし、gdb使ったら挙動が変わったよママン。
素直にトレースしてみた。おまいらありがとう。

754 :デフォルトの名無しさん:04/05/27 10:47
>>749
それに突っ込まなかったのは、単なるtypoだと思ったから。
どうせエラーになるんじゃないか? 試してないから知らんけど。
問題の本質は初期化の仕方だしな。

755 :デフォルトの名無しさん:04/05/27 10:52
>>751
何が言いたいのか、何を聞きたいのかわかりません。
デストラクタの働きをご存知ないような書き方に見えますが。

756 :デフォルトの名無しさん:04/05/27 10:58
おっさんのジョークだと思われます

757 :720:04/05/27 11:01
>>754
その通りです。おれが悪かった。正しくは

MyClass::MyClass():
my_inta(10),my_intb(20)
{
}

758 :744:04/05/27 11:27
そんなにいぢめないでくれ。
初期化子の書き方知らないなんて思いもしないから、
「こんな書き方」っていうのがtypoじゃないって思ったんだよ…orz

759 :デフォルトの名無しさん:04/05/27 12:12
boost::mplつかうと一気に実行ファイルサイズが10倍に?!

mplつかってたら、不自然にexeのサイズが大きくなる。
アセンブラで追っかけても確かにコードは最適化で正しく消えている。
どうやら、mplで組み合わせたクラスにvirtual関数が含まれている為、
type_info用(?)のやたら長いクラス名(200文字)が組み合わされた分だけ
exeに含まれた模様。

type_info使ってないんだから最適化してよ...orz

760 :デフォルトの名無しさん:04/05/27 12:43
RTTIをoffにすればいい

761 :759:04/05/27 13:21
dynamic_castは使いたいんだよう。


762 :デフォルトの名無しさん:04/05/27 13:48
じゃあ、内部でtype_info使われてるんだからあきらめろ

763 :671:04/05/27 17:29
>>684
遅レスになりましたが
はっきりわかりました
ありがとうございます

764 :デフォルトの名無しさん:04/05/27 18:00
>>720の書き方で配列の初期化はどう書くの?


765 :デフォルトの名無しさん:04/05/27 18:38
仮想基底クラスと非仮想基底クラス
を継承したときの
アップキャストとダウンキャストは
どういう風に実行されるのですか?

なぜ仮想基底クラスからダウンキャストは
できないのでしょうか?

766 :デフォルトの名無しさん:04/05/27 19:52
多重継承を使わない(ようにしている)から知らないなぁ。
仮想関数や仮想デストラクタと同じく、基底クラスをポインタで持っているんだろうと推測してみる。
スレ汚し、スマン。

767 :デフォルトの名無しさん:04/05/27 19:59
>>765
>なぜ仮想基底クラスからダウンキャストは
>できないのでしょうか?

dynamic_castでできるよ
制限あるけど、それは仮想継承とは無関係

768 :デフォルトの名無しさん:04/05/27 20:08
int len = 1;
char* a = new char[len+1];
ZeroMemory(a,len+1);

std::string str = a;

delete[] a;

これを実行したらdelete[] aで落ちます。
stringはaの内容のコピーを持っているだけではないのですか?

769 :デフォルトの名無しさん:04/05/27 20:09
落ちませんが何か?

770 :768:04/05/27 20:15
気付きました。
ZeroMemory(&a,len +1)とやっていました。
すみません。


771 :学生:04/05/27 23:36
フリーで使いやすいコンパイラあったら教えてください。

772 :デフォルトの名無しさん:04/05/27 23:44
>>771
そんな都合のいいものはありません。

773 :デフォルトの名無しさん:04/05/28 00:51
>>759
mplの中でvirtual使ってるクラスなんて見当たらないんですが、
問題の再現するサンプルコードかなんか、出してもらえますか?

774 :デフォルトの名無しさん:04/05/28 03:49
>>771
g++では不満なのか?


775 :学生:04/05/28 06:49
それなんて読むんですか?
じー足す足す?

776 :デフォルトの名無しさん:04/05/28 06:53
>>767
なんでtypeidで型を調べながらプログラムすればいいのにそうしないんでしょう?

777 :デフォルトの名無しさん:04/05/28 08:27
>>775
ゲ・ペラ・ペラ です。

778 :デフォルトの名無しさん:04/05/28 08:38
グッピッピ

ちなみにGCCはグッシッシ

779 :759:04/05/28 09:51
>>773
mplに含まれているのではなく、タイプリストから生成する
多重継承クラスのベースがvirtualを含むという意味。
作っているのがtemplateライブラリなのでsrc単位で
RTTIをoffにもできずお手上げです。しょうがないので、
多重継承クラスの変わりにタプルを生成して、関数ポインタ
で代用した。

mpl使うと基本的に型名が長くなるので、基本的にはvirtualを
絡ませるような使い方は厳しいような気がします。type_info
の実装にもよるんでしょうけど。

780 :デフォルトの名無しさん:04/05/28 10:07
>>767
では継承は全部仮想継承にしても問題ないように思うんですが
なぜそれは駄目なんでしょう。その理由がダウンキャストができなくなるから
と聞いたのですが。

781 :デフォルトの名無しさん:04/05/28 10:22
>>780
http://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/

ピンポイントで引用すると、
「仮想継承は、単一継承や多重継承よりも、インプリメントと使用のコストが格段に高くなります。」

782 :デフォルトの名無しさん:04/05/28 10:29
>>764
メンバ変数として配列を持つと、それを初期化するコードは書けません。
C++の仕様の穴というか、まぁC++では配列を(なるべく)使うなってことだ。
C++っぽい機能と配列を一緒に使うと、不思議なことが起こったりするから、
素人にはお勧めできない。

783 :デフォルトの名無しさん:04/05/28 10:34
>>782
>C++っぽい機能と配列を一緒に使うと、不思議なことが起こったりするから

思い当たる節がないのですが。
具体例をあげてみて下さいな。

784 :デフォルトの名無しさん:04/05/28 10:55
>>782
その発言がいかにも素人。

785 :デフォルトの名無しさん:04/05/28 11:01
>>783
派生クラスの配列を、基底クラスの配列(というかポインタ)を引数にとる関数に渡せちゃったりとか。
templateを使ったMPっぽいことをすると、配列が使えなかったりとか。

786 :デフォルトの名無しさん:04/05/28 11:09
>>782
コンストラクタから配列初期化用のメンバ関数を呼ぶのではだめなん?

787 :デフォルトの名無しさん:04/05/28 11:53
>>786
意味的には初期化だろうけど文法的には代入なので、POD以外の場合にオーバーヘッドがかかる。
constメンバだとconst_castする以外に手はない。

788 :デフォルトの名無しさん:04/05/28 12:36
constならばstatic constにすればいいじゃないか。

789 :780:04/05/28 13:00
>>781
そこを読むと計算コストが増してしまうことはわかるのですが
継承の機能が制限されることはないのでしょうか?
憂鬱なプログラマのためのオブジェクト指向開発講座
という書籍の中には

仮想基底クラスを使うと副作用が発生します。
それは残念ながら、速度が遅くなるとか、サイズが大きくなるとかいう
レベルの問題ではなく、継承というメカニズムが持っている性質そのものを
スポイルしてしまいます。ここでは具体的に説明しませんが
ダウンキャストが困難になります。

というようなことが書いてあるのですが、これは
どのように解釈したらいいでしょうか

790 :デフォルトの名無しさん:04/05/28 13:16
>>788
はて?

791 :デフォルトの名無しさん:04/05/28 13:31
>>789
その書籍、古くないですか?
dynamic_castとRTTI登場以前とか。

792 :デフォルトの名無しさん:04/05/28 13:32
仮想基底クラスって純粋仮想関数持ってるクラスのことだっけ?

793 :デフォルトの名無しさん:04/05/28 13:42
>>792
ちゃうちゃう。多重継承時におじいちゃんが独りになるようにする奴。

794 :デフォルトの名無しさん:04/05/28 13:45
仮想継承した場合の基底クラスのことだと思ったけど。

795 :デフォルトの名無しさん:04/05/28 14:05
>>791
仮想基底クラスの場合って
アップキャストするとポインタをたどって
基底クラスそのものになってしまって
そのあとダウンキャストしようとしても
派生クラスの情報はどこにもなくて
ダウンキャストできないってなるんじゃないですか?
dynamic_castも必ず失敗するのでは?

違いますかね
自信はあまりないんですけど



796 :デフォルトの名無しさん:04/05/28 14:11
使うなこんな危なくていろんなものに依存しまくりなものを。

797 :デフォルトの名無しさん:04/05/28 14:14
>>795
杞憂・誤解・妄想
少しはググって勉強しれ。

798 :デフォルトの名無しさん:04/05/28 14:15
「憂プロ」が言ってるのは、菱形継承時の実行時曖昧検出のことかいな?
禿本の15.4.2 引用/説明はちと面倒なのでパス(w 禿本持ってたら見てみて。

799 :デフォルトの名無しさん:04/05/28 14:16
>>796
なんだか解らないから使わないのと、いろいろ解ってるから使わないのとではかなり違う。
あんたの書き込みは、ただ単に馬鹿っぽい。

800 :デフォルトの名無しさん:04/05/28 14:29
>795
いわゆるvptrが指すvtblが、まさに派生クラスの情報だろ。

801 :デフォルトの名無しさん:04/05/28 14:58
>799
きいたふうな言葉を使うな若造

802 :デフォルトの名無しさん:04/05/28 14:58
>>795
RTTI や仮想基底クラスの無い時代の多重継承でアップキャストした場合にはそうなります
(どっち側からアップキャストしたのか、プログラマ(ム)が覚えておかなきゃならない)。

仮想基底クラスの場合は dynamic_cast でRTTI 使って適切にオフセットしてくれます。

803 :デフォルトの名無しさん:04/05/28 15:07
>>801
それを796に言ってやらないのは、あんたが796だからか?(w
今の話題についていけないなら、黙ってな。

804 :デフォルトの名無しさん:04/05/28 15:22
ついていきたくないので黙ってます。

805 :デフォルトの名無しさん:04/05/28 15:33
ワロタ

806 :デフォルトの名無しさん:04/05/28 15:48
そんなに頭を痛めてまで得られるものって何なの?もっと楽に生きれば?

807 :デフォルトの名無しさん:04/05/28 15:52
頭痛めないと理解できないんですね、
それならC++を捨てるのが得策だと思いますが。

808 :デフォルトの名無しさん:04/05/28 16:33
いいじゃん、釣りとネタなんだから。
今悩んでるのは >>795 だけでしょ。

809 :デフォルトの名無しさん:04/05/28 17:57
多重継承なんか使う奴は莫迦です。

…とまでは言わないが、
「雪山を無礼るな!万全の体制を整えるんだ!」
とか言って連れて行かれそうになったら
「そもそも、そうまでしてその山を越える必要が本当にあるんですか?」
くらいは聞くかもなあ。

810 :デフォルトの名無しさん:04/05/28 18:01
ほんとプログラマって例え話好きだよなぁ。

811 :デフォルトの名無しさん:04/05/28 18:05
>>810
論理的同一性と家

812 :780:04/05/28 18:14
「憂鬱な・・・」は1998年5月30日に初版発行
そして「独習C++改訂版」は1999年4月30日に初版発行で
独習C++にはdynamic_castがすでにのっているので
1998年6月以降にdynamic_castが出てきており
「憂鬱な・・・」の情報は古いってことでいいのでしょうか?

結論としては仮想継承は計算コストが増大すること以外は
通常の継承と変わりないってことでいいでしょうか?

813 :780:04/05/28 18:21
>>800
vptrがあるのは仮想継承でできた派生クラスで
継承されたほうの基底クラスにはないですよね?
念のため確認

814 :780:04/05/28 19:22
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp;
Father *fap, fa;
Mother *mop, mo;
Child ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
fap = &ch; cout << typeid(*fap).name() << endl;
mop = &ch; cout << typeid(*mop).name() << endl;

return 0;
}

これを実行すると
GrandParent
GrandParent
GrandParent
Father
Mother
となりました。 RTTIが派生クラスのものになってくれません。

815 :デフォルトの名無しさん:04/05/28 19:29
>>814
当たり前だろ。仮想基底クラスであるGrandParentはそこから派生したクラスの
情報など持ってない。

816 :デフォルトの名無しさん:04/05/28 19:33
>>814
GrandParentに仮想関数(デストラクタでヲケ)を追加してみ。

817 :デフォルトの名無しさん:04/05/28 19:43
>>814
RTTIを使うには仮想関数が必要。
つーか基底クラスとして使うクラスのデストラクタは仮想にするのが大原則だから覚えておき。

818 :デフォルトの名無しさん:04/05/28 20:04
近親相姦かよ。

819 :デフォルトの名無しさん:04/05/28 20:12
>>818
それを避けるためのvirtual。
実の親ではなく義理の親。だから兄妹に血のつながりは無いのでOK。

820 :デフォルトの名無しさん:04/05/28 20:22
>813
基底クラスの(隠し)メンバでなければ、
基底クラスのポインタからアクセスできんだろうが。

>819
もしかして笑うところ? 意味が解らないのだが。

821 :デフォルトの名無しさん:04/05/28 20:34
>>817
1行目がまっとうな理解
2行目はアフォの頭の中

822 :デフォルトの名無しさん:04/05/28 20:50
>>821
> 2行目はアフォの頭の中
私817じゃないけど何で?
private継承,protected継承はなしよ.


823 :デフォルトの名無しさん:04/05/28 21:03
>>822
まさかお前は基底クラスとして使うクラスのデストラクタは全部仮想にしてるのか?

824 :デフォルトの名無しさん:04/05/28 21:03
>>822
全然関係ないぞ??

>>*
struct V
{
int vm;
virtual ~V() {}
};
struct A : public virtual V { int am; };
struct B : private virtual V { int bm; };
struct C : public A, public B { int cm; };

int main()
{
C c;

V* pv;
pv = &c;
cout << pv << endl;

B* pb;
pb = dynamic_cast<C*>(pv); // これ、どう思う?
cout << pb << endl;

return 0;
}

825 :デフォルトの名無しさん:04/05/28 21:09
>>823
822 じゃないが、原則として公開継承する基底クラスのデストラクタは仮想に
するだろう。そうでないとアップキャストしたら大惨事確定だし。

826 :デフォルトの名無しさん:04/05/28 21:10
デストラクタがvirtualじゃないと困るのはポリモフったポインタをdeleteするときだったはず

827 :デフォルトの名無しさん:04/05/28 21:10
>>823
822 じゃないが、原則として公開継承する基底クラスのデストラクタは仮想に
するだろう。そうでないとアップキャストしたら大惨事確定だし。

828 :デフォルトの名無しさん:04/05/28 21:52
>>827
>原則として公開継承する基底クラスのデストラクタは仮想に
>するだろう。

繰り返さなくていいよ。
だからしないってば。

>そうでないとアップキャストしたら大惨事確定だし。

んなわけない。アップキャストしただけで大惨事ってなんだよ?

829 :780:04/05/28 22:10
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ public: virtual ~GrandParent(){} };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp; Father *fap, fa; Mother *mop, mo; Child *chp, ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
fap = dynamic_cast<Father *>(gpp); if(fap)cout << typeid(*fap).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
mop = dynamic_cast<Mother *>(gpp); if(mop) cout << typeid(*mop).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
chp = dynamic_cast<Child *>(gpp); if(chp) cout << typeid(*chp).name() << endl;

return 0;
}
結果
class Father
class Father
class Mother
class Mother
class Child
class Child

GrandParentに仮想デストラクタを追加した結果うまくいきました。
教えてくれた皆さんありがとうございました。

830 :780:04/05/28 22:08
#include <iostream.h>
#include <typeinfo.h>

class GrandParent{ public: virtual ~GrandParent(){} };
class Father : virtual public GrandParent{ };
class Mother : virtual public GrandParent{ };
class Child : public Father, public Mother{ };

int main()
{
GrandParent *gpp; Father *fap, fa; Mother *mop, mo; Child *chp, ch;

gpp = &fa; cout << typeid(*gpp).name() << endl;
fap = dynamic_cast<Father *>(gpp); if(fap)cout << typeid(*fap).name() << endl;
gpp = &mo; cout << typeid(*gpp).name() << endl;
mop = dynamic_cast<Mother *>(gpp); if(mop) cout << typeid(*mop).name() << endl;
gpp = &ch; cout << typeid(*gpp).name() << endl;
chp = dynamic_cast<Child *>(gpp); if(chp) cout << typeid(*chp).name() << endl;

return 0;
}
結果
class Father
class Father
class Mother
class Mother
class Child
class Child

GrandParentに仮想デストラクタを追加した結果うまくいきました。
教えてくれた皆さんありがとうございました。

831 :デフォルトの名無しさん:04/05/28 23:09
>>828
struct Deriv : public Base {};
struct Base* p = new Deriv;

これでアウトでしょ。こういう使い方をしないのであれば、そもそも
継承ではなくコンポジションにしいた方が良いと思われ。

832 :デフォルトの名無しさん:04/05/28 23:11
>>831
deleteしないアフォはどうしましょうか?

833 :デフォルトの名無しさん:04/05/28 23:19
禅問答みたいだな

834 :デフォルトの名無しさん:04/05/28 23:22
>>832
どうせ、そやつのプログラムはぬるぽだろう。ほっとく。

835 :デフォルトの名無しさん:04/05/28 23:32
>>831
>こういう使い方をしないのであれば、そもそも
>継承ではなくコンポジションにしいた方が良いと思われ

んなこたぁない。
少なくとも世の中に、んなこたぁない例がゴロゴロしてる。

836 :デフォルトの名無しさん:04/05/28 23:36
>>831
polymorphicに使いたいときはそうだ。
だが実装の手間を減らすために仮想関数を持たないクラスを
public継承することもある。
例えばboost::iterator_facadeとか。


837 :デフォルトの名無しさん:04/05/28 23:36
>>828
Effective C++ 14項 「基底クラスには仮想デストラクタを持たせよう」を参照せよ。
これは割と常識に近いものだと思っていたが……

838 :デフォルトの名無しさん:04/05/28 23:41
freeしない(自粛)はどうしましょうか?
void operator delete(void*)
{
/* no operation */
}


839 :デフォルトの名無しさん:04/05/28 23:43
>>837
そっくり返す。
見出しだけじゃなく、本文も熟読してくれよ。

840 :デフォルトの名無しさん:04/05/28 23:49
>>831
追加のデストラクタがいらないので、(ほんとうにそれだけなら)セーフ。

841 :デフォルトの名無しさん:04/05/29 00:30
>>836
あれはクラステンプレートだから話が違う。しかも第一引数に派生クラス型を渡し、
常に

1 その派生型に static_cast<> する形でアクセスする
2 あるいはイテレータが指している要素にアクセスする

いずれかを強制する形になっており、基底クラスにアップキャストして使うことを
想定してない。

反例として挙げるには、むしろ例外的なケースだと思うぞ。

842 :デフォルトの名無しさん:04/05/29 00:59
> 反例として挙げるには、むしろ例外的なケースだと思うぞ。

「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

843 :デフォルトの名無しさん:04/05/29 01:08
> 反例として挙げるには、むしろ例外的なケースだと思うぞ。

「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

844 :デフォルトの名無しさん:04/05/29 01:45
>>842
何があってもデストラクタは仮想にしろ、って主張するヤツもバカだが、
「RTTI 使えない→基底クラスとして使うクラスのデストラクタは仮想にする
のが原則」って話をしてるときに、文脈無視してクラステンプレートの
話持ってくるのもアレですぜ。

845 :デフォルトの名無しさん:04/05/29 07:48
>「例外的なケースだと思う」で却下されるんじゃぁ、どんな例だしても無駄だろうな。

繰り返さなくていいよ。
だから間違ってるんだってば。

841はなぜ例外に当たるのかちゃんと説明しているだろう。
理由も言わずに「誰かが言っていたから(boostがそうしてるから)」
だけじゃあ、話は進展しないって。

846 :822:04/05/29 09:08
話ふっといて,離れていたすまん.
>>823
> まさかお前は基底クラスとして使うクラスのデストラクタは全部仮想にしてるのか
Yes.私の意見は831と全く同じ.
836の「実装の手間を減らすために仮想関数を持たないクラスをpublic継承する」
ってのは気持は分かるけど,そういう時はpriavte継承かprotected継承にして,
usingを使って使用するメンバ関数を公開する方が,まだ良いと思う.

>>826
> デストラクタがvirtualじゃないと困るのはポリモフったポインタをdeleteするときだったはず
「ポリモフったポインタをdeleteしない」を自分と関わりのある全てのプログラマに守るよう徹底して廻るか,
そもそも「public継承はポリモフれて,基底のポインタからdeleteできる」のだから
デストラクタは常にvirtualにしておくか,の選択かと思うけど,私は後者だな.

1. vtableによる速度低下,サイズの増大が気になる.
2. usingするのさえ面倒臭いほどメンバ関数が多い.
3. 作ったクラスは自分だけで使うし,設計方針を2度と忘れない自信がある.
これらの条件が揃ったらデストラクタを仮想にしないと決断するかもしれない.


847 :デフォルトの名無しさん:04/05/29 10:04
C++のOOで細かいことぐちゃぐちゃ言うな。所詮クラシカルな仕様なんだよ。

848 :デフォルトの名無しさん:04/05/29 10:09
>>846
> 「ポリモフったポインタをdeleteしない」を自分と関わりのある全てのプログラマに守るよう徹底して廻るか,
選択肢としては、デストラクタを protected にするってのもアリ。いちおう。

849 :デフォルトの名無しさん:04/05/29 11:30
継承を推奨するクラスの場合
デストラクタ virtual
デストラクタ protected
このどちらかをしておくのが派生クラス作成者がヘボな場合でも
問題が起こりにくいクラスだろう。
ポイントは基底クラス作成者と派生クラス作成者の実力差を
カバーする必要があるか否かだと思う。ただ、俺は自分の間抜けさを
認識しているのでどちらかの手法を取る。

850 :822:04/05/29 11:34
>>848
問題.
「デストラクタを protected にする」ことで以下の(3),(4)を禁止したい.
デストラクタを protected にするのはどの階層か?
なお,(1),(2)は触らぬこと.

class GrandParent {};
class Parent: public GrandParent {};
class Child: public Parent {};
int main()
{
GrandParent gp; // <- (1)
Parent p; // <- (2)
Parent *pp (new Child ());
delete pp; // <- (3)
GrandParent *gpp (new Child ());
delete gpp; // <- (4)
return 0;
}


851 :デフォルトの名無しさん:04/05/29 12:08
何でこう「あらゆる場合にこの方法をとるべし」と捕らえる人が多いのかねぇ……

852 :デフォルトの名無しさん:04/05/29 12:15
ただなにかにケチをつけたいんだよ!!

853 :デフォルトの名無しさん:04/05/29 12:16
原則と言う単語の意味を理解してないからそのような感じを受けるだけだよ。
もちろん何事にも例外はあるが、一部の例外を持ち出して
「あらゆる場合」と揚げ足をでっち上げた上で、その揚げ足取りを取ってるんだもんな。
反発されて当然だっての。

854 :デフォルトの名無しさん:04/05/29 12:18
ケチをつけたいだけなんだけど、
#include <****.h>
に誰もつっこまないのはなぜ?


855 :822:04/05/29 12:22
>> 851
>何でこう「あらゆる場合にこの方法をとるべし」と捕らえる人が多いのかねぇ……
何でだろう? コードの再利用性を追求しているうちに,こうなっちゃたような気がする.
この場合はこう,あの場合はこう,っていちいち例外を考えるよりは....


856 :849!=848:04/05/29 12:22
>>850
まぁ落ち着け。>>848はそういう方法もあると提示しただけだろう。

君自身も>>850みたいな何でも来いクラスのGrandParentなんか
作らないタイプのプログラマなんでしょ?多分。

インターフェース、ポリシー、実装と分けて考えるのが吉。

857 :849:04/05/29 12:24
>>855を読んで気が変わった。
何でも来いクラスを作る人だったのな。ちょっとがっかり。
前言撤回。


858 :デフォルトの名無しさん:04/05/29 12:25
>>854
「その『役不足』の用法は間違っている」っていっつも書き込んでるの?

859 :デフォルトの名無しさん:04/05/29 12:30
>>858 >>853?

860 :デフォルトの名無しさん:04/05/29 12:33
>>インターフェース、ポリシー、実装と分けて考えるのが吉
この考えに沿った例と悪い例を提示していただけるとありがたいです。

861 :822:04/05/29 13:11
>>857
私のことはどうでもいいよ.
でも,がっかりされて私もがっかり.

850は書き方が高慢だった.すみません.


862 :デフォルトの名無しさん:04/05/29 14:33
>>860
例えばこんな風にやるといいと自分は理解している。
//ポリシー
struct NoisyShout{
protected:
void shout(){std::cout << "いていていて!" << std::endl;}
~NoisyShout(){}
};
struct DefaultShout{
protected:
void shout(){std::cout << "いてっ" << std::endl;}
~DefaultShout(){}
};

863 :デフォルトの名無しさん:04/05/29 14:34
>>862
続き
//インターフェース
struct Target{
virtual void hit() = 0;
virtual ~Target(){}
};
struct NullInterface{
protected:
~NullInterface(){}
};


864 :デフォルトの名無しさん:04/05/29 14:34
>>863
続き
//ポリシー、インターフェースを結合する実装
template<typename S, typename I>
class Man : public S, public I{
public:
void hit(){
std::cout << "なぐられたーっ" << std::endl;
S::shout();
}
//他にもいろいろ実装があるだろう...
~Man(){
std::cout << "Man::destructed" << std::endl;
}
};

865 :デフォルトの名無しさん:04/05/29 14:35
>>864
続き

使い方1。
std::cout << "# 一人ずつ殴るだけ" << std::endl;
Man<NoisyShout, NullInterface> young;
Man<DefaultShout, NullInterface> middle;
young.hit();
middle.hit();


866 :デフォルトの名無しさん:04/05/29 14:36
>>865
続き
使い方2。
std::cout << "# まとめてぶん殴る" << std::endl;
Target* targets[2];
targets[0] = new Man<NoisyShout, Target>;
targets[1] = new Man<DefaultShout, Target>;
for(Target** i = targets; i < targets + 2; ++i)
{(*i)->hit();}
for(Target** i = targets; i < targets + 2; ++i)
{delete (*i);}

867 :849:04/05/29 14:43
>>862-866
ここまで俺の書き込み。
インターフェースまでポリシーっぽく扱ったのはふさわしくないかもしれない。
実際のアプリ開発ではポリモーフィズムされるかされないか大抵決められる
はずなので、あそこまでやることは稀だと思う。
(凄く効率と汎用性を求めるクラスならやっても良いのではないだろうか。)
書いてしまったけど、叩かれないかビクビクしてる臆病者の俺…。

>>822
さっきは余計なことまで勢いで書いてしまった。
俺が勝手に期待しただけだ。悪かった。

868 :デフォルトの名無しさん:04/05/29 15:51
ここはEQの高いインターネッツですね。

869 :デフォルトの名無しさん:04/05/29 16:52
struct A
{
  virtual ~A(){};
  virtual void release()=0;
};
struct B: A
{
  virtual ~B()
  {
    cout << "~B" << endl;
    release();
  }
  virtual void release()
  {
    cout << "B::release" << endl;
  }
};
struct C: B
{
  virtual void release()
  {
    cout << "C::release" << endl;
  }
};
int main()
{
  B* p = new C;
  p->release();
  delete p;
  return 0;
}
C::releaseが呼ばれてほしいーーーーーーーー

870 :869:04/05/29 16:54
あ、deleteされたきも呼ばれてほしいって意味です

871 :デフォルトの名無しさん:04/05/29 16:57
だせえ言語だ

872 :デフォルトの名無しさん:04/05/29 17:24
ダサすぎ

873 :デフォルトの名無しさん:04/05/29 17:56
>>869
C::~C(){ release();}


874 :デフォルトの名無しさん:04/05/29 18:03
デストラクト中のオブジェクトの状態を理解していれば出ない疑問だな。

875 :デフォルトの名無しさん:04/05/29 18:07
>>873
あほ?それをしなきゃならんのがダサいんだろ

876 :デフォルトの名無しさん:04/05/29 18:10
>>875
だったらC::release()を呼び出したくない場合はどうするん?

877 :デフォルトの名無しさん:04/05/29 18:16
>>876
けいしょうしない

878 :デフォルトの名無しさん:04/05/29 18:26
ねんしょうけい

879 :デフォルトの名無しさん:04/05/29 21:40
みなさんBoost C++ Libraryって会社でも普通に使ってます?

うちのところではだれも導入してないです。
boostのライセンスみると商用利用でも全く問題ないのに。
顧客からboost使うなといわれてるわけでもない。

boostを使うとまずい場面ってあるんでしょうか?

本も出たことだし、利用を呼びかけてみようと思ってるんですが。
http://www.kmonos.net/pub/BoostBook/


880 :デフォルトの名無しさん:04/05/29 21:46
外に出すプログラムの場合、
boostのコードの品質管理も自社の基準で行わないといけないから
結局位置から作る方が手間が掛からないってのが大きいんじゃ?


881 :デフォルトの名無しさん:04/05/29 21:47
>>879
問題は商用が *禁止* されているかどうかじゃない
もちろん禁止されていれば使わないが

882 :デフォルトの名無しさん:04/05/29 21:47
>>879
その本、LAOXの書籍売り場の目立つところにディスプレイされてるね。
業者さんでつか?それとも著者?(プ

883 :デフォルトの名無しさん:04/05/29 21:49
>>880
その理屈からいくと、当然std::hogehogeなコードも全部作っているんですね?
boostはそこらの馬の骨が作ったものじゃないですよ。

884 :デフォルトの名無しさん:04/05/29 21:52
>>879
なきゃ書けないってものでもないし、元々使い方を知らなきゃ使う気にもならないでしょう。
導入してないところは、それだけのところでは?

885 :デフォルトの名無しさん:04/05/29 21:55
懐かしいなあ
使っていいものと、いけないもの
俺もなかなか憶えられなくて

886 :デフォルトの名無しさん:04/05/29 21:58
↓秀和のジサクジエン

887 :デフォルトの名無しさん:04/05/29 22:01
>>883
そうですよね。boostは信頼のできるライブラリです。

ただboostのバグを見つけた場合って勝手に直していいんでしょうか?

888 :デフォルトの名無しさん:04/05/29 22:02
888

889 :デフォルトの名無しさん:04/05/29 22:04
>>887
sourceforgeか開発MLに投げれ。

890 :デフォルトの名無しさん:04/05/29 22:05
>>887
なぜ聞く? 勝手に直せよ。改造したっていいんだぞ?
本当にバグを直したなら。コミュニティかここで発表すれば喜ばれるし、場合によっては神と呼ばれるかも知れないぞ。

891 :デフォルトの名無しさん:04/05/29 22:06
>>879
スマートポインタや lambda あたりは普通に使ってます。

>>887
良いんじゃないの? ただ、開発元に連絡しとくと、次のバージョンで修正が
取り入れられて(自分も含めて)幸せになれると思うけど。

892 :戦争はじまります:04/05/29 22:07
【国際】「資源独占の恐れ」日中境界海域にガス採掘施設、欧米企業も参加−中国★4
http://news13.2ch.net/test/read.cgi/newsplus/1085826910/

【中国】(資源独占の恐れ!) 日中境界海域に施設(日本は調査予定なし)★2 [05/28]
http://news17.2ch.net/test/read.cgi/news4plus/1085792271/

中国が尖閣諸島周辺の国境付近で資源採掘を開始ししだしました
ガス採掘施設となってますが、それだけではなく

ここにはなんと、 「世界2位の規模を誇る原油」 が眠っています

そしてほとんど日本の領土側に眠っている資源が
ジュースのストローで吸い上げられるように中国に持っていかれます。

 こっから採掘吸い上げ全部中国へ
       ‖
       ‖|   
       ■|■■■■■■■■石油■■■■■■■■■■
       ■|■■■■■■■■■■■■■■■■■■■■
中国領土← | →日本領土

これがあれば日本は強力な資源大国になれます。
今の不況や失業など一気に吹っ飛ば、安全なバブルが到来します
この暴挙をみすみす許している日本政府と外務省、
国家の一大事であるにもかかわらず一切放送しないマスコミ
今声を上げないと、この国は終わるかもしれません。

893 :デフォルトの名無しさん:04/05/29 22:08
>>883
社内のプログラマが作るコードがboostと比較して糞コードである事の方が多いだろうけど、
品質管理を通ってしまえば社内基準は通過しているので、要件を満たしているコードと言える
boostは未来永劫要求を満たしつづけてくれるかと言えばそうではないだろ?

新規ならばboostの特定バージョンを検査して、それを導入すればいいだろうけど
普通は品質管理基準をクリアした汎用部品の蓄積があるんだから、
あえて無駄なコストをかけてまで導入する理由が無いじゃないか。

あと、std::hogehogeなんかは商用ライブラリ導入時に検査を行っているか、
メーカーと保守契約を結んでいる場合がほとんどだろ。

894 :デフォルトの名無しさん:04/05/29 22:15
>>893
はいはい、ほとんどねぇ。よかったですね。あなたが、そのほとんどに含まれる仕事をしていることはわかりました。
はい、では次の人、どうぞ。

895 :デフォルトの名無しさん:04/05/29 22:18
馬鹿じゃねーの?
boostがそんなショボイライブラリの訳ねーだろ。
ちゃんと計算されてる。角度とか。

896 :デフォルトの名無しさん:04/05/29 22:20
久しぶりに見たな。角度とか。

897 :デフォルトの名無しさん:04/05/29 22:22
boostのスレあったような気がするんだが、落ちたの?

898 :デフォルトの名無しさん:04/05/29 22:23
まさか、なんたらエンタープライズを店頭で買ってきてそのまま使ってたり、
gccに標準で入っている標準ライブラリをそのまま使って作った
ソフトをろくにコード検証もせずに、他所様に垂れ流してるんですか?

899 :デフォルトの名無しさん:04/05/29 22:23
>>897
templateスレと一緒になったんじゃなかったっけ?

900 :867:04/05/29 22:28
>>899
あなる

901 :デフォルトの名無しさん:04/05/29 22:30
>>875
あほはお前だろ。マンドクセ。

902 :デフォルトの名無しさん:04/05/29 22:34
>>898
なんたらエンタープライズとboostを一緒にされても・・・

gccに標準で入っている標準ライブラリとかstd::hogehogeに
対する検証ってどの程度で行ってるんでしょうか。
全検査できる体制があるなら羨ましい限りです。

903 :デフォルトの名無しさん:04/05/29 22:43
おいおいprivateの理念わかってないやつ、こんなにいたのか?

904 :デフォルトの名無しさん:04/05/29 22:48
publicの理念も分かりませんが何か?

905 :デフォルトの名無しさん:04/05/29 22:49
ぱぶりっこ

906 :デフォルトの名無しさん:04/05/29 23:47
ifで囲まれたスコープ解決演算子付きのメソッドのあるコードがあったんだけど、
その前に、!があるんだけど、これは戻り値の否定でいいんだよね?

こんなの↓

if(!::method(,,,)){
}




907 :デフォルトの名無しさん:04/05/29 23:47
>>906
オーバーロードしていなければ。

908 :デフォルトの名無しさん:04/05/29 23:51
>>906
いい。

909 :デフォルトの名無しさん:04/05/30 00:00
>>906
釣りか?
operator ! でサフェースアナライズする気だろ
その手に乗るかってんだ

910 :デフォルトの名無しさん:04/05/30 00:06
サーフェスアナライズってなーに?

911 :デフォルトの名無しさん:04/05/30 00:17
上っ面だけの解析?

912 :デフォルトの名無しさん:04/05/30 00:24
>>910
わかんなきゃ先ずぐぐれ

http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A7%E3%82%B9%E3%82%A2%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%BA
http://www.google.co.jp/search?hl=ja&ie=UTF-8&q=%22surface+analyze%22&lr=


・・・ヒットしねぇ。つかsurface analysisだろ?

913 :デフォルトの名無しさん:04/05/30 01:07
いたるところにトラップが仕掛けてあって、こんな危なっかしい言語使えねー罠

914 :デフォルトの名無しさん:04/05/30 01:44
>>898
今は gcc + STLport の仕事してるけど、さすがに gcc のソースコードや
newlib, STLport の詳細までは追ってないなぁ。実際に使ってみて問題が
出なければ、まぁ良いやって感じ。

別にバグがあっても人死にが出るタイプのソフトじゃないんで、そこにコスト
掛けるなら、顧客の要求に素早く対応する方にコスト掛けた方が良いっつー
判断。

915 :デフォルトの名無しさん:04/05/30 04:47
>>912
surface analysisって何?

916 :デフォルトの名無しさん:04/05/30 12:21
>>862 煽りではなく純粋に質問です。
その場合、複数のメンバ関数に一つずつインターフェースを
指定すると、templateの数が膨大になるので非現実的ですよね?
旨くやる方法ってあるのでしょうか?教科書的には、NoisyShout、DefaultShout
を基底クラスから導出すると思うのですけども。スレの流れはちと忘れて。

917 :デフォルトの名無しさん:04/05/30 12:25
>>915
表面分析

918 :デフォルトの名無しさん:04/05/30 12:33
体表面アナル化

919 :デフォルトの名無しさん:04/05/30 13:32
>>862じゃないけどメンバ関数すべてにインターフェイスを用意するという意味で言ったんじゃないんじゃないと思う
そもそもポリシーは互いに関連する複数のメンバ関数を提供するのが普通だし、
むしろ「インターフェイス、ポリシーを分けて考えろ」ってのは
インターフェイスがポリシーごとの差異を細かく反映していくつも用意されることに異を唱えてるんだと俺は解釈したが。

920 :デフォルトの名無しさん:04/05/30 13:55
>>917
「operator ! で表面分析する」ってどういう意味さ?

921 :デフォルトの名無しさん:04/05/30 13:56
ModernC++は極最近読みました。ポリシーにまだ慣れていないので
なかなかピンと来ないのですが、
>>インターフェイスがポリシーごとの差異を細かく反映していくつも用意されることに異を唱えてる
の具体的な例を示してもらえませんか。
インターフェイスがポリシーの差異を細かく反映していくつも用意されている例と、
インターーフェイスとポリシーと実装を分離してうまく解決している例と。
例を見ないと学習がスムーズに進まない性分なのでお願いします。

922 :デフォルトの名無しさん:04/05/30 14:33
>>921
すまんが、俺はちょっと例までは出せない。
というか
>インターフェイスがポリシーごとの差異を細かく反映していくつも用意される
ってのは君が心配しているような(想像上の)場合を述べたもので、
実際にはポリシーに当たる部分を分離して一つのクラスを作っているなら
その段階で全体のインターフェイスとの関連性は自然になくなるはずなんだよね。
実際にあるみたいな言い方したせいで誤解させてしまったようだけど。

923 :922:04/05/30 14:49
「自然になくなる」って言い方は言いすぎだったか。
>>862の例だとポリシーは実装に利用されるだけだからインターフェイスには関わってないけど。


924 :デフォルトの名無しさん:04/05/30 14:50
うーん、やっぱり具体的なソースが想像出来ませぬ…orz

925 :デフォルトの名無しさん:04/05/30 16:15
こんなのかな?
/* 悪い例 */
struct VariableNoisyShout{
protected:
void shout(int noisiness){
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
};

/* 良い例 */
struct VariableNoisyShout
{
set_noisiness(int n){nn = n;}
protected:
NoisyShout():nn(3){}
void shout(){
int noisiness = nn;
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
private:
int nn;
};

926 :デフォルトの名無しさん:04/05/30 17:31
初歩的な質問だけど>>849のprotectedは何故問題が起こりにくいの?

927 :デフォルトの名無しさん:04/05/30 18:03
>>926
struct base{protected:~base(){}};
struct derived : public base{};

base *p = new derived;
delete p; /* コンパイルエラー */

928 :デフォルトの名無しさん:04/05/30 18:18
あ〜、もう訳が分かりません。
良い例と以下はあんまり変わらないと思いますけど、
この例にポリシーってあるんですか?

struct VariableNoisyShout{
protected:
void shout(int noisiness = 3){
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
~NoisyShout(){}
};


929 :デフォルトの名無しさん:04/05/30 18:54
正直、「インターフェース」「ポリシー」をどう定義して話しているのかわからない。
あげく、「ポリシーってあるんですか?」ときた。
話している両者で定義が違っているような気がするんだが、
ちゃんと噛みあった会話になってるの?

漏れとしては、
「インターフェース」
 広い意味では、提供者と使用者の間での約束事のこと。
 たぶん今の会話の中では、純粋仮想関数のみを持つクラス型のこと。
「ポリシー」
 テンプレート引数として動作をカスタマイズできるように、
 必要なメンバ(要求)が定義されているクラス型のこと。
 広義のインターフェースに含まれる。
だと思ってるんだけど、あってるかな?

930 :デフォルトの名無しさん:04/05/30 19:40
日本語では正直分からないのでソース例を見て、
理解したいと思ったしだいです。

931 :925:04/05/30 19:44
やっぱり例が悪かったな。
忘れてくれ。

932 :デフォルトの名無しさん:04/05/30 19:48
なぁみんな、そろそろ>>930は放置でいいんじゃないか?

933 :デフォルトの名無しさん:04/05/30 19:52
>>932
「日本語」と「ソース」が逆だったら賛成だが・・・
現状、あんたがおかしい

934 :デフォルトの名無しさん:04/05/30 20:23
>>929
概念ではなく実装レベルで見ると

インターフェース
 純粋仮想関数と仮想デストラクタだけを含むクラス

ポリシー
 typedef と定数定義だけを含むクラス

かね。形だけ見ても、それをどう有効活用するか理解してないと
意味不明だから、あまり良い説明じゃないんだが。

935 :デフォルトの名無しさん:04/05/30 20:26
>>934
うそくせーなんかうそくせー

936 :926:04/05/30 20:34
>>927
誰かが公開してやらなきゃいけない上に
virtualじゃない基底クラスポインタを作れないという事か。
ありがとう。

937 :デフォルトの名無しさん:04/05/30 21:04
>>935
どうした、なんか発作でも起こしたのか?

938 :デフォルトの名無しさん:04/05/30 21:06
放置して下さい

939 :849:04/05/30 21:15
>>916
俺の書いたソースで混乱させてしまったようですまない。
言葉が足らなかったのでとりあえず>>862-866にこめた
気持ちを書きます。ちょっと酔ってるのでわかりにくいかもしれんが
なんとなくこのまま放っておけないので。

ポリシーはModernC++Designで定義されている用語です。
俺がだらだら説明するなんて無駄だから知りたい方は
読まれると良いでしょう。

ポリシーもインターフェースも複数メンバがあっていいです。
どちらも意味的にわかりやすい単位でまとめていいでしょう。


940 :849:04/05/30 21:15
>>939のつづき
件の話の流れから、「デストラクタvirtual」と「デストラクタprotected」の
使い分けのような部分を示したかったのです。
俺の理想としてはインターフェースから導出→(当然)デストラクタvirtual
実装の再利用及び、アプリケーションの特性を示すクラス→デストラクタprotected
の気持ちを持っています。※基本APIはここでは考えません。

で、インターフェースから導出するのは
なるべく動的にクラスが扱われる場合
(一緒の配列に格納したりStateパターンを使ったりするような場合)
にするべきだということです。使用例2において配列で示しました。
動的でなければほとんどテンプレートでコンパイル時に静的解決できるだろうと
考えています。動的に使用しないなら使用例1で十分(インターフェース不要)
ということです。

こうするとインターフェースばかり(仮想関数ばかり)で
効率が下がってしまうという問題を回避できるのではないかという意味でした。
デストラクタにvirtualをつけるのを嫌がるのは効率を考えるからだ、
というふうに受け止めているからです。


941 :849:04/05/30 21:16
>>940のつづき
また、もし一つのメンバ関数を一つのポリシーに対応させて作っても
コンパイル時に最適化されて一つのクラスになるし、
ポリシーに分けた部分を継承で実装するならクラス数も同様に
増えると思うので、これに関してデメリットは無いだろうと思います。
ポリシーは似て非なるクラスを作りたい時にその「似て非なる」を
他になるべく影響を与えずに切り出す手段だと思っています。

えらい長文すみません。ちゃんと伝わるといいんですが。


942 :デフォルトの名無しさん:04/05/30 21:18
int (*hoge)[10] = new ...;

...には何を指定すればいいでしょうか?
int[10]としたらおこられました。



943 :デフォルトの名無しさん:04/05/30 21:46
int* (hoge)[10] = {new int, new int, new int, ...};

944 :デフォルトの名無しさん:04/05/30 21:51
それは違うだろ

945 :デフォルトの名無しさん:04/05/30 21:59
>>942
int (*hoge)[10] = new int[n][10];

946 :デフォルトの名無しさん:04/05/30 22:41
>>945 ありがとうございます。

947 :デフォルトの名無しさん:04/05/30 22:44
>>941
>最適化されて

これ言い出したらOOP崩壊

class sine
{
private:
int afo;
public:
void set_afo(int gaikichi);
};
void inline sine::set_afo(int gaikichi)
{
afo = gaikichi;
}
main()
{
sine arasi;
arasi.set_afo(nurupo);
}


948 :デフォルトの名無しさん:04/05/30 22:50
inline ってハァ?

949 :デフォルトの名無しさん:04/05/30 23:31
>928
そもそもここが分かってないような気がするので。
とりあえず、VariableNoisyShout とか自体がポリシーでしょ?
>862 からの流れです。
で、>849 と >925 は主張が違ってるような気がします。
>849 は既に本人が説明されてるんでパス。
で、>925 が言いたかったのは、悪い例ではポリシーが違うことによって shout() の呼び出し方が
変わってしまうため >864 みたいに単純に hit() が作れなくなり、結果としてインタフェースまで
影響が波及しかねず(hit()自体を差し替える必要がありそう)だめぽってことでしょう。
良い例の場合は、>863-864 と組み合わせが可能ですし、何回 Shout するかも制御可能です。
まとめると「ポリシーは問題を切り分けてちゃんと作れ」になってしまいそうな気がしますが(w
なお >928 のコードでは結局何回 Shout するかを制御できないですね(実装を使うユーザが)。

950 :デフォルトの名無しさん:04/05/30 23:57
皆様どうも長々と付き合ってもらって感謝です。
>>849 氏の説明は、class DerivedA1 : public BaseA {}、class DerivedA2 : public BaseA {}
では、DerivedA1、DerivedA2 を BaseA* と共にしない場合でもvirtualが入ってくるが、
>>862-866の例では、BaseA*的に扱うか否かを使用者が決める(ポリシー)だと受け取りました。

>>928 は完全に私の勘違いで申し訳ありません。


951 :デフォルトの名無しさん:04/05/31 00:14
>>947
は、ナニが言いたいの?意味不明なんだけど

952 :デフォルトの名無しさん:04/05/31 01:36
>>781のリンク先の仮想継承のところにある
vbptrが指している仮想基本クラステーブルについてなんですが

テーブルの最初のエントリーがクラスGの場合 GdGvptrG なのですが
ここには何が入ってるんですか? GdGvptrC さえあればよさそうに見えるのですが
各仮想基本クラスへのオフセット値以外に何か必要なのでしょうか

953 :849:04/05/31 08:54
>>949
>>925の解説ありがとう。
実は俺、昨日読んだ時点では文脈がわかってなかったんだが、
俺のソースから始まったことだからとりあえず返信したのでした。
ちなみに>>949のような話なら俺はまず下記いずれかで解決を
試みると思います。どちらを取るかはアプリ次第ですね。
行数足らないのでデストラクタとprotected宣言は補完してください。
//実装側に変更を要求するが、柔軟。
template<typename S>struct IgnoreCountShoutAdapter{
void shout(int count){S::shout();}//引数ありshoutを引数なしshoutへ
};
//型爆発が起こる可能性あり。
template<int C>struct StaticCountShout{
void shout(){
int noisiness = C;
while(--noisiness >= 0) std::cout << "いて";
std::cout << "!" << std::endl;
}
};


954 :849:04/05/31 09:10
>>950
その通り。同じ意識を共有できたと思う。
説明が足りなくてすまなかった。

>>919
ポリシーは実装を作るためのパーツ感覚なので
一般的にインターフェースより粒度は細かいだろうと思う。
件のサンプルではそういう意図ではなかったんだけどね。
多分この辺を感じ取ってくれてフォロー入れてくれたんだよな。
感謝。

955 :デフォルトの名無しさん:04/05/31 15:25
VBで unload me はC#ではどうやるの?
コントロールのボタンを押した時、Form_Closeingをして
アプリケーションを終了したいのだけど。




956 :デフォルトの名無しさん:04/05/31 15:26
亜巣万。まちがった。ごばく。


957 :C++初心者:04/05/31 22:23
C++の実行時のメモリの取られ方についてどなたか教えてください

とある本で実行時の動作について
1.全ての割り込みを受け付けないようにする
2.ROM から RAM に初期化したデータを全てコピー
3.初期化されていないデータ領域を 0 で初期化
4.スタックを確保して初期化
5.プロセッサのスタックポインタを初期化
6.ヒープ領域を作成して初期化
7.全ての広域変数のためのコンストラクタとイニシャライザを実行 (C++)
8.割り込みを可能にする
9.main を呼ぶ
とあったんですが、
"全ての広域変数のためのコンストラクタとイニシャライザを実行"
とはどういう意味でしょうか?
広域変数の意味がわかりません。クラスのヘッダ内で宣言している変数のことでしょうか?
そのためにコンストラクタとイニシャライザを実行ということは、
そのクラスが使われる使われないにかかわらず、
実行時にヘッダに宣言してある変数がRAM上(何領域?)に取られるということですか?

958 :デフォルトの名無しさん:04/05/31 22:33
グローバル変数のことじゃね?

959 :デフォルトの名無しさん:04/05/31 22:45
C++ に 「イニシャライザ」 なんて用語あったっけ?

960 :デフォルトの名無しさん:04/05/31 22:47
一般的に初期化ってことじゃないの?

961 :C++初心者:04/05/31 22:47
C++でのグローバル変数っていうのは、、、クラス外で宣言されている値ということでしょうか?
そうするとコンストラクタが実行されることの意味がわかりません

イニシャライザって
class A {
A() : a(0) {
とかのa(0)のことかと思ってました

962 :デフォルトの名無しさん:04/05/31 22:53
class abc {
int m;
abc() : m(0) { hoge(); }
};

abc a;
main(...) { ... };

なんてのがあったとき、main が呼ばれる前に a のコンストラクタが動くよ、ってこと>>961


963 :C++初心者:04/05/31 23:14
あ、そういうことですか、わかりました

それ以外のクラスに関しては、実行時に呼ばれた際に初めてコンストラクタが走ってメモリが獲得されるという理解でいいんですよね?
その際の呼び出し方によって、どこにメモリが取られるのかが決まると

ありがとうございました

964 :デフォルトの名無しさん:04/05/31 23:20
>>954 御丁寧に有難うございました。
ポリシーって、A< Policy > a; の様に使ってAの内部動作を決める事しか
目を向けていませんでした。件のコードはとても新鮮でした。
struct Base {
virtual void func1();
virtual void func2();
];
struct DerivedA : public Base {
void func1() { ... }
void func2() {} // place holder
};
struct DerivedB : public Base {
void func1() {} // place holder
void func2() { ... }
};
の様に無理に共通の基底クラスを作らなくても済みますね。
template< typename Policy > struct A;
struct Policy1;
struct Policy2;
struct Policy12 : public Policy1, public Policy2;
A< Policy12 > a
とやると複数のポリシーを適用できるかなぁと夢想中・・・

965 :デフォルトの名無しさん:04/06/01 21:17
char i;で定義したiでユーザーの入力を受け取ってint型に変換したいんですけど、どうすればいいんでしょうか?

966 :デフォルトの名無しさん:04/06/01 21:25
>>965
まずは入門書買え。そして読め。話はそれからだ。

967 :デフォルトの名無しさん:04/06/01 22:13
>>965
発想の転換でintで定義して入力を受けるときだけcharに変換する

968 :デフォルトの名無しさん:04/06/01 22:26
int×char

969 :デフォルトの名無しさん:04/06/01 22:26
何がやりたいのか分からんが、char* だったら atoi か。

970 :デフォルトの名無しさん:04/06/01 22:55
>>969
エライね(w
初心者の言わんとすることを咀嚼した上で回答している。
自分だったら、ついつい>>967のような返答してしまうだろうなぁ。

971 :デフォルトの名無しさん:04/06/02 02:59
オレだったら、

 あーっ、うざい。初心者スレか宿題スレにとっとと逝け

って回答しちゃうな。みんな親切だな。

972 :デフォルトの名無しさん:04/06/02 03:07
・・・

973 :デフォルトの名無しさん:04/06/02 04:38
>> 965
(int)(i - '0')

974 :デフォルトの名無しさん:04/06/02 06:05
>>973
i - '0' ってやった時点で既に整数への格上げを受けているよ。まず i が
整数への格上げを受け、次に '0' も整数への格上げを受けるので、
結局int - intの計算をして、結果もint。キャストは不要。

975 :デフォルトの名無しさん:04/06/02 12:48
structとclassの使い分けってどうしてます?
なんとなく? あるいは自分なりの基準を持ってますか?

976 :デフォルトの名無しさん:04/06/02 13:31
俺の場合、
・メンバが全てpublic
・operator以外の関数がない
・仮想関数テーブルがない
場合はstructだな。まぁ多少例外もあるが。

友人はoperatorなども含め、関数が入りそうな時点でclassに
してるんで、結構「俺基準」がありそうな気がする。

977 :デフォルトの名無しさん:04/06/02 14:47
C から C++ に流れた人は >>976 の言う関数が入ったらクラス化っての多いんじゃないかな。
かく言う俺もそれ。

978 :デフォルトの名無しさん:04/06/02 15:17
俺は関数オブジェクトを用意するためにはstructだなあ。

979 :デフォルトの名無しさん:04/06/02 15:45
Cと絡むならstructそれ以外はclass

980 :デフォルトの名無しさん:04/06/02 15:53
俺はマンドクセーから全部classだな。

981 :デフォルトの名無しさん:04/06/02 15:58
C#とかならともかくC++で一生懸命使い分けても空しいよな

982 :デフォルトの名無しさん:04/06/02 16:26
>>981
別に一生懸命使い分けているわけでもないのだが。

983 :デフォルトの名無しさん:04/06/02 18:28
次スレ立てまーす

984 :デフォルトの名無しさん:04/06/02 18:30
しばらくこのホストでは立てられません」がでちゃったよーん

985 :デフォルトの名無しさん:04/06/02 19:39
>>975
自分で作る場合は文句なしにclass
他の人のを借りた場合のみstructが存在する

986 :985:04/06/02 19:42
>>984
建てようか?

987 :985:04/06/02 19:47
漏れも弾かれたorz

988 :デフォルトの名無しさん:04/06/02 19:49
次スレ
http://pc5.2ch.net/test/read.cgi/tech/1046851381/

989 :デフォルトの名無しさん:04/06/02 20:01
>>988 ワラタ

990 :デフォルトの名無しさん:04/06/02 20:03
スレッド一覧から探しちゃったよ

991 :デフォルトの名無しさん:04/06/02 20:31
>>975
メンバ関数とかoperatorみたいに++なことを書くときclass
ただしインターフェースはstruct

てなことやってるけど、本音ではclassいらん
俺的にはpublic->protected->privateの順で書くべきだと思っているし
template関係のぐちゃが痛くて見てらんねー


992 :デフォルトの名無しさん:04/06/02 20:47
ええ?俺はデータをひとまとめにするのに使うぜ?なんだってインターフェースにstructなんか。
public書くの面倒くさいとかだったら悪だね。

993 :デフォルトの名無しさん:04/06/02 20:55
いや、別にどっちでもいいだろ

994 :デフォルトの名無しさん:04/06/02 21:00
なんの存在意義もないな

995 :デフォルトの名無しさん:04/06/02 21:11
クリリンのことかーっ!!!!!

996 :デフォルトの名無しさん:04/06/02 21:28
クラスは使うと遅くなるの?

997 :デフォルトの名無しさん:04/06/02 21:29
うん。理屈上は遅くなる。

998 :デフォルトの名無しさん:04/06/02 21:32
メンバ変数一つ使うのにもインスタンス作ってやらんといけないわけだから
その分、クラスを使わないでやる場合に比べると遅い。


999 :デフォルトの名無しさん:04/06/02 21:33
C++

1000 :デフォルトの名無しさん:04/06/02 21:34
1 0 0 0

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

239 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)