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


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

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

過去スレ、関連スレ、関連リンクなどはこちら>>2-7

2 名前:v(^・^)v :03/11/04 21:41
■過去スレ■
 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://pc2.2ch.net/tech/kako/1041/10413/1041328679.html
 15 http://pc2.2ch.net/tech/kako/1043/10436/1043605481.html
 16 http://pc2.2ch.net/tech/kako/1045/10457/1045746245.html
 17 http://pc2.2ch.net/tech/kako/1047/10475/1047560042.html
 18 http://pc2.2ch.net/tech/kako/1050/10501/1050177746.html
 19 http://pc2.2ch.net/tech/kako/1052/10526/1052625846.html
 20 http://pc2.2ch.net/tech/kako/1055/10551/1055162298.html
 21 http://pc2.2ch.net/tech/kako/1057/10575/1057580107.html
 22 http://pc2.2ch.net/tech/kako/1060/10603/1060361082.html
 23 http://pc2.2ch.net/test/read.cgi/tech/1062690663/
 24 http://pc2.2ch.net/test/read.cgi/tech/1066546387/

3 名前:v(^・^)v :03/11/04 21: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 名前:デフォルトの名無しさん :03/11/04 21:42
2!!!

5 名前:v(^・^)v :03/11/04 21:42
■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/

6 名前:4 :03/11/04 21:43
遅かった。時代の流れという物は随分早いものですねえ

7 名前:v(^・^)v :03/11/04 21:43
■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

8 名前:v(^・^)v :03/11/04 21:44
■関連スレ■
[C++】template 統合スレ]
 http://pc2.2ch.net/test/read.cgi/tech/1066493064/l50
[C/C++の宿題をやって。おながい。]
 http://pc2.2ch.net/test/read.cgi/tech/1067175933/l50
[初心者にVisual C++を教えるスレ]
 http://pc2.2ch.net/test/read.cgi/tech/1056280510/l50
