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


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

C++相談室 part15
1 名前:デフォルトの名無しさん :03/01/27 03:24
怪しい仕様は細々ありますが大丈夫です!
elegantなソースを目指してね。 関連URL>>2-10

v(^・^)v

2 名前:デフォルトの名無しさん :03/01/27 03:24
■基本■
[Stroustrup]
禿 http://www.research.att.com/~bs/
C++に関するリンクの総本山でもあります。

[C++ Final Draft International Standard]
http://www.kuzbass.ru/docs/isocpp/
http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf

[JTC1/SC22/WG21 - C++]
http://std.dkuug.dk/jtc1/sc22/wg21/
仕様書の重箱の隅的な話題などが読めます。

[Association of C & C++ Users]
http://www.accu.org/
[C/C++ Users Journal]
http://www.cuj.com/
[Object Management Group]
http://www.omg.org/

[news]
news:comp.lang.c++
news:comp.lang.c++.moderated

3 名前:デフォルトの名無しさん :03/01/27 03:25
■Document■

C++FAQ Lite http://www.parashift.com/c++-faq-lite/
C++FAQ(日本語) http://www.bohyoh.com/CandCPP/FAQ/
Cとその仕様を比較しながらの解説なので分かりやすい。

[STL]
STL Programmer's Guide http://www.sgi.com/tech/stl/
日本語としてはおそらくここ。ただしリファレンス的内容。
http://www.wakhok.ac.jp/~sumi/stl/

[boost]
これに関しては公式のドキュメント、又はソースを読むのが一番です。
ただし日本語でいくつか有益な情報が読めます。
Let's boost http://www.kmonos.net/alang/boost/
shinichiroさん http://user.ecc.u-tokyo.ac.jp/~g940455/wp/
YahooBBS http://groups.yahoo.com/group/boost/
news news:gmare.comp.lib.boost.devel

amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