[VisualC++(MFC限定)相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1056584836/l50
[ATL 相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1029029882/l50
[C/C++でのWindowsPrograming議論スレ(質問お断り)]
 http://pc2.2ch.net/test/read.cgi/tech/1049790146/l50
[COMの世界を斬る!]
 http://pc2.2ch.net/test/read.cgi/tech/981823340/l50
[managed C++ やろうぜ!!]
 http://pc2.2ch.net/test/read.cgi/tech/1014486422/l50
[C++Builder相談室]
 http://pc2.2ch.net/test/read.cgi/tech/1061594556/l50
[タダで使えるBorland C++]
 http://pc2.2ch.net/test/read.cgi/tech/1054390397/l50
[Borland C++ BuilderX]
 http://pc2.2ch.net/test/read.cgi/tech/1065260556/l50
[Code of the Nerds" Digital Mars C/C++]
 http://pc2.2ch.net/test/read.cgi/tech/1044210976/l50
[GCCについて]
 http://pc2.2ch.net/test/read.cgi/tech/1046179115/l50
[OpenWatcom C++]
 http://pc2.2ch.net/test/read.cgi/tech/1033433728/l50
[タダで最強!フリーC/C++コンパイラ]
 http://pc2.2ch.net/test/read.cgi/tech/1035882599/l50

9 名前:デフォルトの名無しさん :03/11/04 22:01
>>1-8



10 名前:デフォルトの名無しさん :03/11/04 22:02
1おつ

11 名前:デフォルトの名無しさん :03/11/04 22:06
11乙

12 名前:デフォルトの名無しさん :03/11/05 06:23
んー、
さんざん論議されてきたことだと思うけど、一つ思ふことあり。

例えば、
bool sw;
というメンバがあったとする。これはprivateなメンバに配置するのが
望ましい。だが、これを一度、privateな場所へ置いてしまうと
set_sw() unset_sw() というような対となるメンバ関数を書かねばならない。

これは非常に疲れる作業であるばかりか、ソースコードの見通しを
悪くしているような気がしてならないのだ。

そこで、なんとかいい方法はないもんかと・・・
うーむ


13 名前:デフォルトの名無しさん :03/11/05 06:55
enumを、ずっとエニュームって読んでた_| ̄|○

14 名前:デフォルトの名無しさん :03/11/05 07:07
> set_sw() unset_sw() というような対となるメンバ関数を書かねばならない。

これが間違いだろ。

15 名前:デフォルトの名無しさん :03/11/05 07:44
bool get_sw();
void put_sw(bool value);
__declspec(property(get=get_sw, put=put_sw)) bool sw;

16 名前:デフォルトの名無しさん :03/11/05 07:49
>>15
標準C++じゃないだろそれ・・・

17 名前:デフォルトの名無しさん :03/11/05 08:46
> set_sw() unset_sw() というような対となるメンバ関数を書かねばならない。
さんざん議論されたことだが、「メンバ変数を置いたらそれに対応する
アクセサを書く」という謎な習慣はやめた方がいい。単なるアクセサは
基本的に書いてはならん。

・クラスの設計の上で「スイッチをONする」「スイッチをOFFする」というメソッドが
必要になったのなら、まず最初に set_sw() と unset_sw() が設計として
登場してくるはずだ。その後で、その実装の詳細として、bool sw; が出てくる…
という順序なら自然ではある。この場合必然なのはset_sw()とunset_sw()の
方なので、見通しが悪くなるとか良くなるとかいう話にはならんだろう。

・あるいはオブジェクトの振る舞い全体に関わる設定項目として
bool sw; があるのなら、set_config() なりなんなりの言わば facade 的な
メソッドを用意して、"sw" という細かな実体を直接いじるインターフェイスは
提供しないようにする。

18 名前:17 :03/11/05 08:50
でなけりゃ
> そこで、なんとかいい方法はないもんかと・・・
C#やDをつかってbool swを最初publicにしとく。
あとで必要になったらプロパティに変更すればいい。

19 名前:デフォルトの名無しさん :03/11/05 09:38
>>17
アクセス方法を後で変えたくなっても
すでにそのクラスをあちこちで使用してたら
そう簡単には変えられないことがあるよ。
bool sw メンバーが true から false に変わったタイミングで
何かの処理をやらせたくなっても
最初に public bool sw にしていて直接変数を触らせる方式を採用してたら
もう手が出せない。
アクセサーを用意しないというのは、
表面上の仕様を変えずに内部動作を変える余地を無くしてしまうので
「はじめにpublicメンバーありき」
とメンバー変数を露出させてるとあとで泣くことになる。


20 名前:デフォルトの名無しさん :03/11/05 09:45
for文内でnewしたオブジェクトは放置するとまずいですか
やはり、for文でdeleteしないと駄目ですか

21 名前:デフォルトの名無しさん :03/11/05 09:46
>>19 的外れ

22 名前:デフォルトの名無しさん :03/11/05 09:47
>>20
newしてるんだったらdeleteする場所はあんたの責任で、場所やタイミングはあんたの自由。

23 名前:デフォルトの名無しさん :03/11/05 09:48
>>20
newしたアドレスを全部覚えていれば
ループの外でdeleteしてもいい


24 名前:デフォルトの名無しさん :03/11/05 09:53
>>17
> クラスの設計の上で「スイッチをONする」「スイッチをOFFする」というメソッドが
> 必要になったのなら、まず最初に set_sw() と unset_sw() が設計として
> 登場してくるはずだ。その後で、その実装の詳細として、bool sw; が出てくる…
> という順序なら自然ではある。

まるで漢字の書き順を指摘しているようだ。
先にメソッドから用意されても、先にメンバー変数から用意されても、
結果が同じコードになるなら、先にどちらが用意されようがどちらも自然。

だいたい bool sw; のようなメンバーを用意すること無く
set_sw() と unset_sw() というメソッドだけが存在することはありえないのだから
set_sw() と unset_sw() が設計として登場してる時点で
bool sw; の存在が前堤となり、存在してくれていることに依存している。
その結果メソッドとメンバー変数が相互依存の形を取れば、
最初にメンバー変数から用意しているのと何ら変わりはない。


25 名前:デフォルトの名無しさん :03/11/05 09:58
> だいたい bool sw; のようなメンバーを用意すること無く
> set_sw() と unset_sw() というメソッドだけが存在することはありえないのだから

んなこたぁない。

26 名前:デフォルトの名無しさん :03/11/05 10:07
>>24
Program to an interface, not an implementation.

27 名前:デフォルトの名無しさん :03/11/05 11:18
>>13
エニュームじゃねぇの!Σ(゚Д゚ )

28 名前:デフォルトの名無しさん :03/11/05 12:02
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

31 名前:デフォルトの名無しさん :03/11/05 12:07
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

32 名前:デフォルトの名無しさん :03/11/05 12:07
ソースコードのサイズが同じならバイナリのサイズが10倍になってもおかしくは無い。
が、同じことをSTLを使わずに書けばソースコードのサイズが10倍以上になるだけだ。

最もsizeof(int) == sizeof(long)な環境でもstd::vector<int>とstd::vector<long>を別個に
確保してしまうとかその種の問題は存在するが。

33 名前:デフォルトの名無しさん :03/11/05 12:07
>>31
VC++スレにいけ

34 名前:デフォルトの名無しさん :03/11/05 12:08
>>31
#include <stdafx.h>

後死ね。

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

36 名前:デフォルトの名無しさん :03/11/05 12:14
>>32>>33
>>28〜の一群のレスはデジャ・ブだと思うよ。

37 名前:デフォルトの名無しさん :03/11/05 13:24
>>24みたいなアフォがいるからクソコードが蔓延するんだな

38 名前:デフォルトの名無しさん :03/11/05 13:38
実行時クラスを生成する機能ってあったっけ?

class2はclass1を継承していて、
class1 *cls = class2へのポインタ

・Javaなら(上と同等なコードをJavaで書いたとして)
cls.getClass.newInstance()
でclass2のデフォルトコンストラクタが呼ばれる

関係するすべてのクラスで、
実行時クラスを返すメソッドを定義するのは面倒なの


39 名前:template<> :03/11/05 13:44
なんだか俺の出番のような気がするな

40 名前:デフォルトの名無しさん :03/11/05 13:51
エニュム

41 名前:13 :03/11/05 14:04
>>27
あれ?いいのかな、確かにenumerateだもんなぁ
いやネットで見てたらエナムが正しいようなので

42 名前:デフォルトの名無しさん :03/11/05 14:11
>>41
ネット見てる暇があったら辞書引けや。このバカチンが。
オマエみたいな馬鹿はenableをエナブレと発音するからうざい

43 名前:デフォルトの名無しさん :03/11/05 14:15
enable いねいぶる
enumerate いにゅーまれいと
enum いにゅーむ

44 名前:38 :03/11/05 14:31
分かったよ
ttp://tt.sakura.ne.jp/~suzu/tips/copy.html
無理だってことが

45 名前:デフォルトの名無しさん :03/11/05 14:39
>>42
アホ、辞書引いてたから迷ったんじゃい
結構有名なサイトでエナムってあったから、そうなのかなと

46 名前:45 :03/11/05 14:54
ああでもあれだな
enumerateから類推するとenumをイニュームって読んじゃうけど
-erateが消えて、uの長母音が短母音になり、エナムになるのかもな

47 名前:デフォルトの名無しさん :03/11/05 15:03
>>46
するどい!runとruneの発音変化みたいなもんか

48 名前:デフォルトの名無しさん :03/11/05 15:05
イには聞こえない

49 名前:デフォルトの名無しさん :03/11/05 17:06
ヰヌム、ってあたりで。

50 名前:デフォルトの名無しさん :03/11/05 17:15
メンバ関数で、ちょっとした大きさのオブジェクトを返す場合、

const Object& GetObject(void) const;
void GetObject(Object&) const;
Object GetObject(void) const;

の、どれを採用してますか?
1番目はコピーコンストラクタなどで利用できるけど、計算結果は返せない。
2番目は計算結果を返せるけどコピーコンストラクタなどで利用できない。
3番目は利便性は最高だけど、コストがかかる。

今のところ1番目と2番目を、オブジェクトに応じて使ってますけど、
なんだかすごく保守性に欠けてる気がして……。

ちなみに、実際に悩んでるのは、行列クラス、ベクトルクラスです。
サイズ的には、それぞれfloat[4][4],float[4]です。
すべて3番目のコードにしといて、実行速度が問題になってから1と2を
検討するのがいいでしょうか?

51 名前:デフォルトの名無しさん :03/11/05 18:18
Object operator * (const Object&, const Object&);
こんなのをどうやって1や2で返すんだよ >>50

52 名前:デフォルトの名無しさん :03/11/05 18:25
>>50
Object GetObject(void) const;

const Object& ref = GetObject();

53 名前:デフォルトの名無しさん :03/11/05 19:32
>>13
遅レスすまそ
http://dictionary.goo.ne.jp/voice/e/01011190.wav

54 名前:デフォルトの名無しさん :03/11/05 19:41
>>50
実装の内部ではどれも同じように効率的な欠き方がされているものとして、
実際に利用されるコンパイラで速度を測ってみるべきだと思いますよ。
案外3も遅くないかもしれないから。

エラー値とか返す場合には 2 みたいなのも良いと思う。。

55 名前:デフォルトの名無しさん :03/11/05 19:51
>>51>>52
あああああ。そ、そうかー。
結局のところ、operator* と同じ問題に帰結するんですね。
記述法が統一できなくなるから、2が論外ですね。
ありがとうございましたー。

56 名前:デフォルトの名無しさん :03/11/05 21:49
>>53
それは関係無しにenumを単体で見たらエナムと呼ぶっていう話では?>>46

57 名前:デフォルトの名無しさん :03/11/05 22:53
Object a,b,c,d;

if( (a*b)==(c*d));//...


58 名前:デフォルトの名無しさん :03/11/05 23:11
なんだよ

59 名前:デフォルトの名無しさん :03/11/06 00:15
>>55
2も使う

つーか、おまえさんまだ論外とか常識とか言い出す時期じゃないぜ?
変に先入観持たずに納得いくまで色々書きまくってみろよ自分で。
すぐ上の先輩の言う「常識」なんか覆してやる! くらいのパワーがなくてどうする。

60 名前:デフォルトの名無しさん :03/11/06 01:15
(-人- ) ナム ナム イナム

61 名前:デフォルトの名無しさん :03/11/06 06:59
class A
{
void func()
{
}
};
class B
{
void func()
{
}
};
の中で直接定義していくような記述をしてきたいのだけど
それだと、class A の中から class B のメンバ関数を呼び出したいとき
名称前方参照のため、コンパイルができない。
結局、ヘッダに型宣言をせざるを得なくなる。

これってC++の欠陥だよー。Cのときからもそうだったけど。
仮宣言が必要なのってウザい。複数ファイル行き来して編集せねば
ならないし。

なにかしらの対処工夫ってないものだろうか?(解決は言語仕様からして
無理だとは思うけど)

62 名前:デフォルトの名無しさん :03/11/06 07:09
class Dog : class Animal;
class Cat : class Animal;
class Hoge : class Animal;

とあって、Animal* a[10];
という配列があったとします。
で、この中は、Animalからの派生物のインスタンスが
入ってることは分かっているのだけど、

「鳴け」というメンバ関数を持っているもののみ「鳴け」と
できないものだろうか?

Dog と Cat は鳴くメンバ関数があるのだけど、
Hogeは鳴くメンバ関数はない。もちろんAnimalにも鳴くメンバ関数はない。

配列に格納されてるクラスを無作為に「鳴け」と呼び出し、
該当メンバ関数を持っていなかった場合は、「なにもしない」と
したい場合、どうすればよいだろうか?

ちなみにHogeクラスにダミーとなる鳴きメンバ関数を追加するという
方法はNGなんです・・・


63 名前:62 :03/11/06 07:13
追記ですが、「鳴ける動物クラス」を新規設置して
その配列にすればよいというのもNG。

というのは、個別名前検索でヒットしたAnimalをa[]に列挙し、
そいつに対して一斉に「鳴け」とせざるをえない状況だからです。

要は、指定したインスタンス(ポインタ)に対して
「このメンバ関数、ある?」と聴いて回れる手段が欲しいのですー

むむむ


64 名前:62 :03/11/06 07:23
たびたびすまんです、RTTIが使えない環境下です。

65 名前:デフォルトの名無しさん :03/11/06 08:30
>>63
「このメンバ関数、ある?」という質問に回答してくれる
関数を作って下さい。各classのvirtual methodとして。


66 名前:デフォルトの名無しさん :03/11/06 08:40
メンバ関数の有無がわかっただけじゃAnimal*から呼び出せない。
結局ダウンキャストが必要になり、それにはRTTIが必須(普通は)。
Animalに鳴けというvirtualメンバ関数を追加するのがまっとうなやり方でしょ。


67 名前:デフォルトの名無しさん :03/11/06 11:33
>61
Aの前にBをもってくればいいじゃん。

と、冗談は程々にして、
そんな相互参照な構造にコストがかかると思って諦めろ。
ていうか、ヘッダに納めたいだけなら、ちょっと下に定義を書くだけやん。

>62
>66に同意で無理。
AnimalにRTTIもどきvirtual関数があるなら、力業で出来るかもしれんが、
無いだろうし、そもそもそんなのC++じゃねぇ。

68 名前:デフォルトの名無しさん :03/11/06 12:02
class Nakeru { public: virtual void naku() = 0; };
class Animal { public: virtual Nakeru* nakeru() { return 0; } };

class Dog : public Animal , public Nakeru
{
 void naku();
 Nakeru* nakeru() { return this; }
};
class Cat : public Animal , public Nakeru
{
 void naku();
 Nakeru* nakeru() { return this; }
};
class Hoge : public Animal
{
};

void naku( Animal* a[10] )
{
 for( int i = 0 ; i < 10 ; ++i )
  if( Nakeru* nakeru = a[i]->nakeru() ) nakeru->naku();
}

69 名前:デフォルトの名無しさん :03/11/06 12:16
class VoiceSimulator : public Nakeru
{
 void naku();
};
class RoboCat : public Animal
{
 VoiceSimulator cat_voice;
 Nakeru* nakeru() { return &cat_voice; }
};

70 名前:デフォルトの名無しさん :03/11/06 13:16
>>61
>>67が言ってるけど
class A
{
void func();
};
class B
{
void func()
{
}
};

void A::func()
{
}


でええやん。

71 名前:デフォルトの名無しさん :03/11/06 14:41
>>67>>70
>>61では「複数ファイル」って言ってるけど、実際は「宣言」と「定義」の2箇所で
整合性を取らなければいけないのがいやだ、ってことではなかろうか?
非constメンバ関数をconstメンバ関数にしたとき、宣言と定義の両方に
constつけんとあかんでしょ? そういうことではないかと思う。
……うまいこと編集してくれる統合環境がありゃいい話ではあるけどね。



72 名前:デフォルトの名無しさん :03/11/06 15:14
>>62
COM とか CORBA 風にすれば?

73 名前:デフォルトの名無しさん :03/11/06 20:08
age

74 名前:デフォルトの名無しさん :03/11/06 20:24
class A
{
void func()
{
}
};

こんなんやってたら全部インラインになって大変なことになるよ。

75 名前:デフォルトの名無しさん :03/11/06 22:49
DelphiからCに移ったヤシいる?

76 名前:デフォルトの名無しさん :03/11/06 22:51
超スレ違い質問キタ━━━━━━(゚∀゚)━━━━━━ !!!!!

77 名前:デフォルトの名無しさん :03/11/06 22:57
テキストファイルを読み込んで、その中から「abc」という単語を含む
文を抜き出すコードってどう書けばいいですか?

ifstream fin("テキストファイル.txt");



fout.close();


文を抜き出すいいコードが思い浮かばないんですが・・・

78 名前:デフォルトの名無しさん :03/11/06 22:59
あ、
fin.close();
でした。

79 名前:デフォルトの名無しさん :03/11/06 23:02
文の定義をして下さい。

80 名前:デフォルトの名無しさん :03/11/07 01:39
チンチンシュッシュッ

81 名前:デフォルトの名無しさん :03/11/07 02:29
>>77
抜き出すって、具体的にはどうするの?
出力すればそれでいいのか、それともメモリ上に持っておきたいのか。

82 名前:デフォルトの名無しさん :03/11/07 02:43
>>81
的外れだな
出力先はFDなのかCD-ROMなのかHDDなのか尋ねているようなものだ

memory上に格納しておけば
> 出力すればそれでいいのか、それともメモリ上に持っておきたいのか。
いずれの要求でも満たせる


83 名前:デフォルトの名無しさん :03/11/07 05:10
class Nakeru { public: virtual void naku() = 0; };
class Animal { public: virtual Nakeru* nakeru() { return 0; } };

class Dog : public Animal , public Nakeru
{
 void naku();
 Nakeru* nakeru() { return this; }
};
class Cat : public Animal , public Nakeru
{
 void naku();
 Nakeru* nakeru() { return this; }
};
class Hoge : public Animal
{
};

void naku( Animal* a[10] )
{
 for( int i = 0 ; i < 10 ; ++i )
  if( Nakeru* nakeru = a[i]->nakeru() ) nakeru->naku();
}
----
↑それじゃ解答になってないよ。
「鳴く」メンバ関数を持ってないHogeも配列に動的に混在する
ケースが問題になっているので。Nakeru*配列である以上、
鳴けて当たり前のインスタンスしか格納されてないので、
そもそも選別不要。

84 名前:デフォルトの名無しさん :03/11/07 05:23
つーかAnimalクラスに何もしない「鳴け」仮想関数を置いておくという解決法の
なにが不満なのかがさっぱりだ。

85 名前:デフォルトの名無しさん :03/11/07 05:53
>つーかAnimalクラスに何もしない「鳴け」仮想関数を置いておくという
>解決法のなにが不満なのかがさっぱりだ。

その方針で基底クラスに仮想関数をほいほい追加していったら、
おそよ継承先の末端メンバ関数全てを追加せねばならぬので現実的な
解決策ではないのでは?

というか、「鳴く」という例が一般的すぎる動詞で例が悪くね↑

「オナニーする」「2chでカキコする」だとか、
わりとマニアックなメンバ関数だったりすると
問題が分かりやすくなるのでは?
すると、基底クラスには、おそらく動物学的には稀な動作である
全ての動物の挙動が辞書のごとく膨れ上がってしまうかと。

そうではないでしょ。
やはり基底クラスというのは、最低限のメンバ関数(仮想関数ふくむ)
のみを追加するべき、小さなクラスであるべき。

継承先で枝となる詳細なクラスが追加されていくと。



86 名前:デフォルトの名無しさん :03/11/07 05:56
>>85
そういう場合はdynamic_cast使えばいいだろ?

87 名前:デフォルトの名無しさん :03/11/07 09:25
>>83
Nakeru*配列じゃなくてAnimal*配列だって。コードよくみろよ。ちゃんと動く解答だぞ。

>>86
この話題の前提である「RTTIが使えない環境下(>>64)」を覆えして反論することに意味はないだろう。


なんにしても、Animal*配列である以上、Animalに何か追加しないことにはどうしようもないっぽい。

88 名前:デフォルトの名無しさん :03/11/07 09:38
RTTIが使えなくてもクラスメンバに型識別用の情報突っ込んで
擬似dynamic_castを行うことは充分可能だと思うが。

89 名前:デフォルトの名無しさん :03/11/07 12:00
RTTI使わなくてもある程度はできるけど
多重継承を考えると死ぬぞ

90 名前:デフォルトの名無しさん :03/11/07 12:06
>>85
基底クラスに対して「鳴け」といいたいのだから
鳴けというメンバ関数は最低限のメンバ関数だろ

91 名前:デフォルトの名無しさん :03/11/07 12:32
やっぱり、62の言うとおり、
IBeeper *ibp;
if SUCCEEDED( animal[i]->QueryInterface( __uuidof(IBeeper),(void**)&ibp) )
{ ibp->beep(); ibp->Release(); }
か。

92 名前:デフォルトの名無しさん :03/11/07 15:44
鳴けるクラスが自クラスのインスタンスのセットをスタティックに持っていれば基底クラスは一切変更しなくてもイケる。
パフォーマンスに多少の影響はあるが。

93 名前:デフォルトの名無しさん :03/11/07 18:50
これがうまくコンパイルできない理由ってわかりますか?
コンパイラはgcc3.3.1(MinGW)及びVC7.1です。

#include <iostream>

namespace hoge {
 void f(const char*) { std::cout << "hoge::f\n"; }
}

namespace piyo {
 using namespace hoge;
 void f(int) { std::cout << "piyo::f\n"; }
}


int main()
{
 piyo::f("ABC"); // エラー
}

94 名前:デフォルトの名無しさん :03/11/07 19:03
void piyo::f(int)だから当たり前じゃないの?

95 名前:94 :03/11/07 19:13
触発されて思いつき
namespace hoge {
void f(const char*) { std::cout << "hoge::f\n"; }
}
namespace piyo {
void f(int) { std::cout << "piyo::f\n";}
void b()
{
using namespace hoge;
f("ABC");
}
}
他の名前空間の関数とはオーバーロード出来ないのか?

96 名前:デフォルトの名無しさん :03/11/07 19:14
>>94
using namespace hoge; で取り込んでも関数のオーバーロードは解決
してくれないのでしょうか。それで悩んでいるのです。

ちなみに

#include <iostream>

namespace hoge {
 void f(const char*) { std::cout << "hoge::f\n"; }
}

namespace piyo {
 void f(int) { std::cout << "piyo::f\n"; }
}

namespace hage {
 using namespace hoge;
 using namespace piyo;
}

int main()
{
 hage::f("ABC");
}

とやったら通るんですよね。

97 名前:デフォルトの名無しさん :03/11/07 19:17
>>95
それもダメみたいっすね。

98 名前:94 :03/11/07 19:29
なんか期せずしてcppllで同じような内容が。
答も出ていて
namespace piyo {
using hoge::f;

}
ときっちり指定すれば、出来た。

99 名前:デフォルトの名無しさん :03/11/07 19:35
>>98
実は(^^;)cppllで答えが出なかったから2chに投げてみたんです。

そうです。using-declarationはうまく行くのにusing-directiveは
うまく行かないんで悩んでいたんです。規格書読んでもそれらしき
例は載っていないし。namespaceスコープ中のusing-directiveは
関数のオーバーロードを解決しないという文が規格書のどこかに
あれば納得するんですが。うむむむ。

100 名前:デフォルトの名無しさん :03/11/07 19:37
でも、そんな文があったら>>96が通るのも変な話ですよね。
namespaceスコープ中で関数が定義されていたら、using-directive
による関数のオーバーロードは解決しない、という所でしょうか。

101 名前:94 :03/11/07 19:37
って、そういうことか。<今最後まで読んだ

102 名前:デフォルトの名無しさん :03/11/07 19:43
>>99
PLC++3rdの8.2.8.2がそれっぽい・・・。

103 名前:デフォルトの名無しさん :03/11/07 19:48
>>102
ありがとうございます!!確かにこの通りです。
ではコンパイラの動作は正しいみたいですね。後は規格書から
それらしい文を見つけ出せばいいだけです。これで半分解決
したも同然です。

104 名前:デフォルトの名無しさん :03/11/07 19:51
そのへんの問題は、Exceptional C++ の第5章「名前の自動照合とインターフェース原則」に詳しく載ってるよん。

105 名前:デフォルトの名無しさん :03/11/07 20:27
>>104
今Exceptional C++を読んでいます。ちょっとusing-directiveに
関する話題は見つからないようです。

規格書の7.3.4の5ですがちょっと意味が違うみたい。

[Note: in particular, the order in which namespaces were considered
and the relationships among the namespaces implied by the using-directives
do not cause preference to be given to any of the declarations found by the search. ]

[注:優先権は、探索によって見つかった宣言のうちのどれにでもnamespacesが考慮された
順序、およびusing-directiveによって暗黙に意味されたnamespacesの関係によって特に
与えられません。]

自動翻訳に味付けしただけですが、これでは明示的に宣言されたものがusing-
directiveより優先するかどうか微妙な所です。

106 名前:デフォルトの名無しさん :03/11/07 23:56
void naku( Animal* a[10] )
{
 for( int i = 0 ; i < 10 ; ++i )
  if( Nakeru* nakeru = a[i]->nakeru() ) nakeru->naku();
}

↑a[i] の中に Hoge が入っていて、それに対して
a[i]->nakeru() が NULL が返ってなければという前提は
RTTI前提になってしまうのでは?


107 名前:デフォルトの名無しさん :03/11/08 00:44
>>106
どこにRTTIが使われてると思ってんの?

108 名前:デフォルトの名無しさん :03/11/08 00:54
>>107と同意見
vtblもRTTIだと言いたいのか?

109 名前:デフォルトの名無しさん :03/11/08 04:21
質問です。
汎用クラスを通常のクラスで継承するということは可能ですか?

template<class X> class hanyou_class
{
public:
hanyou_class();
`hanyou_class(); // `はチルダのつもりです
}

コンストラクタ・デストラクタは略

class normal:hanyou_class<int>,sonota_no_class
{
//中身
}

とやってみたところ、汎用クラスのコンストラクタが参照エラーになってしまいました。
継承しなければエラーも出ませんし使えます。

初心者質問で申し訳ありませんがどなたかご教授願えないでしょうか?

110 名前:デフォルトの名無しさん :03/11/08 04:25
>>109
普通に出来ます。
ちゃんとコンストラクタの実態はありますか?
C++のtemplateは実体が同一の翻訳単位に含まれるか、export(ほとんどのコンパイラで使えない)しないと駄目ですよ。


111 名前:デフォルトの名無しさん :03/11/08 04:41
>>109
関係ないけどチルダが入力できない環境なのか?

112 名前:デフォルトの名無しさん :03/11/08 04:57
>>111
US配列だと[~]の位置が[Shift+`]だからtypoしてるんじゃないか?

113 名前:デフォルトの名無しさん :03/11/08 05:15
継承するときには public 書かないと
private 継承されちゃうぞ。

114 名前:109 :03/11/08 05:21
詳しく書きます。(関数の中身は要約します)

//汎用クラス
template <class X> class image_base_class
{
public:
X * mPixels;
};
//コンストラクタ
template <class X> image_base_class<X>::image_base_class(){

mPixels = new X[SIZE];

}
//デストラクタ
template <class X> image_base_class<X>::~image_base_class(){

delete iImage->mPixels;

}



115 名前:109 :03/11/08 05:21
//普通のクラス (上の汎用クラスを継承)
class tools_class:image_base_class<double>
{
public:
      int dx,dy;
tools_class();//このクラスのコンストラクタ
int draw_nanika(image_base_class<double> * iImage);//適当な関数

};
//コンストラクタ
tools_class::tools_class()
{
dx = 0;
dy = 0;
}

このようなソースで、汎用クラスのコンストラクタで外部参照エラーがおきました。
派生クラス(普通のクラス)のコンストラクタをコメントアウトしてやるとエラーがでません。
環境はwindowsXpでVC++.netです。

解決策があればお願いします。

116 名前:デフォルトの名無しさん :03/11/08 05:22
iImage-> って?

117 名前:109 :03/11/08 05:22
続き

//普通のクラス (上の汎用クラスを継承)
class tools_class:image_base_class<double>
{
public:
      int dx,dy;
tools_class();//このクラスのコンストラクタ
int draw_nanika(image_base_class<double> * iImage);//適当な関数

};
//コンストラクタ
tools_class::tools_class()
{
dx = 0;
dy = 0;
}

このようなソースで、汎用クラスのコンストラクタで外部参照エラーがおきました。
派生クラス(普通のクラス)のコンストラクタをコメントアウトしてやるとエラーがでません。
環境はwindowsXpでVC++.netです。

解決策があればお願いします。

118 名前:デフォルトの名無しさん :03/11/08 05:25
エラーメッセージも書いてホスィ。

119 名前:109 :03/11/08 05:36
すいません。iImage->ってのは無視してください^^;

エラーメッセージは
cap error LNK2001: 外部シンボル ""public: __thiscall image_base_class<unsigned char>::~image_base_class<unsigned char>(void)" (??1?$t2_image_base_class@E@@QAE@XZ)" は未解決です。

cap error LNK2019: 未解決の外部シンボル "public: __thiscall image_base_class<unsigned char>::~image_base_class<unsigned char>(void)" (??1?$image_base_class@E@@QAE@XZ)
が関数 "public: int __thiscall dshow_class::dshow_init(void)" (?t2_dshow_init@dshow_class@@QAEHXZ) で参照されました。
といったものです。(書いてない関数がありますが気にしないでください)

これらエラーは汎用クラスのコンストラクタとデストラクタをコメントアウトするか、派生クラスのコンストラクタ、デストラクタをコメントアウトすれば解消します。
わかりにくい質問で申し訳ありません。

120 名前:デフォルトの名無しさん :03/11/08 05:45
なんでテンプレートクラスのコンストラクタ、デストラクタは定義だけして宣言してないの?

121 名前:デフォルトの名無しさん :03/11/08 05:45
うーん。
>>110 >>113 をやってもダメ?

122 名前:デフォルトの名無しさん :03/11/08 05:46
×class tools_class:image_base_class<double>
○class tools_class:public image_base_class<double>

123 名前:デフォルトの名無しさん :03/11/08 05:49
んーあと考えられるのは、テンプレートが後方定義されてしまってる
ことくらいか。あるいは、そもそもinclude忘れてるとか。

でもvc++のエラーメッセージ見る限り、
なぜか、テンプレート引数が double ではなく unsigned char になってる
のが気になる。

124 名前:デフォルトの名無しさん :03/11/08 11:03
これじゃだめなん?

const int SIZE = 1111;

//汎用クラス
template <class X>
class image_base_class
{
public:
image_base_class();
~image_base_class();
X* mPixels;
};
//コンストラクタ
template <class X>
image_base_class<X>::image_base_class() {
mPixels = new X[SIZE];
}
//デストラクタ
template <class X>
image_base_class<X>::~image_base_class() {
delete mPixels;
}

125 名前:デフォルトの名無しさん :03/11/08 11:04
続き

class tools_class : public image_base_class<double>
{
int dx,dy;
public:
tools_class();//このクラスのコンストラクタ
int draw_nanika(image_base_class<double>* iImage);//適当な関数
};
//コンストラクタ
tools_class::tools_class()
{
dx = 0;
dy = 0;
}

int main()
{
tools_class A;
}

126 名前:デフォルトの名無しさん :03/11/08 11:32
>>109
問題が再現する最小限のソースを作って貼ってみな。

いまままでの書き込みとか、エラーメッセージとか見る限りでは、
たぶん再現できないと思ってるけどナー。

127 名前:C++初心者 :03/11/08 13:10
突然ですがどなたか回答お願いします。

VC++6使ってるんですが、個人でゲームなんか作る時は、
メッセージループの中で処理をするような物を使いますよね?
この様な手続き型プログラムの場合、
MFCを使わないプロジェクトを使わないとダメなんでしょうか?

この場合だとサブルーチンを別のファイルにて開発したいのですが旨くいきません。
プログラムが長くなってきて、見渡し難いんです。
クラスビューで目的のルーチンに飛べれば楽なんですが・・。
そもそも、ゲームタイプの物はクラス作ったりしない物なのでしょうか?
皆さんどうされてるのでしょう?

128 名前:109 :03/11/08 13:25
みなさん ありがとうございます。
126さんのご指摘通り、最小限で再現しようとしたのですが、124-125さんのように書くとエラーになりませんでした。
エラーが起きる元のプログラムでも文法は同様なのですが、違いがあるとすればファイルがわかれています。
汎用クラスのコンストラクタとデストラクタを消すか、継承を削除すればエラーになりません。
publicは試してみましたが状況変わらずでした。
123のおっしゃる「後方定義されてしまってる」というのはどういうことでしょうか?

129 名前:109 :03/11/08 14:12
汎用クラスのクラス定義内にコンストラクタとデストラクタを書いてみたところエラーがなくなりました。
やはり、宣言(定義?)している場所が悪いようなのですが、何かルールみたいなものがあるのでしょうか?

130 名前:デフォルトの名無しさん :03/11/08 14:21
>>127
>メッセージループの中で処理をするような物を使いますよね?

アプリと違ってメッセージドリブンだと作りづらいと思うけど
独自でループ組むほうが多いんじゃないかな

クラスは普通につかってる。便利だし

131 名前:デフォルトの名無しさん :03/11/08 15:09
>129
大半のコンパイラでは、テンプレートクラスは定義内に、
メソッド定義がある必要があるけど。

132 名前:C++初心者 :03/11/08 15:12
>>130
早速ご返答ありがとうございます。
やっぱり独自のループに入った途端マウスや、キーを自分で監視していかなければ
いけないんでしょうねえ。

独自のループはどこらへんのクラスに作成したら良さげでしょう。
ウインドウズの前処理が整った後だろうと予想しますが。

133 名前:C++初心者 :03/11/08 15:20
>>127
>MFCを使わないプロジェクトを使わないとダメなんでしょうか?
は間違いで、ドキュメントビューを使わないでした。

134 名前:デフォルトの名無しさん :03/11/08 17:14
ダイアログクラスでイベントドリブンでアクションゲーム作ってますが。
キャラクタやフィールドの描画はタイマーで描いてるし。


135 名前:デフォルトの名無しさん :03/11/08 19:13

while( TRUE ){
if( PeekMessage( &msg , 0 , 0 , 0 , PM_REMOVE ) ){
if( msg.message == WM_QUIT ){
return(msg.wParam);
}
TranslateMessage( &msg );
DispatchMessage( &msg );
} else {
あなたのmain関数()
}
}

イベントドリブンは、Win3.1時代のように、各アプリ間で調停するための
前時代的な方法で、プログラマーにはむしろハンデであり、また足かせ。
Win95以降では可能なかぎり無視することができ、
上記のような記述でなんら問題ありません。
「あなたのmain関数」の中で、無限Loopするような重い処理しても
Win3.1時代とは違い、現行のWindowsはきちんと他のアプリにも適切な
処理権利を分配してくれます。

つまりイベントドリブンは、可能なかぎり無視し、
DOS時代のように我が物顔で、俺Loopを勝手に構築しても、
OSは不安定にもならず、また他のアプリにも迷惑をかけないことを
Windowsが保障しています。


136 名前:デフォルトの名無しさん :03/11/08 19:24
>>135
>「あなたのmain関数」の中で、無限Loopするような重い処理しても
>Win3.1時代とは違い、現行のWindowsはきちんと他のアプリにも適切な
>処理権利を分配してくれます。

無限ループしてるスレッドよりも低い優先順位のスレッドは実行機会がなくなるし
ループしてる間はCPUも食うよ。


137 名前:デフォルトの名無しさん :03/11/08 19:31
無限ループに入る前にこの行実行しとくといいよ。
SetPriorityClass(GetCurrentProcess(), 0x100);

138 名前:デフォルトの名無しさん :03/11/08 19:34
>>137
これと同じことか。asm挟んでいて無限ループに陥った時は
さすがにリセットしかなかった。2CPUなら回避できたのかも。

SetPriorityClass(hprocess, REALTIME_PRIORITY_CLASS);

139 名前:デフォルトの名無しさん :03/11/08 19:35
>>135
136の1行目のみ同意見
I/Oバウンドなプログラムでそれをやるとユーザの目が三角になる
ここで言うI/Oにはページングも含むわけだが...

140 名前:質問 :03/11/08 21:01
クラス用の構造体、共用体の宣言が出来るのはわかるのですが
クラス用の列挙型は出来ないのでしょうか?

141 名前:デフォルトの名無しさん :03/11/08 21:19
>140

質問の意味がわからないんですけど。
「クラス用の」って何のことですか?

142 名前:デフォルトの名無しさん :03/11/08 22:41
C++ の入門サイト教えてください

143 名前:デフォルトの名無しさん :03/11/08 22:56
>>142
本買え

144 名前:デフォルトの名無しさん :03/11/08 22:58
>>142
ここのC言語スレ

145 名前:デフォルトの名無しさん :03/11/08 23:31
142に>>2嫁って言うつもりで確認に行ったら不意打ちで藁わされた

146 名前:デフォルトの名無しさん :03/11/09 00:02
int以外の型、たとえばcomplexとか、を列挙したいのだろうか

147 名前:デフォルトの名無しさん :03/11/09 00:42
>>105
見つけたっぽい。
「3.4.3.2 Namespace members」の 2 曰く、その namespace で直接宣言されたものが
見つかった段階で、using-directive は無視されるってことのようだ。

>>141
>>140 を俺的に翻訳してみる。
struct, union は class と同様にメンバ(関数)を持てますが、enum は無理なのでしょうか?
答え:できません

148 名前:デフォルトの名無しさん :03/11/09 01:08
>>140 の質問内容は定かではないが、いずれにしろ
試しもしないで聞いてるような雰囲気。

149 名前:デフォルトの名無しさん :03/11/09 01:15
>これと同じことか。asm挟んでいて無限ループに陥った時は
??
asm挟むとか挟まないとか関係ないです

150 名前:デフォルトの名無しさん :03/11/09 03:26
>>無限ループしてるスレッドよりも低い優先順位のスレッドは実行機会がなくなるし
>>ループしてる間はCPUも食うよ。

SystemIdleでループするか、自アプリでループするかの違いでしか
ないので問題ないかと。

151 名前:デフォルトの名無しさん :03/11/09 03:32
SystemIdleProcessがループだって?

152 名前:デフォルトの名無しさん :03/11/09 03:33
×ループ
○busyループ

だな。

153 名前:デフォルトの名無しさん :03/11/09 04:00
>>150
昔似たような発想の頑固親父がいて手こずりました。
いくら言ってもCPU使用率を理解してもらえない。
そんなものは初めから存在しない(だから自アプリがいくらヘビーな処理をしても関係ない)の一点張りで・・・。


154 名前:デフォルトの名無しさん :03/11/09 04:40
NT系のWindowsは暇なときはHLTしてるので大違いだ。
ノートとかPentium4だと特にな。

155 名前:デフォルトの名無しさん :03/11/09 10:24
for(int i)
{
for(int j)
{
for(int k)
{
if()
{
goto a;
}
}
} a:
}

これだとifの条件が満たされた時点でjとkの部分を飛ばして
次のiに行くけど、gotoを使ってるからダメですか?
これをgotoを使わずに同じ内容にするにはどうしたらいい?


156 名前:デフォルトの名無しさん :03/11/09 10:41
>>155
それを無理にやるとしたら
(inline) void inner_loop(int i)
{
for (int j) { for ( int k ) { if () return; } }
}
に分離して、
for (int i) { inner_loop(i); }


157 名前:デフォルトの名無しさん :03/11/09 10:43
>>155
それはgotoを使っていい例の一つではないかと思う。

> これをgotoを使わずに同じ内容にするにはどうしたらいい?
for(int j=0, continue_i=0; !continue_i && j<end; ++j )
 for(int k=0; !continue_i && k<end; ++k )
  if(){ continue_i=1; continue; }
か例外を使うか。

158 名前:デフォルトの名無しさん :03/11/09 11:02
あるいは、jkのループを直列化して一本のループにする。

class jk_iterator {
operator ++() {..}
operator void* () const {...}
int j() const {...}
int k() const {...}
};
というようなものを作って
for ( jk_iterator jk; jk ; ++jk ) {
if () break;
}
なんて手もあるけど。

159 名前:デフォルトの名無しさん :03/11/09 11:11
ちょっと質問
class{
public:
int a;
int b;
int c;
};
なんてコードを見つけたんだけど
これって
typedef struct{
int a;
int b;
int c;
}
じゃだめなの?
わざわざclassにするメリットがあるのでしょうか?

160 名前:デフォルトの名無しさん :03/11/09 11:24
>>159
typedefは不要だが、ともかく特にメリットはないかな。

161 名前:デフォルトの名無しさん :03/11/09 11:25
>>159
好みの問題、どっちでもいいよ

162 名前:デフォルトの名無しさん :03/11/09 12:39
漏れはprivate:を明示的に書くからclassいらん

163 名前:デフォルトの名無しさん :03/11/09 13:38
Cとして利用されるのを防止するためにstructを嫌ったってことはない?

164 名前:デフォルトの名無しさん :03/11/09 13:45
無い。
ファンクタなんかはpublicメンバしか無いのが普通だからstructにもメンバ関数を書けるようにしたんだね。

165 名前:デフォルトの名無しさん :03/11/09 13:52
>>164
「無い」はなんに対して?

166 名前:デフォルトの名無しさん :03/11/09 15:41
あるクラスのprivateメンバに標準コンテナが2つあるとします。
これらのコンテナに対するアクセッサは一般的にどうあるべきなのでしょうか?

とりあえず、外部からは参照だけできればよいものとします。
効率を無視して、普通にコンテナのコピーを返すのがいいでしょうか?
それとも各コンテナのconst_iteratorを提供するのがいいでしょうか?
あるいは、必要になる度に、個別の要素へのアクセス関数を付け加えていくべきでしょうか?


167 名前:デフォルトの名無しさん :03/11/09 15:45
>>159
「わざわざclass」って
視点変えれば「わざわざstruct」という考えもある


168 名前:デフォルトの名無しさん :03/11/09 15:47
>>166
constな参照を返すのは?

169 名前:デフォルトの名無しさん :03/11/09 15:55
>>156-158
ありがとうございます

独学なもんで、こういう「状況に応じた判断」の基準が
よくわからないんですよね。gotoは極力使うな!と、
どこを見ても書いてあるので、どういうときに使っていいものか
迷っていました。
でもこの例なら使ってもそれほど悪くはなさそうってこと納得しました。

170 名前:デフォルトの名無しさん :03/11/09 16:01
>>166
「一般的には」どちらでもいいので
そのクラスの事情に応じて決めて下さい

ちなみに
確保しているメンバーと同じ値を見せれば良いとき
一般的にはconstの参照が多いです
途中でフックかけて、状況に応じて改変や生成をした値を返す必要があるならば
一時オブジェクトを返すことが多いです

class range
{
int start;int length;int end;/*end==start+length*/
public:
int get_start()const{return start;}
int const& get_length()const{return length;}
int get_end()const{return end;}
...
};
...
for(int i=r.get_start();i<r.get_end();i++) ...

こういうので int end; を除去して
int range::get_end()const{return start+len;}
に変更しても表面上の仕様は変わらないように
アクセサーは内部仕様そのもの及びその変化を表面に出さない長所あり


171 名前:デフォルトの名無しさん :03/11/09 16:09
プリミティブ型のconst参照を返すのは馬鹿だろ

172 名前:デフォルトの名無しさん :03/11/09 16:14
>>171
class range

template<class T>class range
に変えたとき
Tがプリミティブ型のときスペシャライズしてアクセサの仕様を変える馬鹿


173 名前:デフォルトの名無しさん :03/11/09 16:17
template<class T>class range

class range
に変えたわけでもないのにint const& を返すようにしてる奴はバカでしょ

174 名前:デフォルトの名無しさん :03/11/09 16:20
>>169
ただし、C++の場合はやむを得ずgotoを使うけれど、
JavaとかC#とかDとか後発の言語では、breakやcontinueで
多重ループ脱出ができるようになってる、ってことも
覚えておいて損はない。

175 名前:デフォルトの名無しさん :03/11/09 16:21
>>173
流れをよく読め。
>>166が標準コンテナを問題にしているから
>>170はconst参照を返す例を挙げたんじゃないか。

176 名前:デフォルトの名無しさん :03/11/09 16:32
>>173
int限定の話題じゃなくて
型を問わずアクセサーの話題でアクセサーには一時オブジェクト
かconst参照かどちらを返した方がいいかという話題

一時オブジェクトを返さなければならない場面もある例として
偶然intがでてきたからといって
intを前堤にして一時オブジェクトを返すのは馬鹿だとか言ってたら
論点ずれすぎ


177 名前:デフォルトの名無しさん :03/11/09 16:34
>>171
電話帳プログラムのサンプルの中に「太郎」って名前があったとき
「太郎なんて名前は今どきいないだろ。
サンプル書いたプログラマーはいると思ってるから馬鹿だろ」
とつっこみ入れたのは君か


178 名前:デフォルトの名無しさん :03/11/09 16:37
>>174
死者ぷーにはそんなすぐれた機能ありませんよ。

179 名前:166 :03/11/09 16:39
ご助言ありがとうございます。
もう少し具体的に書きます。

class Node {
public:
...
private:
list<Node *> link;
list<short> attr;
};

のような、複数のノードリンクを持つノードクラスとします。
前処理でノードの木構造は確定するものし、同時にattrも必要な値が格納されます。

後処理では、この木構造を「トラバース」し、ノードごとにattrを回収したりその他の処理をしたいのです。
今はlinkのconst_iteratorを提供し、外部で走査しています。

関数オブジェクトを受け取ってfor_eachするメンバ関数も検討しましたが、
イテレータの他にユーザ引数を複数取る関数オブジェクトが作れない。
また関数オブジェクトから再度for_eachを呼び出すような再帰構造が作れない。

以上の理由で、今のところlinkコンテナに直接アクセスする方法しか思いつかないのですが、
もっとエレガントな方法はないものでしょうか。
attrに関しては、168さんの言うとおりconst参照で十分ですね。失礼しました。


180 名前:デフォルトの名無しさん :03/11/09 16:58
>>179
>イテレータの他にユーザ引数を複数取る関数オブジェクトが作れない。
これについては、関数オブジェクトのなかに引数を持ってしまえば解決できるんじゃない?

181 名前:デフォルトの名無しさん :03/11/09 17:04
前処理とか後処理とかが通じるのは
その間に挟まれた本処理が明確になっているとき


182 名前:デフォルトの名無しさん :03/11/09 17:06
>>179
>ユーザ引数を複数取る関数オブジェクトが作れない
これの意味を明確にして、そして理由を言って下さい


183 名前:デフォルトの名無しさん :03/11/09 17:07
std::pairやboost::tupleを使えば良いんじゃないの?

184 名前:デフォルトの名無しさん :03/11/09 17:38
どっちかっつーとboost::bindでは

185 名前:166 :03/11/09 18:03
えっとですね、
外部で走査する場合は

void traverser(_SomeType &val, const Node *node, int level)
{
 for (Node::link_const_iter it = node->begin_of_link(); it != node->end_of_link(); ++it)
  if (探索を続けるとき)
   traverser(val, *it, ++level);
}

てな感じになりますね。
ただしtypedef list<Node *>::const_iterator link_const_iterです。

恥ずかしながら関数オブジェクトは勉強中で経験が無いのですが、
struct NodeTraverserFunc : unary_function {
 bool operator()(const Node *);
 _SomeType val;
 int level;
};

こんな感じでしょうか?


186 名前:166 :03/11/09 18:04
(続き)
で、Nodeクラスに

traverser(_Function func)
{
 for_each(link.begin(), link.end(), func);
}

みたいな感じでトラバーサ専用メンバ関数を追加すると。

ただ、このoperator()()からNode::traverser(*this)みたいに再帰的に
呼び出すことは可能なんでしょうか??

っていうかやってみりゃいいんですね...


187 名前:デフォルトの名無しさん :03/11/09 18:21
for_eachから離れろよバカ

188 名前:デフォルトの名無しさん :03/11/09 18:44
いいじゃん。for_eachでできる事は、iterator走査するよりfor_eachでやった方がいい。

189 名前:166 :03/11/09 20:17
>>187
別にfor_eachに拘ってるわけじゃないですよ。
他の方法でもいいです。
privateメンバのイテレータやらtypenameを多数publicにちりばめなくてすむよい方法について、
あなたの実践方法をよかったら教えてください。


190 名前:デフォルトの名無しさん :03/11/09 20:27
void traverser( Functor f )
{
 f(this);

 for (Node::link_const_iter it = node->begin_of_link(); it != node->end_of_link(); ++it)
  if (探索を続けるとき)
   traverser( f );
}

これでいいじゃん

191 名前:デフォルトの名無しさん :03/11/09 20:33
>>185
class Node {
 ...
 template<class F>
 void traverse( F& f ) { // fは子も探索したいならtrueを返す
  if( f(*this) )
   std::for_each( link.begin(), link.end(), boost::bind(&Node::traverse,_1,f) );
 }
};

bind周りはオーバーロードの都合で実際は汚いキャストが必要だが。

192 名前:191 :03/11/09 20:34
かぶつた?

193 名前:166 :03/11/09 22:32
>>190>>191
ありがとうございます。
>>190さんのはFunctor型を決めないといけないですね。
>>191さんのはテンプレートなのでその必要ないけど、boost判らない..._| ̄|○

でもできることは判りました。
もう少し試行錯誤してみます。


194 名前:190 :03/11/09 22:58
>>193
template< Functor >付けるだけだろ、アホみたいな突っ込みいれるなよ。
お前のコードにtemplateがなかったから省略したんだと思ってそのまま使っただけ。


195 名前:デフォルトの名無しさん :03/11/09 23:11
C++というかdoxygenの質問です。

root-dir/A/include/*.h
/src/*.cc
root-dir/B/include/*.h
/src/*.cc
root-dir/C/include/*.h
/src/*.cc

のような階層でsourceが置かれていて、
このroot-dirで
% doxygen doxygen.conf
を実行すると、
(略)
No input read, no output generated!
と出ます。
恐らく深い階層まで覗きに行ってないんだと思いますが、
深いところまで覗きに行かせる設定ってありますか?


196 名前:166 :03/11/09 23:52
>>190
すんません、その通りです。
クラスのメンバをテンプレートにできることを知らなかっただけです。
その程度のスキルなので許してください。

とりあえず上手くいきました。
あと、>>187のおっしゃることがよく判りました。
for_eachは第三引数をコピーで受けるので、関数オブジェクトの状態を返せないのです。
従って、traverserは参照で受けて、その中で自分でループを回さないといけないですね。

今回もいろいろ勉強になりました。どうもありがとうございました。


197 名前:デフォルトの名無しさん :03/11/09 23:58
> for_eachは第三引数をコピーで受けるので、関数オブジェクトの状態を返せないのです。
> 従って、traverserは参照で受けて、その中で自分でループを回さないといけないですね。

そんなこともないと思う。

198 名前:デフォルトの名無しさん :03/11/10 00:10
for_eachは、走査対象がconst参照で使い物にならなかったような記憶がある

199 名前:166 :03/11/10 00:29
>>197
あああ、いまヘッダファイル見てきたら、for_eachは受け取った関数を返してますね。
でも今回のような再帰呼び出しだと、やはり参照の方がコスト的によいかも...


200 名前:デフォルトの名無しさん :03/11/10 01:04
> for_eachは、走査対象がconst参照
んなこたぁない。

201 名前:デフォルトの名無しさん :03/11/10 01:38
% doxygen doxygen.conf

そもそも -g で doxygen.conf は出したの?

202 名前:デフォルトの名無しさん :03/11/10 01:48
-gで作ったの見ればすぐわかるよね。

203 名前:デフォルトの名無しさん :03/11/10 01:57
>>195
> 恐らく深い階層まで覗きに行ってないんだと思いますが
なんでそう思うんだ。
INPUTとFILE_PATTERNSにどういう値を設定したのか書いてみろ。

どうせ空っぽだろ


204 名前:デフォルトの名無しさん :03/11/10 02:02
>>195 >>201-203
誘導→http://pc2.2ch.net/test/read.cgi/tech/1065364445/l50

205 名前:デフォルトの名無しさん :03/11/10 03:11
ところで、C++のクラス継承図ってみんなどうやって管理してる?
自分の場合、doxygenで生成させて、そのTreeで継承元クラスを
参照していたりするんだけど、ブラウザとエディタとの連携が
いまいちで、もうちょっと上手な工夫がないものか?と
悩んでいる。



206 名前:デフォルトの名無しさん :03/11/10 03:14
「クラス継承図を管理する」ってのがピンとこないのですが、どんなことするのですか?
継承グラフを見るだけならdoxgygenで生成させるだけですけど、そうじゃないんですよね?

207 名前:195 :03/11/10 05:03
>201-203

% doxygen -g doxygen.conf

で作成した後doxygen.confを編集。
INPUT = . (つまりroot-dir)
FILE_PATTERNS = *.cc *.h
に書き換え。

それで、例えば同様の作業を
root-dir/A/src/
の中でやればちゃんとHTMLが生成されるものの、
root-dirの中でやると
No input read, no output generated!
となるのです。
つまり、深いところを覗けていないのではないかと推測。

これ、いかに?

208 名前:デフォルトの名無しさん :03/11/10 05:06
>>207
スレ違いだっつってんダロ。

209 名前:デフォルトの名無しさん :03/11/10 05:10
>>207
その設定で「深いところを覗」きにいくのを期待できると申すかRECURSIVE

210 名前:デフォルトの名無しさん :03/11/10 15:40
>205
doxygenの吐くHTMLを.chmに変換したらどう?

211 名前:デフォルトの名無しさん :03/11/10 17:04
>>207
> INPUT = . (つまりroot-dir)
バカ。.はカレントディレクトリだろ。何が「つまりroot-dir」だ。氏ね


212 名前:デフォルトの名無しさん :03/11/10 17:16
class A
{
private:
int m;
friend class BinA;
class BinA
{
BinA(A &a)
{
a.m;
}
};
};

class A
{
private:
int m;
class BinA
{
BinA(A &a)
{
a.m;
}
};
friend class BinA;
};
でコンパイル結果が変わるんだけど、VC++6.0だから?

213 名前:デフォルトの名無しさん :03/11/10 17:35
>>212
俺、VC++6.0持ってないからコンパイル結果がどう変わるのか言ってみて。

214 名前:デフォルトの名無しさん :03/11/10 17:44
上だとfriendが効かなくて、「mにアクセス出来ない」とエラーになる。
下だと通る。

215 名前:デフォルトの名無しさん :03/11/10 17:46
あぁ。なるほど。
ちなみに俺のVC7.1はぜんぜんもんだいない。

216 名前:デフォルトの名無しさん :03/11/10 17:58
しかしこうするとどちらもエラーが出て通らない罠。

#if 0 // or 1
class A
{
private:
int m;
friend class BinA;
class BinA {
BinA(A &a) {
a.m;
}
};
public:
f(const A& a) {
BinA(a);
}
};

217 名前:デフォルトの名無しさん :03/11/10 17:58
続き

#else
class A
{
private:
int m;
class BinA {
BinA(A &a) {
a.m;
}
};
friend class BinA;
f(const A& a) {
BinA(a);
}
};
#endif

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

218 名前:デフォルトの名無しさん :03/11/10 18:10
>215
やっぱ6.0の不具合か。情報サンクス

>216
それは単に必要な部分にpublicやconstがないからじゃないかな?

219 名前:デフォルトの名無しさん :03/11/10 18:46
クラスのメンバ関数の定義で「クラス名::」を省略する書き方ってないの?

class A
{
 A();
};

A::A(){}

いちいちこの部分書くのがメンドクサイよ

220 名前:デフォルトの名無しさん :03/11/10 18:59
>>219
class Aのスコープ中でコンストラクタの実体を定義してしまえ。

221 名前:デフォルトの名無しさん :03/11/10 22:54
外部DLLとのインターフェースに抽象クラスを使ったCOMライクな
インターフェースを使おうと思ってます。VC++6.0です。
こんなかんじ

struct IHoge
{
virtual void WINAPI Foo(int&) = 0;
};

疑問なんですが、VC++以外のコンパイラでも同じバイナリ構造を作ってくれるかどうか
また、メンバ関数の引数に参照を使いたいのですが
これも他のコンパイラと互換性があるかどうかなんですが
どうなんでしょ?

222 名前:デフォルトの名無しさん :03/11/10 23:27
>>221
COM使えよ

223 名前:デフォルトの名無しさん :03/11/10 23:36
工エエェェ(´Д`)ェェエエ工

224 名前:212 :03/11/10 23:39
もう一つ、以前どこかで見た気もしたけど
class B
{
protected: int m;
};
class D : public B
{
void f(B &b){b.m;}
};
D内でBのインターフェイスからBのprotectedにアクセス出来ないのは言語仕様?

225 名前:デフォルトの名無しさん :03/11/10 23:43
>>221
gccはvtableの持ちかたがVCと違うから上手く動かない、とどっかで聞いた気がする。

226 名前:デフォルトの名無しさん :03/11/10 23:48
>>224
仕様でふ

thisがDを知らない

227 名前:226 :03/11/10 23:49
失礼、bがDの中とは限らない

228 名前:デフォルトの名無しさん :03/11/11 00:03
拡張子がexeなものをコンパイルしたいのですが -etest
でやっても出来ない..。゚(゚´Д`゚)゚。
どうしたらいいでしょう?

229 名前:デフォルトの名無しさん :03/11/11 00:07
>>221
 Intel Compiler は ABI だかなんだかが同じで VC とは互換性があるみたい。
でも COM の interface 考えると、Windows 用の普通のコンパイラならどれでも
そういった単純な vtbl 参照は普通にできそうだけど。。。


230 名前:221 :03/11/11 00:08
>>225
gccで調べてみたらこんなの見つかりました。
ttp://www.tietew.jp/cppll/archive/1907
gcc以外のコンパイラなら大丈夫っぽい

231 名前:221 :03/11/11 00:16
>>229
どうもです。どうやら大丈夫っぽいっす。

参照引数の方はどうなんでしょうかね?
アセンブラで見てみたらVC++はポインタを渡してるみたい。
他はどうなのかな?
ポインタ渡しにした方が無難ですかね?

232 名前:デフォルトの名無しさん :03/11/11 00:18
なんでCOMにしない?

233 名前:221 :03/11/11 00:27
>>232
そんな大袈裟にするほどの物ではないから。
っていうか作り方よくわからん。

234 名前:デフォルトの名無しさん :03/11/11 00:27
>>232
COMの肝を押さえときたいんだろ
わかるよ気持ち

235 名前:デフォルトの名無しさん :03/11/11 00:32
今時COMの肝を抑えても無駄な気がするけど

236 名前:デフォルトの名無しさん :03/11/11 00:37
>>219
http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1420.pdf

237 名前:219 :03/11/11 02:20
すばらしい!

でもVC6じゃダメっぽいですよ!

238 名前:デフォルトの名無しさん :03/11/11 03:19
前スレ終了 age

239 名前:デフォルトの名無しさん :03/11/11 04:51
前スレ>>999ワロタ氏ね

240 名前:デフォルトの名無しさん :03/11/11 04:56
>>237
まだ提案の段階だからね。

241 名前:デフォルトの名無しさん :03/11/11 12:59
書式付きの文字列が欲しいのですが、どうするのがC++っぽいですか?
たとえばHogeXX (XXは数字)という文字列を欲しいとき、
漏れが危険を承知でやったのが次の通り。
string *st = new string(16);
sprintf(const_cast<char *>(st->c_str()), "Hoge%02d", num);

242 名前:デフォルトの名無しさん :03/11/11 13:12
>>241
char st[7]; でいいじゃねーか。なんでわざわざ危険を冒すのかね?

// C++
std::ostringstream formatter;
formatter << "Hoge" << std::setw(2) << std::setfill('0') << num;
std::string st = formatter.str();

// C++ boost
std::string st boost::io::str( boost::format( "Hoge%1$02d" ) % num );

243 名前:デフォルトの名無しさん :03/11/11 13:23
// C++ boost
std::string st = boost::io::str( boost::format( "Hoge%02d" ) % num );

244 名前:デフォルトの名無しさん :03/11/11 13:38
gcc3.3ではmakeできるのですが、Solaris CC ですと ios_base.h がないため
_Ios_Fmtflags が使えません。多分 int を使えば良いと思うのですが、
コンパイラーごとに型を変えるプログラムってどうやって書けばいいのでしょうか

245 名前:デフォルトの名無しさん :03/11/11 13:46
ageわすれた

246 名前:デフォルトの名無しさん :03/11/11 16:18
>>244
普通 ios_base::fmtflags で使うと思うけど?
_ で始まる奴は環境依存だから無くて当たり前(ある時もあるけど)。

247 名前:デフォルトの名無しさん :03/11/11 16:38
つぅかいまどき.hつきのヘッダなんぞ使うな

248 名前:◆KZBEEFEAtA :03/11/11 17:23
>>246
そうなんですか。Solaris だと ios_base という

249 名前:248 :03/11/11 17:28
とちゅうで送ってしまった。

そうなんですか。Solaris だと ios_base という header はなくて他のところに
あるんですね。

>>247
確かに、.h つきはもう使ってはだめですね。

ところでもう一つ質問ですが、gcc3.3 では setiosflags がコンパイル通るのですが
CC ですと

Error: The function "setiosflags" must have a prototype.

とエラーがでて使えません。ちゃんと header file を <iomanip> を読んでいるのですが
なぜダメなんでしょうか?

250 名前:デフォルトの名無しさん :03/11/11 18:18
>>249
grep して setiosflags がどのファイルにもないなら、
コンパイラが古くて setiosflags マニピュレータが
実装されてないんじゃないかな。
だから、setf を使うか、自分でマニピュレータを実装するか、やね。

>>247
gcc だと bits/ios_base.h で定義されてるのね。
で、ios は bits/ios_base.h をインクルードしてる。
ios_base.h を直接使うわけじゃない。


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