4 名前:デフォルトの名無しさん :03/01/27 03:25
■Compiler■
[GCC]
http://gcc.gnu.org/
(branch list http://gcc.gnu.org/cvs.html とくにcp-parser-branch!)
(Windows上でのPOSIX環境構築 http://www.cygwin.com)
[Borland C++ Compiler]
http://www.borland.co.jp/cppbuilder/freecompiler/
[MSVC] コンパイラ以外のツール、ドキュメントです。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
(一括ダウンロードの時は上のURLに続けてこちらを入力してください
default.htm?p=/msdownload/platformsdk/sdkupdate/psdk-full.htm)

なお上記三者を組み合わせたプログラミングにおいてはこちらが分かりやすいです。
http://www.geocities.com/Tokyo/Ginza/5432/documents/winprog/index.html

[Comeau]
http://www.comeaucomputing.com/
[intel C++ Compiler]
http://www.intel.com/software/products/compilers/
[metrowerks]
http://www.metrowerks.com/mw/default.htm

5 名前:デフォルトの名無しさん :03/01/27 03:25
■Libraries■
Boost http://www.boost.org/
STLport http://www.stlport.org/
Loki http://www.moderncppdesign.com/
LokiPort
MSVC7 http://www.geocities.com/rani_sharoni/LokiPort.html
MSVC6.0 SP5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

ACE/TAO http://www.cs.wustl.edu/~schmidt/
Network、Thread、ORBなどのポータブルなライブラリ
Blitz++ http://www.oonumerics.org/blitz/
数値計算ライブラリとして人気がある、らしい
spirit http://spirit.sourceforge.net/
flex++ Bison++ http://www.idiom.com/free-compilers/TOOL/BNF-15.html
パーサジェネレータ

他ライブラリリンク集
http://www.trumphurst.com/cpplibs/cpplibs.phtml

6 名前:デフォルトの名無しさん :03/01/27 03:26
■過去スレ■
Part1 http://piza.2ch.net/tech/kako/980/980175292.html
Part2 http://pc.2ch.net/tech/kako/996/996640937.html
Part3 http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
Part4 http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
Part5 http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
Part6 http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
Part7 http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
Part8 http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
Part9 http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
Part10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
Part11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
part12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
part13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
part14 http://pc3.2ch.net/test/read.cgi/tech/1007731543/

7 名前:デフォルトの名無しさん :03/01/27 03:26
■関連スレ(テンプレートを用いたライブラリ中心)■
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc3.2ch.net/test/read.cgi/tech/1037795348/
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/
STLスレッド
part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html

8 名前:デフォルトの名無しさん :03/01/27 03:50
■関連スレ(環境依存の話題)■
GCCについて http://pc3.2ch.net/test/read.cgi/tech/1007731543/

C++Builder相談室    http://piza2.2ch.net/tech/kako/969/969458279.html
新C++Builder相談室  http://pc.2ch.net/tech/kako/997/997074601.html
C Builder相談室 Part3 http://pc3.2ch.net/test/read.cgi/tech/1016065855/
C++Builder相談室 Part4 http://pc3.2ch.net/test/read.cgi/tech/1035596146/
タダで使えるBorland C++!
part1 http://pc3.2ch.net/tech/kako/1002/10023/1002377328.html
part2 http://pc3.2ch.net/test/read.cgi/tech/1030493157/

VisualC++相談室 3  http://piza2.2ch.net/tech/kako/993/993186053.html
VisualC++相談室 4  http://pc.2ch.net/tech/kako/1002/10021/1002165477.html
VisualC++相談室 5  http://pc.2ch.net/tech/kako/1006/10068/1006834463.html
VisualC++相談室 6  http://pc.2ch.net/tech/kako/1011/10116/1011615035.html
VisualC++相談室【7】 http://pc.2ch.net/tech/kako/1017/10178/1017843192.html
VisualC++相談室【8】 http://pc.2ch.net/tech/kako/1022/10224/1022499000.html
VisualC++相談室【9】 http://pc3.2ch.net/test/read.cgi/tech/1036897197/

9 名前:デフォルトの名無しさん :03/01/27 03:50
VisualC++(MFC限定)相談室 MFC6.dll
http://pc3.2ch.net/test/read.cgi/tech/1039607377/
Windows Programing for C/C++(Not MFC)
http://pc3.2ch.net/test/read.cgi/tech/1018239290/
COM の世界を斬る!
http://pc3.2ch.net/test/read.cgi/tech/981823340/
ATL 相談室
http://pc3.2ch.net/test/read.cgi/tech/1029029882/
managed C++ やろうぜ!!
http://pc3.2ch.net/test/read.cgi/tech/1014486422/

10 名前:レゴ :03/01/27 05:23
来てみました。特に用件は無いです。
聞きたい事は、山程在るんですが、
理解してなさ過ぎなので、力付けたいと思います。


11 名前:デフォルトの名無しさん :03/01/27 06:03
>>10
律儀なのはいいけど、ここは馴れ合いのスレじゃないので挨拶せんでもいいです。

12 名前:デフォルトの名無しさん :03/01/27 06:42
http://click.dtiserv2.com/Click/512-103-4493

13 名前:デフォルトの名無しさん :03/01/27 07:39
template<class T> void foo(void){}
template<class T> inline void foo(void){}

上の書き方では、インライン展開はされないんですか?
それとも両方同じ意味?


14 名前:デフォルトの名無しさん :03/01/27 08:03
>>13
上下で意味が違う。上が普通。下がinline指定付き。

15 名前:デフォルトの名無しさん :03/01/27 08:31
>>14
答えになってないだろ。
「普通」 ってどういう事だよ。

まあ結局は、最適化の方法によると思うけど・・・。
場合によっては inline も無視されるし。

16 名前:14 :03/01/27 08:55
>>15
あーすまんな、そこでいう普通ってのは、inline指定無しってことだ。

17 名前:デフォルトの名無しさん :03/01/27 09:06
>>16
そんな事は一目瞭然だろ。
13 は、実際にどうなるかが知りたいんだろうに。

18 名前:14 :03/01/27 09:12
>>17
そんな事は言えないだろ。>>15にも「まあ」以下にちょっと書いてあるし。

19 名前:デフォルトの名無しさん :03/01/27 09:26
>>18
15=17 ですが何か?
どうして言えないと思うんだ?
「インライン展開はされないんですか?」 が実際にどうなるかという話で無いと
したら何だというんだ?
inline を指定した事になるのか、という質問には見えない。

20 名前:デフォルトの名無しさん :03/01/27 09:29
なんかスレ立て早々、戦争が勃発してるし。
>>1 乙。

21 名前:14 :03/01/27 09:42
>>19
え、だって、「それとも両方同じ意味?」とかゆってるし・・・。

インライン展開されるかどうかはinline指定の規則に従うってことで済ませとかないと
コンパイラからコンパイルオプションから聞き出さない限り意味のある答えはでないだろ。
>13が環境を示さない限り「実際にどうなるか」って話は意味無い。

ってなわけで、「実際にどうなるか」の話なんて漏れにはできん。
>>19よ、見本でもみせてやってください。

22 名前:デフォルトの名無しさん :03/01/27 09:46
>>13
どちらでもほとんどの処理系でインライン展開はされると思うが、リンケージが異なる
かな。C++ だと inline 関数のデフォルトリンケージは static なんで、オブジェクトに
特殊化したテンプレート関数を格納したい場合(ライブラリ作る場合)は前者でコンパ
イルしないと、まずいと思う。

23 名前:デフォルトの名無しさん :03/01/27 10:31
> C++ だと inline 関数のデフォルトリンケージは static
これほんと?
ドラフトの中にこんなんあるけど。
[Footnote: The inline keyword has no effect on the linkage of a function. --- end foonote]

24 名前:デフォルトの名無しさん :03/01/27 12:44

まだC++をはじめたんですけどなかなか覚えれなくて
みなさんどんな感じでC++を覚えたのでしょうか?


25 名前:デフォルトの名無しさん :03/01/27 12:45

すみません下げ忘れてました。

26 名前:デフォルトの名無しさん :03/01/27 13:17
>>24
俺はC++3rdを頑張って読破した。(Cは多少わかってる状態で)
とりあえずC++3rdを買って読む。あとは>>1が頑張ってくれたテンプレ集とか、cppll ML(最近質が落ちてるけど)とかわからなくても漁ってみるべし。
わからなくなったら周りのC++に詳しい人とか、このスレで聞くといい(叩かれるかもしれんが…)。

cppll ML
http://www.trickpalace.net/cppll/

で、>>1 乙カレー

27 名前:26 :03/01/27 13:26
あ、ちなみに俺の言った方法はよほど暇人じゃないとできないかも。(いろいろ他の言語をつまみ食いしながら二年位かかった)
中学〜高校のときだったしなぁ…。

仕事で今すぐ必要というならアドバイスできませぬ。なにせ趣味グラマなもんで。

28 名前:デフォルトの名無しさん :03/01/27 14:09
>v(^・^)v

これむかつく!
>>1 お疲れ

29 名前:MlQ38syL :03/01/27 15:22
■■■■■I90vmCq+さんへ■■■■■
こんにちはMlQ38syLです。
ボクのくだらん遊びに付き合ってくれてありがとうございます。
仕事でなかなか良いアイデアが浮かばなくってイライラしてました。
おかげ様で良い気分転換が出来ました。
仕事に戻ります。サンキュ♥


30 名前:デフォルトの名無しさん :03/01/27 15:56
perlみたいにいろんなライブラリがラインセンスフリーで出回んないかなぁ。

31 名前:デフォルトの名無しさん :03/01/27 16:05
>>26
いまcppllはtietewによる新人いじめの真っ最中なので不適かと。
#あれじゃ「身内」以外は投稿しにくいよなぁ。

32 名前:デフォルトの名無しさん :03/01/27 16:05
>>1-9
スレ立て乙ー。

33 名前:デフォルトの名無しさん :03/01/27 16:35
>>34->>1001
レス乙カレー(プ

34 名前:13 :03/01/27 16:41
13です。言い方が悪くてすいません。

>>13 上の書き方では、インライン展開はされないんですか?
この意味は、「実際に展開されるかどうかではなく、inlineを付けなくても
inline指定したことになるのか?」っていう意味でした。
テンプレートは、コンパイル時に定義が見えなくてはいけないのでinlineを付けなくても同じかなと。

>>22 ちょっと状況が想像できません。調べてみます。

35 名前:デフォルトの名無しさん :03/01/27 17:02
>>34
inlineを付けなくてもinline指定した事になるのは、クラス宣言部内で
メンバ関数を定義した時だけでは?それ以外の時は明示的にinline
と指定する必要がある。

36 名前:デフォルトの名無しさん :03/01/27 17:36
ちょっとお聞きしたいんだが

vector<int> v;
vector<int>::iterator i = v.begin();
++i; //これは未定義ですか?不定?それとも安全?

37 名前:デフォルトの名無しさん :03/01/27 18:18
ちょっとミス
v.begin → v.end
ということです。

38 名前:デフォルトの名無しさん :03/01/27 19:04
>>36
vector<T>::iteratorの型は大体の処理系でT*だから、++iをする分には問題ないけど、
それを操作するとマズいことになると思われ。
仕様がどうなってるかは仕様書を見てくれ。

39 名前:デフォルトの名無しさん :03/01/27 20:22
> vector<T>::iteratorの型は大体の処理系でT*だから、++iをする分には問題ないけど、

そーゆー認識ってマズーだと思う。

40 名前:デフォルトの名無しさん :03/01/27 21:04
>>13-
テンプレート関数はヘッダに書けるけど、inline指定しなくてもいいんだよね。
じゃ、普通の関数をヘッダに書きたいけどinline付けたくない!ってとき、

template<int dummy> void hoge_imp(void){ //普通の関数のつもり}
#define hoge hoge_imp<0>

main(){ hoge(); }

って書けばよさげじゃない?
#defineが汚いけど。

41 名前:デフォルトの名無しさん :03/01/27 21:12
>>40
> 普通の関数をヘッダに書きたいけどinline付けたくない!ってとき
どういう場合にそんなことがしたくなりますか?

42 名前:デフォルトの名無しさん :03/01/27 21:51
>>36-37
この場合、begin()でもend()でも未定義です。
*iが出来ないイテレータについて++i;はできない規格です。
規格書に「未定義」と定義してあるところは見つけられなかったけど...。

43 名前:デフォルトの名無しさん :03/01/27 21:54
で、結局関数テンプレートを実体化したらinlineになるの?ならないの?

44 名前:デフォルトの名無しさん :03/01/27 21:56
>>43
ならんっつーに。

45 名前:デフォルトの名無しさん :03/01/27 22:01
二次元配列のdeleteってどうやればいいの?

46 名前:デフォルトの名無しさん :03/01/27 22:01
>>5 のspirit 見て感動しますた。何か面白い事出来そうかも・・・何が出来るかな?

47 名前:デフォルトの名無しさん :03/01/27 22:06
>>45
delete[]

48 名前:デフォルトの名無しさん :03/01/27 23:48
ハンドルされていない例外がある
ってエラーメッセージが出るんだけど、何がわるいのでしょうか?

49 名前:デフォルトの名無しさん :03/01/27 23:49
>>48
0 除算やメモリアクセス違反などを疑え。

50 名前:デフォルトの名無しさん :03/01/28 01:00
構造体を宣言して、その構造体を他の構造体の要素に
するということはできるのですか?
kouzoutai.kouzoutai2.youso見たいに書くと思うのですが。
一般にやっぱりあまり使われませんよね?

51 名前:デフォルトの名無しさん :03/01/28 01:01
使うよ。

52 名前:デフォルトの名無しさん :03/01/28 01:02
>>50
API絡むとごく普通に使われてると思うが。

53 名前:50 :03/01/28 01:08
ありがとうございます。
今構造体をある構造体の中に組み込んで
kouzoutai[i].kouzoutai[j].yousoという風に使いたかったので。
どうやらごく普通に使っているならそのまま使ってみたいと思います

54 名前:デフォルトの名無しさん :03/01/28 01:13
>>53
クラスを他のクラスの中に入れるとコンポジションとなって少し意味が
変わるかもしれん。

55 名前:50 :03/01/28 01:16
どういうことですか?

56 名前:デフォルトの名無しさん :03/01/28 01:25
>>55
メンバ関数を含む構造体を他の構造体に入れると、オブジェクトの再利用の
観点から特別な意味合いを含むようになる。

57 名前:50 :03/01/28 01:30
特別な意味合いってつまりは使い方を特別にしなければいけないということでしょうか。
質問ばかりですいません

58 名前:デフォルトの名無しさん :03/01/28 01:31
>>36
std::vector<T>::iteratorはランダムアクセスイテレータです。
ランダムアクセスイテレータに対してoperator++()を適用するには、
適用前に参照はがしが可能、適用後に参照はがしが可能または
最後を過ぎた状態でなければなりません。(仕様書参照)
この場合、vは空であり、v.begin()にしろv.end()にしろ、
v.end()を返し、これは参照はがしが出来ません。よってこれは
operator++()が適用前に必要な条件を満たしていませんので、
結果は未定義です。

59 名前:デフォルトの名無しさん :03/01/28 01:41
>>57
構造体がメンバ関数を含んでいなければ別に気にする必要はない。
含んでいても、だからある特別な使い方をする必要があるという意味で
はない。特別な使い方を意識すればバグが出にくくなる、それだけ。

60 名前:50 :03/01/28 01:50
わかりました。ありがとうございます。特にメンバ変数を含んでないので。がんばります

61 名前:デフォルトの名無しさん :03/01/28 03:11
>>58
規格書の事を仕様書仕様書って言うなよ・・・

62 名前:デフォルトの名無しさん :03/01/28 03:45
>>61
規格書じゃなくて>>58の持ってる環境の仕様書なのでは?

63 名前:デフォルトの名無しさん :03/01/28 03:50
>>62
そんなものを 「参照」 と言われても・・・

64 名前:デフォルトの名無しさん :03/01/28 07:54
STLとAPIの命名規約がちがうのでソースが見にくいです。STLで ”_” を使うのはやめてください。

65 名前:デフォルトの名無しさん :03/01/28 11:40
標準規格の STL のネーミングを俺様APIのネーミングに合わせろってか。

66 名前:36 :03/01/28 14:18
>>38-39 >>42 >>58

理解しました。
非常にありがとうでございましたm(_ _)m多謝多謝ぬ

67 名前:シリアル :03/01/28 14:28
シリアル接続でストップビットを"2"にすると、
ポートに接続できなくなるのですがなぜですか?

68 名前:デフォルトの名無しさん :03/01/28 20:16
>>67
すみません。C++とどういう関係があるんでしょうか?

69 名前:デフォルトの名無しさん :03/01/28 20:32
いま、クラス設計をやっています。
Win32 API で行われているようなかんじで、登録されたデータを
ハンドルで管理したいと思います。
ハンドルの生成/開放を行う、一般的な方法はありませんか?

単純だし、自作できるとは思うのですが標準で用意されてるなら
そっちを使ったほうがいいかと思いまして。

70 名前:デフォルトの名無しさん :03/01/28 20:40
>>69
オブジェクトのポインタで充分ではない理由があったら聞かせてくれ。

71 名前:デフォルトの名無しさん :03/01/28 20:41
>>69
スマートポインタ?

72 名前:デフォルトの名無しさん :03/01/28 20:46
>>60
> 特にメンバ変数を含んでないので。がんばります
      ^^^^
どうがんばる気だ ?

73 名前:デフォルトの名無しさん :03/01/28 21:29
なるべくプログラムからポインタを排除したく思い、これからはメソッドの引数に参照を使うようにしようと思っています。
でも、例えば
void SetCurRecord(const CRecord *curRecord);
みたいなやつがあったとして、これを参照で渡すようにしてしまうと、わざとNULLを与えてデータをクリアするという事が出来なくなってしまいます。
他にも
void GetProperty(short *prop1, short *prop2 = NULL, short *prop3 = NULL);
こういう風にして欲しいデータだけ取り出したいようなインターフェースが作れなくなってしまう気がします。
参照とポインタの使い分けテクを教えてください。

74 名前:デフォルトの名無しさん :03/01/28 21:30
>>73
C++って不便だな。

75 名前:デフォルトの名無しさん :03/01/28 22:12
> なるべくプログラムからポインタを排除したく思い

なんで?

76 名前:デフォルトの名無しさん :03/01/28 22:22
だからスマートポインタ使えって。
あと、うかつに delete されたりするのがいやなら、デストラクタを
protected/private にして、public な release メソッドでも作る。

77 名前:デフォルトの名無しさん :03/01/28 22:46
利用者にはポインタのアドレスをハンドル値として
見せてしまえばいいんでは?

78 名前:デフォルトの名無しさん :03/01/28 22:47
>>75
ポインタ不要論
http://www.tomozo.ne.jp/yamazaki/download/doc_without_pointer.htm
最近コレを読んだもので。

>>76
スマートポインタって扱いが独特じゃない?所有権とかいう仕組みがあったり。
そもそもヘンなところ指されるのが嫌な訳で…

79 名前:デフォルトの名無しさん :03/01/28 23:04
>>78
リンク先読んだが、どうも筆者がコンテナやstd::stringを痛く気に入っている
という事は理解できたが、だからと言って「ポインタ不要」とばっさり言い切って
しまっている点がいただけない。

ポインタはC++でも必要な場面はいっぱいある。コンテナが使いやすい事は
認めるが、効率が最高かと言えばそうでもなかろう。

80 名前:デフォルトの名無しさん :03/01/28 23:08
誤: 痛く
正: 甚く

・・・だと思っていたんだが、↓ 見ると両方書いてあるのな。
http://dictionary.goo.ne.jp/cgi-bin/dict_search.cgi?MT=%BF%D3%A4%AF&sw=2

81 名前:デフォルトの名無しさん :03/01/28 23:11
>>79
お疲れさまです。
オッチャンも全くそう思うんですが、使い分けの基準がハッキリしないのが気に入らないのです。
さっきの引数の話でもそうですが、「なるべく参照を使うようにして、無理なところはポインタ」っていうのでいいんでしょうか。曖昧だなあ…。それならもう最初から全部ポインタでも良いような…。

82 名前:デフォルトの名無しさん :03/01/28 23:12
>>78
あなたが、そこに例の挙がっているようなミスを犯さなければ、ポインタを避ける
理由は何も無いのだが。
それにポインタが無いと、C++ のうまみである多態がコードで表現できない。
人の論を参考にするのはいいが、鵜呑みにはするなよ。

83 名前:デフォルトの名無しさん :03/01/28 23:18
>>82
>あなたが、そこに例の挙がっているようなミスを犯さなければ、ポインタを避ける
まあそうですが、間違いが起こりにくくなるならそれに越したことは無いかなあと思うわけでして・・・。
>それにポインタが無いと、C++ のうまみである多態がコードで表現できない。
や、とりあえず関数の引数についてだけでいいです。
>人の論を参考にするのはいいが、鵜呑みにはするなよ。
肝に銘じます。こうもっともらしく書かれると信じてしまいがちですからなぁぁあ

84 名前:デフォルトの名無しさん :03/01/28 23:37
>>73
あくまで漏れの意見ね。参考程度に。

> void SetCurRecord(const CRecord *curRecord);

これは、Recordset のようなオブジェクトを作って、カレントはインデックスで
管理した方がいいと思う。

> void GetProperty(short *prop1, short *prop2 = NULL, short *prop3 = NULL);

どんな時にこれが必要になるのかわからない。

Property prop1;
prop1.get();

とかのが好き。

85 名前:デフォルトの名無しさん :03/01/29 00:27
>>84
どうもです。
>これは、Recordset のようなオブジェクトを作って、カレントはインデックスで
ああ・・ちょっと上手く伝わらなかったでしょうか
例えばプレビューウィンドウにSetImage(const CBitmap *image);とやるところをSetImage(NULL);ってやったら表示してた絵が消えるとか
他にも色々あると思うんですよ、NULLを渡したい時が
>どんな時にこれが必要になるのかわからない。
何が言いたかったのかといいますと、デフォルト引数にNULLが使えると色々便利だと思ったのです。
他にもWin32APIでもデータへのポインタorNULLを引数に取るやつが色々あります。
その場合、引数には参照しか使わないというルールをゴリ押しすると、何か空(デフォルト)のオブジェクトを作って引数に渡すという無駄な事が発生するので嫌だなあ、と。

86 名前:デフォルトの名無しさん :03/01/29 00:28
>>78
途中まで読んだけど何やねんコレ…
  char * abc_str = "aBC" ;
  abc_str[0] = 'A' ; /* 'a'->'A'に上書き */

87 名前:デフォルトの名無しさん :03/01/29 00:32
>>86
>バグその1「ポインタの構文や概念は理解しにくい」
こういう間違いが起こり得ると言う事が言いたいのでは

88 名前:デフォルトの名無しさん :03/01/29 00:34
洗練されたC++プログラムからはポインタが消え失せるというのは判る。
実際そうだし。でも78のはちとズレてるな。

89 名前:デフォルトの名無しさん :03/01/29 00:37
>>87
こんな事書いたら例えポインタを本当に理解してても
筆者がポインタを理解してないだけってオチで落ち着くと思うけど

90 名前:デフォルトの名無しさん :03/01/29 00:38
せめて
char abc_str[] = "aBC";
だよなぁ。

91 名前:デフォルトの名無しさん :03/01/29 00:39
で、関数のパラメータはポインタか参照かドッチ?というか、どう使い分ければ?

92 名前:デフォルトの名無しさん :03/01/29 00:46
>>88
> 洗練されたC++プログラムからはポインタが消え失せるというのは判る。
OO で設計する限り、ポインタ自体は消えないだろう。ただ寿命管理に関して、
手作業で delete する機会は、ほぼなくなるが。

>>91
NULL がありえるならポインタ。なければ参照。
その場で値を作って渡したいなら const 参照。

93 名前:デフォルトの名無しさん :03/01/29 00:56
>>92
なるほど。保存しますた。
このページ面白いっすよ。ほかにもデータ指向
http://member.nifty.ne.jp/yamazaki/doc_data01.html
http://member.nifty.ne.jp/yamazaki/doc_data02.html
とかある。

94 名前:デフォルトの名無しさん :03/01/29 00:58
>その場で値を作って渡したいなら
そういうコンストラクタがある場合だよな

95 名前:デフォルトの名無しさん :03/01/29 01:05
>>92
> OO で設計する限り、ポインタ自体は消えないだろう。ただ寿命管理に関して、
C++で設計する限りの間違い。


96 名前:デフォルトの名無しさん :03/01/29 01:11
微妙にズレてるってことは78のページの人が来たのか?

97 名前:デフォルトの名無しさん :03/01/29 01:15
>>95
別に間違いじゃないだろ?

97ゲットオォォォォ!!
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄       (´´
     ∧∧   )      (´⌒(´
  ⊂(゚Д゚⊂⌒`つ≡≡≡(´⌒;;;≡≡≡
        ̄ ̄  (´⌒(´⌒;;
      ズザーーーーーッ

98 名前:デフォルトの名無しさん :03/01/29 01:23
>>94
Yes

そもそも「その場で値を作って渡す」という使い方をするのは、string や complex
のような値指向のクラスがほとんど。仮想関数無し、代入・コピーありってヤツね。

99 名前:デフォルトの名無しさん :03/01/29 01:24
スマートポインタの所有権の概念が理解できんな。
ヒープに作ったオブジェクトをdeleteしてくれるだけで十分なのに。
どういう使い方するんだこれ

100 名前:デフォルトの名無しさん :03/01/29 01:25
そういえば pImpl がお気に入りになってからは
ユーザーコードからはポインタ減ったな。

内部的には増えたわけですが。

101 名前:デフォルトの名無しさん :03/01/29 01:25
>>99
どのスマートポインタについて言ってるんだ?

102 名前:デフォルトの名無しさん :03/01/29 01:27
>>101
STLのauto_ptrとか

103 名前:デフォルトの名無しさん :03/01/29 01:29
pImplってなんや

104 名前:デフォルトの名無しさん :03/01/29 01:31
>その場で値を作って渡したいなら const 参照。
ドーユー事?もっとアホにも分かるように言ってくれ

105 名前:デフォルトの名無しさん :03/01/29 01:45
>>102
所有権移転の使い道が分からんわけか。これは、例外安全絡みで必要になる。
例えば、この辺参照。

http://www.gotw.ca/publications/xc++-auto_ptr.htm

106 名前:デフォルトの名無しさん :03/01/29 01:45
>>104
void aho(const std::string& aho);
aho(std::string("aho"));

107 名前:デフォルトの名無しさん :03/01/29 03:19
>>99
ヒープに作ったオブジェクトを「誰が」deleteしてくれるのか
を決めるのに、所有権の概念が必要。例えば

typedef char* char_ptr;
char_ptr hogehoge() { return new char[100]; }
char_ptr q = hogehoge();

のchar_ptrをスマートポインタ化することを考えると、hogehogeの返値の
テンポラリオブジェクトが破棄される瞬間(2行目の文が終わる瞬間)に
deleteされちまったら困る…(この文の後でqを使えないのでは無意味)。

だから例えばstd::auto_ptrの場合、テンポラリからqにポインタがコピーされたら、
その時点でqに「所有権」を移して、q以外のオブジェクトは勝手にdeleteしないようにする。

なので、俺はスマートポインタのコピーなんかしねぇぞ! という人には
auto_ptr は確かに不要だと思う。そんな貴方には boost::scoped_ptr をオススメする。

だけど普通、「いろいろ複雑にポインタを渡しまくるけど、確実にどこかで
deleteはせねばならん」 という厄介な問題を自動的に解決するために
スマートポインタを使うもんだと思うので、所有権付きのは無いと結構
困ると思うがどうか。

108 名前:107 :03/01/29 03:21
やべぇ一箇所大嘘だ。
> char_ptr hogehoge() { return new char[100]; }
こんなもんauto_ptrでは解放できんので、
> char_ptr hogehoge() { return new char('a'); }
とかで一つよろしく。

109 名前:デフォルトの名無しさん :03/01/29 06:50
質問です。
#include<iostream.h>
class test1
{public: int t1;};
class test2
{private: test1 *ts1l;
public:
 void ts2(test1&);
 void setlink(test1&); //関連をつなげる関数
 void test();};
void test2 :: ts2(test1 &tst1)
{ cout<<"ts2 :"<<tst1.t1<<endl;}
void test2 :: setlink(test1 &tst1)
{ *ts1l=tst1;}
void test2 :: test()
{ cout<<"test:"<<ts1l->t1<<endl;}

void main(void)
{
 test1 *tt1; test2 *tt2;
 tt1 = new test1; tt2 = new test2;
 
 tt2->setlink(*tt1); 
 tt1->t1=11;
 tt2->ts2(*tt1);
 tt2->test(); 
 delete tt1,tt2;
}
を実行すると、test2::test()の方の挙動がおかしくなります。tt1->t1が変化しても動的に変化してくれません。
何故でしょうか?

110 名前:デフォルトの名無しさん :03/01/29 07:12
解決しますた。

111 名前:デフォルトの名無しさん :03/01/29 10:54
>>107
> 「いろいろ複雑にポインタを渡しまくるけど、確実にどこかで
> deleteはせねばならん」 という厄介な問題を自動的に解決するために
> スマートポインタを使うもんだと思うので
その場合は auto_ptr も使い物になりませんがな。shared_ptr か、もしくは
侵入型ポインタを使う必要がある。

112 名前:デフォルトの名無しさん :03/01/29 11:52
C++ で getchar() みたいな一文字取得する方法ってどんなですか?

113 名前:デフォルトの名無しさん :03/01/29 11:54
それと itoa() みたいな数値から文字列に変換する方法も教えてください。

114 名前:C++厨@void :03/01/29 13:37
>>112
ひょ準入力からの一文字取得なら
int i = cin.get();
とか(最後はEOFが返るはず)

>>113
ostringstream ostr;
ostr<<"manko: "<<999<<endl;
string s = ostr.str(); //(*´∀`)

115 名前:デフォルトの名無しさん :03/01/29 14:55
>>114
ありがとうございます!

もうひとつ質問があるのですが、conio.h の getch()
みたいなキーを押したらすぐ返るようなものはないでしょうか。

116 名前:デフォルトの名無しさん :03/01/29 15:23
ファイルの加工をしようと次のようなコードを書いてみたのですが、
なぜかファイルを上書きしてくれません。どの辺りがおかしいのでしょうか。
コンパイラはborlandです。

using namespace std;

int main()
{
fstream file("foo.txt",ios::in | ios::out);

string tmp;
vector<string> buf;
while(getline(file,tmp)){
buf.push_back(tmp);
}

file.seekg(0);

for(unsigned int i = 0; i != buf.size(); i++){
中略
file << buf[i] << endl;
}

file.close();

return 0;
}

117 名前:デフォルトの名無しさん :03/01/29 15:28
>>116
file.seekp(0);

118 名前:デフォルトの名無しさん :03/01/29 15:31
配列要素数0の変数って、どういう扱いになるんでしたっけ?
移植中のあるソースで使いまくってて、、

struct hoge {
int Length;
char Data[0];
int exSize;
char ExData[0];
}

みたいなんです。
ここの Data や ExData に、Length もしくは exSize長のデータを
割り当てたい場合はどうすればいいんでしょうか?

119 名前:116 :03/01/29 15:37
>>117
.seekp()にしても上手く行かないようです。

120 名前:C++厨 :03/01/29 15:43
>>116
file.clear()してみてはどうかすら(てきとう)

121 名前:116 :03/01/29 15:47
>>120
できました。
eofbitが立ってたのに全く気づきませんですた。
ありがとん。

122 名前:C++厨 :03/01/29 15:51
>>115
規格書持ってないので詳しくはわからないけど恐らく標準には無いと思うよ。

123 名前:118 :03/01/29 16:05
意味わかったっす・・・

124 名前:69 :03/01/29 18:59
>>70
>オブジェクトのポインタで充分ではない理由があったら聞かせてくれ。

ポインタを使いたくないから、ハンドルを使いたいんです。
ライブラリ利用者に、ライブラリ内部のメモリに直接アクセスされたり、
ポインタを保持されたりしたくないんですよ。
というか、現在は参照のみでポインタは一切使ってません。

できるだけポインタ使わないのが当然かと思ってたのですが
ここの板を見ると業界的にはそうでも無いようですね。
いや、べつに煽りでもなんでもないですよ。


125 名前:デフォルトの名無しさん :03/01/29 19:07
>>124
何の用があって内部のメモリを指すようなハンドルが必要なんだ?
全部クラス内に隠蔽して処理すればいい。

126 名前:デフォルトの名無しさん :03/01/29 21:00
>>118
普通はポインタにするんではなかろうか?
structの中の配列はどうやったって固定長だ

127 名前:デフォルトの名無しさん :03/01/29 21:15
スマートポインタってどうやって(何に)使うんですか。教えて偉い人

128 名前:デフォルトの名無しさん :03/01/29 21:27
>>127
new したオブジェクトはほぼ全ての場所でスマートポインタを使うことが望ましい。
コードが例外を throw した時、プログラムは delete をすっ飛ばして呼び出し元に飛んでく可能性があるので、その場合も正しくオブジェクトを破棄するために使用する。

実際最も一般的なのは、単一のオブジェクトを複数の場所で参照している場合、どのタイミングで削除するべきかをカプセル化したい場合など。

またC/C++では、単体オブジェクトと配列でdeleteとdelete[]を使い分けなければいけないが、一度ポインタに格納してしまうと区別がつかなくなる。
スマートポインタでこの問題を解消できる。
他にもNULLポインタにアクセスしようとした時にアクセス違反ではなく独自の例外を throw したり、新しくオブジェクトを作成することで何事もなかったかのようにプログラムを続けたり。
delete できないようにしたり、あるいは delete されてもまた必要になったら自動的に new しなおしたり。
ログを取ったり。
など、いくらでも考えられると。

129 名前:118 :03/01/29 21:33
>>126

void *aaa;
struct hoge *hogehoge;
aaa = malloc( 100 );

hogehoge = aaa;

memcpy( hogehoge->Data, moe, 80 );

みたいに使ってますわ。
memcpy( ((struct hoge*)hogehoge)+1, moe, 80 );

と同じ意味になるようですな


130 名前:デフォルトの名無しさん :03/01/29 21:47
すんません、少し聞きたいことが・・・

classの中にpublicで、
LPBYTE bDat
LPBITMAPINFO bInfo  というのがあって、

それらをGlobalAlloc()で領域を確保してます。
これで画像を表示したいんですが、表示されません。

classのメンバをGlobalAlloc()で確保してはいけないんでしょうか。
コードはプロシージャ内に記述していたときは動作しました。
クラスメンバ関数ではない関数で、上記二つの変数を渡した時は動きませんでした。

・・・何がいけないのか検討がつきません。お願いします・・・

131 名前:デフォルトの名無しさん :03/01/29 21:49
>>130
> classのメンバをGlobalAlloc()で確保してはいけないんでしょうか。
そんなことはない。

132 名前:デフォルトの名無しさん :03/01/29 22:43
>>128
なるほど。う〜ん、、、、便利なような気がする

133 名前:デフォルトの名無しさん :03/01/30 01:07
>>130
> ・・・何がいけないのか検討がつきません。お願いします・・・
質問する場所さえ判断を間違えている事。

134 名前:デフォルトの名無しさん :03/01/30 04:51
>>133
(・∀・)ニヤニヤ

135 名前:デフォルトの名無しさん :03/01/30 09:47
>>118
C ではよく使うテクニックだけど、C++ でこれをやるのはアホ。
あと、118の構造体の定義は破綻してると思うが。

136 名前:デフォルトの名無しさん :03/01/30 10:04
>>135
要素数 0 配列って、どう考えても末尾に 1 つだけだよな…

137 名前:135 :03/01/30 10:38
自己レス。
すまん、アホとまでは言い切れないな。可変長のパケットデータなんかを扱う
ときはああいう構造体はたしかに便利だ。
ただヘッダー部とデータが連続している必要がないところでは、ヘッダー部に
データへのポインタを持たせて、コンストラクタで new してやるのが普通だろう。

138 名前:デフォルトの名無しさん :03/01/30 12:22
>>132


139 名前:デフォルトの名無しさん :03/01/30 20:11
文字列を引き数で受け取るメソッドがあります。
引き数の型にはconst char*型を指定するのが良いのかと思いますが、
このプログラムの中ではstd::stringばっかり使われており、
受け取った側でもstd::stringにして使いたいと思っています。
それなら最初からconst std::string&とかを受け取るようにしても良いのでしょうか。
オシエテよ!

140 名前:デフォルトの名無しさん :03/01/30 20:20
戻り値をstd::stringにすることと、引数をstd::string const&にすることは別問題だと思うが。
まぁどちらにせよstd::stringを使うのがC++としては普通だわな。
戻り値のstd::stringはオーバーヘッドが大きいから気を付けな。

141 名前:140 :03/01/30 20:23
あぁ、すまん。
受け取った側ってのはそのメソッドのことか、
じゃぁ何も考えずにstd::string const&でいいんでない?
呼び出し元もstd::stringを使ってるならオーバーヘッドはないし。

142 名前:デフォルトの名無しさん :03/01/30 22:04
>>141
どうもです。やっぱりそれでイイんですか。
MFCとかだとconst CString&じゃなくてLPCTSTRを受け取るやつばっかりですよね。
だから何か意味があるのかと思ってたんですが。あれって何でですかね。

143 名前:デフォルトの名無しさん :03/01/30 22:24
>>142
MFC だと、たいてい const CString& 取る関数も定義されてるけど。

たとえば…
CSize GetTextExtent(const CString& str) const;
int DrawText(const CString& str, LPRECT lpRect, UINT nFormat);


144 名前:デフォルトの名無しさん :03/01/30 22:27
>>142
どうだっけな・・・
MFC の CString は内部で参照カウンタを使うことでインスタンス生成時のオーバーヘッドを軽減していたと思うから、CString const& で受け取ってもあんまり代わらないんじゃなかったかと思うけど。
まぁ忘れた。もしかしたら↓と同じ理由かも。

std::string の場合、
char const* -> std::string の変換はかなり重い。
逆は大抵最適化で消滅するほど軽い。

だから引数を std::string const& で受け取ると。
Method( "text" );
のように呼び出すたびにかなりのタイムロスを引き起こす。

char const* で受け取っていれば。
Method( some_string.c_str() );
としてもほとんどロスはない。

145 名前:デフォルトの名無しさん :03/01/30 22:29
>>143
そうだったんですか
じゃあMFC使ってコード書くときにconst std::string&を受け取るメソッドばっかり作っても笑われないすかね
CStringと両方作るべきですか どうなんでしょう

146 名前:デフォルトの名無しさん :03/01/30 22:36
>>144
レスどうもです。
>char const* で受け取っていれば。
>Method( some_string.c_str() );
>としてもほとんどロスはない。
ええ、僕もそう思ったんです。けど、Method()の中でまたstd::stringにして使うんです。
それなら全部const std::string&で統一して、const char*を全廃しようかと思う訳です。
#でもMFC使ってアプリ組むならconst CString&で統一ってのもアリかと思うんですが、これはマズイですか。

147 名前:デフォルトの名無しさん :03/01/30 22:38
>>146
MFC使うならCStringで統一した方が効率的。

148 名前:デフォルトの名無しさん :03/01/30 22:45
MFC用だと割り切ってるのに悩む必要があるのかと小一時間

149 名前:デフォルトの名無しさん :03/01/30 22:52
そんな事言ったってなるべく標準のものが使いたいじゃないですか気分的に。
例えばファイル名を受け取って画像を読むような関数ならstd::string使いたいですよ。
何か別のMFC使わないアプリ(もしかしたらMac用とか)作るときに再利用するかもしれないですし。
そういう時のためにMFCのCStringとかCListとかCMapとかそういったモノで汚染されたコードは
作りたくないです!!

150 名前:デフォルトの名無しさん :03/01/30 22:54
>>149
それを言うならCStringとstd::stringが混在してるコードの方がよっぽど作りたくないが・・・。

151 名前:デフォルトの名無しさん :03/01/30 22:59
>>149
自分でCString型つくっときゃ済む話しだろ。
ペアで使うようにすりゃいいじゃん。

152 名前:デフォルトの名無しさん :03/01/30 23:10
>>150
ホンダラどないせぇっちゅうんじゃゴラアアアア!
ライブラリとして切り離せそうなクラスはstd::stringで統一/MFCに近い部分はCStringにするとかエエと思うんですが。

>>151
それはCStringに相当するものを自分で作れと言うことですか
ちょっとよくわからないんdすが

153 名前:デフォルトの名無しさん :03/01/30 23:12
>>152
そうだよ、作れよ、そのぐらい。

154 名前:デフォルトの名無しさん :03/01/30 23:15
「かもしれない」はムダの元。

155 名前:デフォルトの名無しさん :03/01/30 23:15
>>152
逆切れは勘弁してくれ。
MFC使ってアプリ組むならっつーからCString使えっつってるだけじゃんよ。
そのライブラリが一番近い環境に合わせればいいじゃん。
画像を読み込む時にWin32APIを使うならLPCTSTRを使えば良いし、
CBitmapを使うんならCStringを使えば良いし、
STLを使うんならstd::stringを使えば良いし、
全部自前でやるんならchar const*を使えば良いだけの話だろ。

156 名前:デフォルトの名無しさん :03/01/30 23:16
>>149
> そんな事言ったってなるべく標準のものが使いたいじゃないですか気分的に。
そもそも MFC 使ってる時点で「標準」に拘る意味はない。本気でマルチプラットホーム
対応にするなら Mozilla のように MFC 捨て捨てで、もっと下のレイヤーから作り込ま
ないと。

157 名前:デフォルトの名無しさん :03/01/30 23:20
>>156
下の階層から作ると依存性が高くなると思うが。


158 名前:デフォルトの名無しさん :03/01/30 23:31
>>153
それは一番よくないと思います!STLの本の冒頭に「貴方は既に他人が作ったコードを自分で作り直して云々、車輪の再発明云々」
ってかいてありましたよ

>>154
イヤッハハ、まあそうおっしゃらずに・・・
でも画像読み込み関数なんて絶対MFCと分離したいと思いませんか

>>155
>MFC使ってアプリ組むならっつーからCString使えっつってるだけじゃんよ。
たしかにそんな気もします。MFC使ってるんだからMFCの流儀にあわせてコーディングする。
これはコレで正しいと思います。MFCがCString用意してるのに無理してstd::stringを
使うというのもヘンかもしれないですね

>>156
それはどうなんでしょうか。。。確かに幸せな世界が来るかも知れません。。
でも凄いマイワールド展開しまくりな上に、凄い手間がかかりそうです。そこまではできないので、
出来る範囲で汎用的なコードを書きたいのです

159 名前:デフォルトの名無しさん :03/01/30 23:37
158は低脳を装った煽りか。

160 名前:デフォルトの名無しさん :03/01/30 23:38
漏れは、LPCTSTRを見ると、ユニコードでなんか絶対ビルドしないと分かってるのに、
char *を渡すのを躊躇ってしまう。同様にしてstd::stringも。
で結局、TCHARかCString・・・

161 名前:デフォルトの名無しさん :03/01/30 23:40
>>160
#ifdef _UNICODE で std::string, std::wstring 切り替えれば? 俺は WTL::CString
使うけど。

162 名前:デフォルトの名無しさん :03/01/30 23:41
俺はマルチバイトの処理が面倒なので内部はみんなstd::wstringだ、
そしてVC++付属のSTLのバグに悩まされたり、STLPortのコンパイルオプションの違いに翻弄されたりするんだ。
それでも何も考えずに++itrで次の文字に移れるのはめちゃくちゃ幸せだ・・・

163 名前:デフォルトの名無しさん :03/01/30 23:55
class CFileData{
public:
 CFileData(char *filePath);
 virtual ~CFileData();

protected:
 BYTE *m_pBuff;
  :
  :

こういうクラスを作っています。コンストラクタでデータファイルを開き、
m_pBuffに格納する仕組みです。
そこで質問なのですが、コンストラクタでデータの読み込みに失敗した場合、
失敗したかどうかはどうやって判定すればいいのでしょうか?
後で、bool IsSuccess()みたいな関数を呼んでやら無いといけないでしょうか?
それとも、コンストラクタでデータを読むという仕様自体が間違っているでしょうか?
アドバイスください。

164 名前:デフォルトの名無しさん :03/01/30 23:57
>俺はマルチバイトの処理が面倒なので内部はみんなstd::wstringだ、
お前は贅沢だ、贅沢は許さん

165 名前:デフォルトの名無しさん :03/01/30 23:58
>>163
例外を飛ばしたり operator bool を定義する

166 名前:デフォルトの名無しさん :03/01/31 00:00
>>163
素直に

class CFileData{
public:
 CFileData();
 virtual ~CFileData();
 bool Read(char *filePath);

とでもしておけば?

167 名前:163 :03/01/31 00:10
>>165
>>166
わかりますた。

168 名前:デフォルトの名無しさん :03/01/31 00:30
C++でCSV形式のファイル読み込むのに
なにかスマートでいい方法ないですかね

stringにいれてsubstr()でとっていくとか
istreamのget()かgetline()でdelimiterを’,’にして
よんでいくとか方法はいろいろあるんですけど
なかなかうまい方法みつからなくて


169 名前:デフォルトの名無しさん :03/01/31 00:32
Windowsに設定されている、DNSサーバアドレスを取得するにはどうすればよいのでしょうか?
やはりWinsockを使用するのでしょうか?

170 名前:デフォルトの名無しさん :03/01/31 00:51
>>169
Windows 系のスレに逝って。

171 名前:169 :03/01/31 00:55
>>170
逝ってきます・・・。

172 名前:デフォルトの名無しさん :03/01/31 00:57
namespace X
{ enum { E = 1 }; }
struct X
{ enum { E = 2 }; };

int f(){ return X::E; }

「あいまいです」とか言われそうなもんなんですが、
エラーも警告もなんにもでないんです。
同じ名前の名前空間とクラスが :: で指定されたとき、
どのように振舞うような仕様なのでしょうか?

ちなみに、gcc3.2 では、 f()==2 になります。

173 名前:デフォルトの名無しさん :03/01/31 01:21
>>172
BCC 5.5.1 では
エラー E2238 TestCon.cpp 6: 'X' の宣言が複数見つかった

174 名前:172 :03/01/31 01:29
>>173
ありがとうございます。
MSVCでも試してみたら、エラーになりました。
gccがバグってんのかな?

175 名前:デフォルトの名無しさん :03/01/31 01:32
C だと struct って独自の名前空間を持ってたけど、C++ だとどうなんだろ。
キーワード struct が省略可能ってことは、やっぱり普通のグローバルになる
のかな。
だとすれば gcc は間違ってると思うけど・・・規格博士降臨キボンヌ。

176 名前:デフォルトの名無しさん :03/01/31 04:14
3.3 -4
a namespace name or a class template name must be unique int its declarative region.

3.3.7
A class name or enumeration name can be hidden by the name of an object, function, or enumerator declared in the scape.

7.3.2 -4
A namespace-name 〜 not 〜 same declaretive region.

つまり、クラス名と列挙名はオブジェクトや関数に隠されるけど、ネームスペース名と
テンプレートクラス名は、宣言空間でユニークじゃなくちゃいけないってか。
gccの負け?

177 名前:176 :03/01/31 05:13
じゃあ、こんなことも可能なのか・・・
class A{}A,B; //OK.
class C{};
C C; //OK.
C D; //Error.

178 名前:デフォルトの名無しさん :03/01/31 08:00
newで確保した領域は
mainが終了すると勝手に解放されますか?

179 名前:デフォルトの名無しさん :03/01/31 08:31
>>178
勝手には解放されません。deleteすれ。
new[]で確保したものはdelete[]で。
それがいやなら、スマートポインタでも使ってくれ。

180 名前:デフォルトの名無しさん :03/01/31 08:46
環境依存の話はよそでやって

181 名前:デフォルトの名無しさん :03/01/31 10:47
>>178
まともなOSだったら解放される。しかし、delete しないということは
デストラクタも呼ばないわけ? それだとまずいことが多々おきそう。

>>180
これくらいなら環境依存というほどでもないっしょ。

182 名前:デフォルトの名無しさん :03/01/31 20:56
mainが終わって、グローバルに置いたオブジェクトのデストラクタが
呼ばれた後は、何が起こるか未定義だな。

183 名前:デフォルトの名無しさん :03/01/31 21:12
本当にしょうも無い質問でごめん。
C++でJavaみたいにWebアプリケーションの開発って出来ます?
仮にできるとしたら、Javaに勝っていますか?

本当にどうしようもない質問でごめん。。。

184 名前:デフォルトの名無しさん :03/01/31 21:24
>>183
しょうもないので却下。

185 名前:デフォルトの名無しさん :03/01/31 21:43
>>183
「Javaみたいに」とはどんな特徴のことだ?
C++でできるか否かはそれに因る

186 名前:デフォルトの名無しさん :03/01/31 21:46
>>183
CGIをWebアプリと呼べるのならできる。
もしくは、JavaをC++で作ってやるとか
JavaのコードをC++で生成するとか(以下略)。

>勝っていますか?
しょうもないので却下。

187 名前:デフォルトの名無しさん :03/01/31 22:33
>>168
ttp://www.s34.co.jp/cpptechdoc/article/xml/csv2xml/index.html

188 名前:デフォルトの名無しさん :03/01/31 22:50
ファイル間の依存関係を軽減するために
class CData;

class CDocument {
 CData *m_data;
・・・
こういう風にしてCDocumentのコンストラクタでm_data = new CData;やってます。
でもこれだとdelete忘れたり色々鬱陶しいので、できることなら
#include "CData.h"

class CDocument {
 CData m_data;
・・・

こんな風にしたいと思っています。何かいい手はないでしょうか。

189 名前:デフォルトの名無しさん :03/01/31 22:51
>>188
そんなあなたにauto_ptr

190 名前:デフォルトの名無しさん :03/01/31 23:04
>>189
ポインタになってるのがそもそも嫌なんです。deleteできちゃうっていう状況が嫌です。
でも依存関係は減らしたいのです。
例えば標準のstringが気に入らなくて、自分で作ったCMyStringがあるとします。
もうこれはアプリの中にあっちこっちで使われてる上に、今後UNICODEをエンコードしたり、
色々な機能を追加させる予定だとします。
こういう場合どうしたらいいですか。

191 名前:デフォルトの名無しさん :03/01/31 23:06
>>190
そんなあなたにconst auto_ptr

192 名前:デフォルトの名無しさん :03/01/31 23:09
string如きにコンストラクタでいちいちnewしたりするのもめんどくさいです

193 名前:デフォルトの名無しさん :03/01/31 23:10
>>190
なにを聞きたいかがまったく分からん。

CMyString(char *str) {
this->str = charToUnicode(str);
}
って書いてchar型で渡されたらUnicodeに変換して、内部でUnicodeで管理すればいーじゃん。
外部からはどっちで渡されてもOKにしといて。

194 名前:デフォルトの名無しさん :03/01/31 23:17
つーか、自分でfacet作るなりどっかから持ってくるなりすれば標準ライブラリ使って
Charsetの変換とかもできるようになってるんだけどな、C++は。

195 名前:デフォルトの名無しさん :03/01/31 23:20
>>193
>>194
stringは例え話です
僕が質問したいのは>>188の依存関係の問題です

196 名前:デフォルトの名無しさん :03/01/31 23:21
>>195
>>189 >>191
boost::scoped_ptr でも良いぞ。

197 名前:デフォルトの名無しさん :03/01/31 23:23
依存関係を減らすのにpImplイディオムが有名だ、
しかしコンストラクタでnewしたくないめんどくさがり屋にはお勧めできない。

さらに依存関係をほとんど無くすのにJavaが有名だ、
しかしこちらは全てのオブジェクトをnewする必要があるのでますますお勧めできない。

依存関係とめんどくささはトレードオフの関係にあるようだ。

198 名前:デフォルトの名無しさん :03/01/31 23:24
>>196
ていうか、そういうのって一般的なんですか。あんまりそういうのやってるって聞いたこと無いんですが。
メンバのオブジェクトというオブジェクトを全部scoped_ptrとかで持ったりしたら、
人に見せたときに「うわーなんだこのプログラム!バカがいるYO!」とか言われないですか。

199 名前:デフォルトの名無しさん :03/01/31 23:30
>>197
>依存関係を減らすのにpImplイディオムが有名だ、
それは名前から察するにEffective-C++でも紹介されていた、実装クラスとインターフェースクラスを
分離するっていうテクですか。
>しかしコンストラクタでnewしたくないめんどくさがり屋にはお勧めできない。
それもそうですけど、これでもインターフェースクラスに変更があったら再コンパイルですよね。。。
それならauto_ptr使うほうがまだ良い気がします。ファイルの増殖を防げますし。
>さらに依存関係をほとんど無くすのにJavaが有名だ、
ああ、なんかありますよね、、、ゲーム作りたいのでJAVAだと速度が心配です。
>依存関係とめんどくささはトレードオフの関係にあるようだ。
了解しますた。

200 名前:デフォルトの名無しさん :03/01/31 23:30
>>198
scoped_ptrのソースを持ってきて、そのコンストラクタを書き換えて自動的にnewするようにすれば君のやりたい事が実現できる。
毎回newを書かなくても、その独自のscoped_ptrを使えば自動的にインスタンスが作られる。
それを馬鹿だと言うやつには経緯を説明して、それでも理解できなければそいつがバカだと笑ってやるがいいよ。

201 名前:デフォルトの名無しさん :03/01/31 23:39
>>198
ふつーはメンバのオブジェクトを個々に scoped_ptr で持たずに pimpl イディオム
使うけどな。Effective C++ じゃなくて Exceptional C++ ね。

> それもそうですけど、これでもインターフェースクラスに変更があったら再コンパイルですよね。。。
それは仕方ない。

ただ、影響を最小限に留める方法としては、

1. 純粋仮想関数だけからなるインターフェースクラスを分離
2. 実装側は、そのインターフェースを継承して vtbl を埋める
3. クライアントはインターフェースだけを見る

って手がある。

インターフェースを拡張する場合、既存のインターフェースには手を加えず、別のイン
ターフェースを定義して、それを実装側に継承させる。(インターフェースの多重継承
というヤツやね。COM でも良く使われてる)

202 名前:デフォルトの名無しさん :03/01/31 23:39
>>200
うわっ、本当だ、画期的だ。それってスゴくないですか!!??
心配なんですが、scoped_ptrみたいなクラスのテンプレート引き数って、includeしてないやつでもOKですよね!?
うーむ。これは新しい。。。演算子オーバーロードしてポインタに見えなくするとか、色々出来そうですね

203 名前:デフォルトの名無しさん :03/01/31 23:52
>>201
>インターフェースを拡張する場合、既存のインターフェースには手を加えず、別のイン
>ターフェースを定義して、それを実装側に継承させる。
ははぁ、、、なるほど、、、色んなワザがあるんですねえ。こんな感じでいいんですか。

class CImpClass : public CInterfaceVer1, public CInterfaceVer2 ...
{
};

うーむ

204 名前:デフォルトの名無しさん :03/02/01 00:07
>>200
やってみましたけど、テンプレートクラスの中で目当てのオブジェクトをnewできないじゃないですか!
作りたいクラスの名前しか分からないからnew出来ない、そりゃそうか、、、

205 名前:デフォルトの名無しさん :03/02/01 00:13
>>204
template< typename T > class ptr_container
{
public:
 ptr_container(void) : m_ptr( new T() ){}
 ~ptr_container(void){ delete m_ptr; }

private:
 T* m_ptr;
};

ってできないっけ?

206 名前:デフォルトの名無しさん :03/02/01 00:20
>>205
こういうのは無理みたいです
#include "ptr_container.h"
class CData;

class CDocument {
ptr_container<CData> m_data;
};
コンパイルエラーになります。CData.hをインクルードしたらいけますけど、
それだと最初の目的が達成できないです。

207 名前:デフォルトの名無しさん :03/02/01 00:25
>>206
俺はできたよ。
普通にポインタ使うときと同じように、しかし初期化する必要なく。

CDocumentの実装ファイルには当然CData.hをインクルードするよ。

208 名前:デフォルトの名無しさん :03/02/01 00:27
>>205
無理。new する時点で、そのクラスの定義が見えないと NG なんで。

別のクラスにインスタンス構築を押しつけるって手はある。

template <calss T, class TFactory>
class ptr_container
{
public:
  ptr_container() : m_ptr(TFactory::Create());
  ~ptr_container() : { delete m_ptr; }
private:
  T* m_ptr;
};

struct FooFactory
{
  static Foo* Create();
};

209 名前:デフォルトの名無しさん :03/02/01 00:28
>>207
> CDocumentの実装ファイルには当然CData.hをインクルードするよ。
……スレの流れを読め。

210 名前:デフォルトの名無しさん :03/02/01 00:32
>>209
俺はスレの流れを正しく把握してるって
188を読むからに206はCDocumentの実装ファイルにCData.hをインクルードする事はかまわないと言っている。

211 名前:デフォルトの名無しさん :03/02/01 00:40
予期しない 'class' 'one_image' です。
と書かれて一つのメンバ変数が指されるんですけど
どういうこと?

212 名前:デフォルトの名無しさん :03/02/01 00:41
>>210
スマン

213 名前:デフォルトの名無しさん :03/02/01 00:45
>>207
ごめんなさい、いけました。includeする順番間違ってました。
これマジ凄いですよ、みんな使いましょうよ。
今時これくらいならオーバヘッドだってあんまり気にならないでしょう。

ところでちょっと謎な現象なんですが、
CDocument.cppの中でCData.hを正しい順番でインクルードしないとエラーになるというのは分かります。
で、ためしにCHoge.cppってのを作って、その中ならCDocument.h単体でインクルードしてもエラーにならないのは
どういう事なんでしょうか。なんか勘違いしてますか僕

>>210
はい、CDocument.cppの中でCData.hをインクルードするのはOKです。
でないとCDataを触れないですからね。

214 名前::03/02/01 00:47
いままでJAVAの勉強していてc++は文法理解した程度です。
c++でXMLを扱おうとしてxerces-cを使っているのですが、
サンプルをコンパイル時に

fatal error C1083: インクルード ファイルがオープンできません。'xercesc/util/PlatformUtils.hpp': No such file or directory

とエラーが発生しました。
設定的な問題だと思うのですがどう対処すればいいのでしょうか?

215 名前:213 :03/02/01 01:17
みなさんありがとうございました、色々やってみましたがいけそうです。
え〜と混乱してしまいましたけど、
CDocument.cppでCDocument.hをインクルードする時にCData.hもインクルードする必要があるのは、
CDocument.cpp内にCDocumentのコンストラクタの実装があるから。
CHoge.cppでCDocument.hを単体でインクルードしても、CDataを触ったりしない限りCData.hをインクルードしなくてもコンパイルとおる。
という理解で良いでしょうか。
ていうかこれって凄いアイディアじゃないですか。STLに入れて貰えそうじゃないですか

216 名前:デフォルトの名無しさん :03/02/01 01:27
>>215
おけ。
でもデフォルトコンストラクタが無いと動かないので208のように使うのが一般的かと。
しかしコンストラクタを省略するのはものぐさなのでC++向きじゃない気も。
LokiのSmartPtrにはそういうポリシーを受け入れる用意があるけど、各自勝手に実装しろってスタンスだし。

217 名前:デフォルトの名無しさん :03/02/01 01:52
フーン、いいね、これ。デフォルトコンストラクタが無いとダメっていう制限あるけど、後でInit()呼んでやったら良い訳だし。
ptr_containerが「.」をm_ptr->に、「&」をm_ptrに置き換えてくれたりしたら最高なんだけど、そういうのは無理なのかね。

218 名前:デフォルトの名無しさん :03/02/01 03:22
C++ の仕様上 operator. はオーバーロードできません。

219 名前:172 :03/02/01 07:37
>172-177
gcc がバグってるということで。

http://gcc.gnu.org/cgi-bin/gnatsweb.pl
view #6734

220 名前:デフォルトの名無しさん :03/02/01 09:14
'two_image::two_image' : オーバーロードされたメンバ関数が
'<Unknown>' にありません。
とかいうエラーメッセージが出るのですけど、
どういうことなんでしょう?

221 名前:デフォルトの名無しさん :03/02/01 09:17
【ネットボランティア】余ったCPUを・・・
 cell computingとは、ブロードバンドに接続された家庭内
や企業内のPCの余剰CPUパワーを統合し、
仮想的なスーパーコンピュータとしての利用を実現する
技術を用いたSI、ネットワークサービスです。
 バイオ、物理計算、設計、金融工学、CGレンダリング
などの分野のお客様へ、安価に仮想スーパー
コンピュータパワーを提供することを目的としております。
 なお、将来的には収益にあわせてCPUパワーを提供し
てくださる参加者へポイントシステムやデジタルコンテンツ
による利益還元を考えております。
http://www2.cellcomputing.jp/

2ちゃんねるのチームあります。【挑戦しる】
http://members.cellcomputing.jp/services/teams/team.htm?id=ABBE425B-CE11-4DA4-8591-C68DF67DA41A

222 名前:デフォルトの名無しさん :03/02/01 09:27
> デフォルトコンストラクタが無いと動かない
scoped_ptr 的に使うならptr_container自体に関するコンストラクタとかは
全部不要だろうから、

template< typename T > class ptr_container
{
public:
ptr_container() : m_ptr( new T() ){}
template<typename T1>
ptr_container(const T1& t1) : m_ptr( new T(t1) ){}
template<typename T1, typename T2>
ptr_container(const T1& t1, const T2& t2) : m_ptr( new T(t1,t2) ){}
template<typename T1, typename T2, typename T3>
ptr_container(const T1& t1, const T2& t2, const T3& t3) : m_ptr( new T(t1,t2,t3) ){}
...

と10個くらい並べとくとかいう手がある。constじゃない参照をとる
コンストラクタに対応しようとするといささか美しくない方法が必要だが。

223 名前:デフォルトの名無しさん :03/02/01 10:51
派生先クラスのメンバ変数に派生元のクラスのオブジェクトを含むときは
継承しないただのコンポジションと違うところありますか?
派生クラスのメンバオブジェクトのコンストラクタの仕方とか。




224 名前:デフォルトの名無しさん :03/02/01 11:05
>>223
よく状況がわからんからコードで示せ

225 名前:233 :03/02/01 11:26
>>234
class class0{
public:
int val0;
}
// class0のコンストラクタ
class0::class0(int x){
val0 = x;
}

class class1:public class0{
// メンバオブジェクト
public:
class0 obj0_0,obj0_1;
int val1;
f1();
}
としたときclass1のコンストラクタは
class1::class1(int x1, int x0_0, int x0_1)
:obj0_0(x0_0), obj0_1(x_1){
val1 = x1;
}
とう具合で良いでしょうか?









226 名前:デフォルトの名無しさん :03/02/01 11:33
>>222
へえー。それでもコンパイル通るんだね。
>コンストラクタに対応しようとするといささか美しくない方法が必要だが。
ドーやんの、オスィエテよ!

このやり方ってオーバーヘッドが若干ある&初期化が独特って事以外デメリット無いよね?

227 名前:デフォルトの名無しさん :03/02/01 11:59
継承クラスのメンバ関数定義と継承元のクラスのメンバ関数の定義を別の
ファイルにするときのリンクの仕方は何か特別のことする必要あるでしょうか?

228 名前:227 :03/02/01 12:02
継承先クラスの関数で継承元の関数を使っていて、
たぶんそのリンクができてないからエラーが出てるのだと思いますが、
どうすれば良いでしょう?

229 名前:デフォルトの名無しさん :03/02/01 12:04
>>225
class1のコンストラクタで、継承元のclass0の初期化子が呼ばれてないから
それだとエラーになるんちゃうか。

230 名前:デフォルトの名無しさん :03/02/01 13:08
VB厨なのだが、、、業務ではC++は使ったことが無い。
しかし趣味でC++を勉強していて、とりあえず
「新C++言語入門<ビギナー編>林晴比古 著」
の内容は一通り理解しているつもり。

こんな俺は、C++を使ってのソフトウェア開発で通用しますか?

231 名前:デフォルトの名無しさん :03/02/01 13:10
通用しません。アセンブラをやってからまた来てください。

232 名前:デフォルトの名無しさん :03/02/01 13:12
初心者の中の初心者が読むその本に、業界の中で何の価値があるのだろう。
せめて、ビギナー編じゃないほうの、上下巻のほうを読んだと言おうや。


233 名前:230 :03/02/01 13:15
ということは、会社で暇を見つけてはその本で勉強していた俺は
陰で馬鹿にされている可能性が非常に高いとも言えますね。。。

234 名前:デフォルトの名無しさん :03/02/01 13:26
>>233
そこからステップアップしてくつもりなら何も問題ないのでは。

235 名前:デフォルトの名無しさん :03/02/01 13:44
>>230
C++Primer読んでたけどこれなかなかよかったよ。
下らない本を何冊も買うより、これ一冊で
基礎をちゃんとやるのがいいかも。

236 名前:デフォルトの名無しさん :03/02/01 13:46
>>230
とりあえず、晴比古本はやめとけ。

237 名前:デフォルトの名無しさん :03/02/01 13:51
>>235
内容はいいけど、でかすぎて重すぎて読みづらい(涙

238 名前:230 :03/02/01 13:52
げ、、、VBもC++もVC++も林さんで揃えてしまった。。。
スレ違いスマソ。

239 名前:次回メルチェは23時 :03/02/01 14:23
エッチ

な粗品ファイルをあげるから、おしえてください。
回答と粗品の請求は↓へお願い。
l*ol*im*an*10@ho*tm*ai*l.*c*om

forループで重い処理をしていても、WndProc()が
機能するような方法をおしえてください。

次のソースで描画の処理はできましたが、例えば、
WM_MOVE はできていません。

LRESULT CALLBACK WndProc(の、
 switch (msg) {
  case WM_RBUTTONDOWN:
   func(hWnd);で↓が起動

240 名前:次回メルチェは23時 :03/02/01 14:23
void func(HWND hWnd) {
 MSG msg;
 char str[50];

 for (int i = 0; i <= 100; i++) {
  for (int j = 0; j <= 100; j++) {
  wsprintf(str, "%3d,%3d", i, j);
  SetWindowText(hWnd, str);
  while (PeekMessage(&msg, hWnd, WM_MOVE, WM_MOVE, PM_REMOVE)) {
  SendMessage(hWnd, WM_MOVE, msg.wParam, msg.lParam);//ここ失敗
  }

  if (PeekMessage(&msg, hWnd, WM_PAINT, WM_PAINT, PM_REMOVE)) {
  SendMessage(hWnd, WM_PAINT, msg.wParam, msg.lParam);//これ成功
  }
  }
 }
}

241 名前::03/02/01 14:38

空のWIN32アプリを作ってダイアログを表示させたは良いんですが
他のDOS(みたいなの)の画面上でチャットするソースとくっ付けたら
ダイアログが表示されなくなりました。ありそうな原因を教えてください。
お願いします

242 名前:デフォルトの名無しさん :03/02/01 14:39
くっつけるなよ(w

243 名前::03/02/01 15:11
>>242 そんな・・チャットする方の動作はしてるんですが、
何でダイアログが表示されなくなったのか分からない(泣
ネットも そんな馬鹿なQ&Aないし。。

244 名前:デフォルトの名無しさん :03/02/01 16:21
newで確保した領域はmain関数が終わって
プログラムが終了してもdeleteしないと残っているんでしょうか?

245 名前:デフォルトの名無しさん :03/02/01 16:23
>>244
staticで宣言してたら残る。
自動変数なら消滅。
基本です〜。

246 名前:デフォルトの名無しさん :03/02/01 16:23
>>244
UNIXではプロセスごとに確保したスタック、ヒープは
プロセスが終了した時点ですべて開放されます。
Windowsは知りません。

247 名前:245 :03/02/01 16:25
すまん。
mainが終わればstaticでも消滅ですた。。。

248 名前:デフォルトの名無しさん :03/02/01 16:29
大抵の場合領域は開放されるがコンストラクタは呼ばれないので悲惨な事になりかねん。

249 名前:248 :03/02/01 16:31
スマン デストラクタ

250 名前:デフォルトの名無しさん :03/02/01 16:32
>>248
デストラクタのこと?


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