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


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

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

過去スレ、関連スレ、関連リンクなどは >>2-13

2 名前:v(^・^)v :04/04/16 01:45
 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/

3 名前:v(^・^)v :04/04/16 01:46
■基本■
[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/04/16 01:46
■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 名前:v(^・^)v :04/04/16 01:47
■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/04/16 01:47
S

7 名前:v(^・^)v :04/04/16 01:53
■関連スレ■
-【C++】template 統合スレ -- Part3
http://pc5.2ch.net/test/read.cgi/tech/1066493064/l50
- ぼるじょあがC/C++の宿題を片づけますYO! 21代目
http://pc5.2ch.net/test/read.cgi/tech/1078157730/l50
- ★初心者にVisual C++を教えるスレ★ Part11
http://pc5.2ch.net/test/read.cgi/tech/1077965179/l50
- ■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/l50
- ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/l50
- C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/l50
- COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/l50
- managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/l50
- C++Builder相談室 Part9
http://pc5.2ch.net/test/read.cgi/tech/1080541814/l50
- タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/l50
- Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/l50
- Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/l50
- GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/l50
-OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/l50
- タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/l50

8 名前:1 :04/04/16 01:59
なんか、ちょぃと失敗気味なスレ立てになっちまった…

すまぬ。

9 名前:Addicted to C++ ◆nrBjarne.g :04/04/16 02:48
乙!

10 名前:デフォルトの名無しさん :04/04/16 04:04
STL使うと(ry

11 名前:デフォルトの名無しさん :04/04/16 04:19
>>10
環境に(ry

12 名前:デフォルトの名無しさん :04/04/16 04:23
>>11
すげ(ry

13 名前:デフォルトの名無しさん :04/04/16 05:16
C1010: プリ(ry

14 名前:デフォルトの名無しさん :04/04/16 05:19
>>13
#inclu (ry
あと氏(ry

15 名前:デフォルトの名無しさん :04/04/16 05:21
>>14
言葉が(ry
まぁヒント(ry
うむごくろ(ry

16 名前:デフォルトの名無しさん :04/04/16 05:58
>>(ry

17 名前:デフォルトの名無しさん :04/04/16 08:32
もまいらムダにスレを消費す(ry

18 名前:デフォルトの名無しさん :04/04/16 11:36
MSDNにのっていなかったので...
yyy.cpp
c:\xxx\yyy.cpp(0) : fatal error C1001: 内部コンパイラ エラー
(コンパイラ ファイル 'msc1.cpp', 行 2701)
Visual C++
ヘルプ メニューで、サポート情報コマンドを選択してください。またはサポート情報 ヘルプ ファイルを参照してください。

zzz.cpp
c:\xxx\zzz.cpp(0) : fatal error C1001: 内部コンパイラ エラー
(コンパイラ ファイル 'msc1.cpp', 行 2701)
Visual C++
ヘルプ メニューで、サポート情報コマンドを選択してください。またはサポート情報 ヘルプ ファイルを参照してください。

DEBUGでビルドするとこんなエラーが出るようになりました
Releaseビルドだと問題なくビルドできます
MFCAppwizardで作成したのですがMFCもATLもオプションから外してあります
コンパイラのエラーでしょうか?
VisualStudio .net 2003です

19 名前:デフォルトの名無しさん :04/04/16 11:47
VC6.0の頃でたことあったな…。
その時は、F7やF5でコンパイルするとダメだったけど、
「ファイルを選択→右クリック→コンパイル」
とするとなぜか通ったので、それで回避してた。

原因は面倒だったので追ってないが、プロジェクトの肥大化が
原因じゃないかと思ってる。(根拠なし)

20 名前:デフォルトの名無しさん :04/04/18 01:03
ちょいとスレ違いかもしれないけど朗報っぽいんで
Microsoft Visual C++ Toolkit 2003
http://msdn.microsoft.com/visualc/vctoolkit2003/

21 名前:デフォルトの名無しさん :04/04/18 03:16
>20
GJあげ

22 名前:デフォルトの名無しさん :04/04/18 11:08
行列表記したいのですが、
1. std::vector< std::vector<double> >
2. boost::multi_array
3. blitz::array
だとどれが速度的にいいでしょう?

23 名前:デフォルトの名無しさん :04/04/18 12:06
お前の環境とお前の使用するサイズでベンチマークしろ

24 名前:デフォルトの名無しさん :04/04/18 12:37
>22
遠慮なく使え

template <typename T>
struct GYOORETSUDESUUpupupu {
T _11, _12, _13, _14;
T _21, _22, _23, _24;
T _31, _32, _33, _34;
T _41, _42, _43, _44;
};


25 名前:22 :04/04/18 12:43
ここはマジレス禁止スレなんですか?

26 名前:デフォルトの名無しさん :04/04/18 12:48
マジレス禁止スレかもしれないのに
「マジレス禁止スレなんですか?」って聞くバカ発見

27 名前:デフォルトの名無しさん :04/04/18 12:52
うそつき村を思い出すな。

というか、 >>22 は速度だけが問題なのか。保守性とか考えないのかな。
本当に速度最優先なら環境と使い方に依存する面が大きいので
>>23 の通り、実際に測って比較するしかない。

28 名前:デフォルトの名無しさん :04/04/18 12:53
つぅか、一口に速度っても色々あるだろうに。
数値演算における"行列"なら標準ライブラリではvalarrayの担当。

29 名前:デフォルトの名無しさん :04/04/18 13:26
>>28
std::valarrayで多次元配列同士の演算(乗算とか)は
面倒だろう。効率も悪い。

30 名前:デフォルトの名無しさん :04/04/18 13:27
結論:double[][]が一番早い。

31 名前:デフォルトの名無しさん :04/04/18 13:32
俺の環境なんかだとblitzは(演算にもよるんだろうが)gccの方がiccより
圧倒的に速かったりするし、ホントにコレは環境依存だと思う。
gcc でもvalarray より vector の方が速かったりするしね…。

32 名前:デフォルトの名無しさん :04/04/18 14:22
valarrayはalias-freeなのが売りなので、alias-freeだとコンパイラに明示的に指定して
なんぼだと思っていたのですが(そしてgccはalias-freeの指定がなかったはず)。
あぁっと、sliceが使えるという利点もありますね。
いずれにせよvalarrayは時代の遺物というのが一般的な認識だと思います。
あと、boost::multi_arrayじゃなくて、せめてboost::ublasを引き合いに出してほしいです。
まぁ、上で言われているとおりまず測定するのが先でしょう。
数値計算は環境に非常に敏感な処理ですから。

ところで便乗になりますが、unrollの回数なんかをクライアントが環境に合わせて
調整できるような線形代数ライブラリはないんでしょうか?C++で。

33 名前:デフォルトの名無しさん :04/04/18 22:15
>>32
MTLがそんな事出来たような気がしなくもないけど忘れた。勘違いかも。

34 名前:デフォルトの名無しさん :04/04/18 23:48
100000x100000が欲しいので>>24さんそれもヨロ。



35 名前:デフォルトの名無しさん :04/04/18 23:56
レスくれた方々有難うございます。

boost::multi_arrayのドキュメント読むとblitzからの貢献があった
となっています。
blitz::arrayはboost::multi_arrayに吸収されたと思っていいですか?
準標準と言われるものが2つもあるとどれにするか悩みますが。

36 名前:デフォルトの名無しさん :04/04/19 00:28
>>35
で、レスされたことを実行しようとはしないわけ?>速度計測

37 名前:デフォルトの名無しさん :04/04/19 00:29
>>24
_で始まる名前を使うなっ(とレスしてみる)

38 名前:デフォルトの名無しさん :04/04/19 10:19
>>36 今週中にはやるから。今、暇がないし。

前もってある程度手がかりが欲しかったのよね。

39 名前:デフォルトの名無しさん :04/04/19 12:51


40 名前:デフォルトの名無しさん :04/04/19 16:28
>>37
あ、おれよく使う。やばい?

41 名前:デフォルトの名無しさん :04/04/19 16:36
標準ライブラリや処理系定義のライブラリと名前衝突しても文句言えん。そんだけ。

42 名前:デフォルトの名無しさん :04/04/19 16:45
オレ、名前付けのセンスあるから多分ぶつからない。
ぶつかってもコンパイラが警告出してくれるからいいや。

43 名前:デフォルトの名無しさん :04/04/19 17:25
24のって一応標準を読む限り安全な変数名だと思うのだが・・・漏れが標準を読み間違ってる?
boost::lambdaでもplaceholderとして同様な名前を使ってるし.

17.4.3.1.2 - Global names [lib.global.names]
-1- Certain sets of names and function signatures are always reserved to the implementation:

Each name that contains a double underscore ("__") or begins with an underscore followed by an uppercase letter (lex.key) is reserved to the implementation for any use.

Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.*
[Footnote: Such names are also reserved in namespace ::std (lib.reserved.names). --- end foonote]


44 名前:初心者 :04/04/19 17:41
int nx,ny,nz;

class body
{
double *r[ny][nz];
public:
body()
{
r = new double[nx][ny][nz]
};
};
のようにメモリーを当てたときデストラクターはどのようにすればいいのでしょうか?
delete [] r としてもうまくいかず・・・・
あとこの形は

class body
{
double ***r;
public:
r = new double** [nx];
for(int i=0;i<nx;i++) r[i]= new double* [ny];
for(int i=0;i<nx;i++)
for(int j=0;j<ny;j++)
r[i][j] = new double [nz];
};
のようにメモリーを当てるのと同じ意味なんでしょうか?
長くてすいません。

45 名前:デフォルトの名無しさん :04/04/19 18:28
Matrixのクラスライブラリを作りました。

template< typename X > class Matrix{
public:
Matrix<X>();
friend Matrix<X> operator*<X>( Matrix<X> const &, Matrix<X> const &);
};

gccではなんの問題もなくコンパイルできたのですがVS7.1だと
operator*<X>が気に入らないみたいです。どうやったらコンパイルできるんでしょう?

46 名前:デフォルトの名無しさん :04/04/19 18:43
やりたいのはポインタの2次元配列じゃなくて
2次元配列へのポインタ
double (*r)[ny][nz];
じゃないのか?

47 名前:デフォルトの名無しさん :04/04/19 19:09
>>44
その前にそのコードコンパイル通ったか?

48 名前:デフォルトの名無しさん :04/04/19 19:31
>>45
意味不明。 operator* だけでいいだろ。



ひょっとして、釣りか?

49 名前:デフォルトの名無しさん :04/04/19 21:09
>>45
operator*をtemplateとして定義しようとしていますね?
VC++7.1での一つの解決法は,operator*のtemplateの前方宣言を入れることです.
ただ,その前にさらにMatrixの前方宣言を入れる必要がありますがw

template<typename X> class Matrix;
template<typename X> Matrix<X> operator*(Matrix<X> const &, Matrix<X> const &);
template< typename X > class Matrix{
//定義
};

もう一つのやり方はfriend関数の定義をclassスコープ内に書いてしまう,
いわゆるBarton-Nackman trickを使うことです.

template<typename X> class Matrix{
...
friend Matrix<X> operator*(Matrix<X> const & lhs, Matrix<X> const & rhs){
return Multiply(lhs, rhs); //他へ委譲する
}
};

>>48
一見それでよさそうなんですが,関数templateに対してそうやると面食らう結果になりますよ.
(理由を説明すると長いんですが・・・)

50 名前:デフォルトの名無しさん :04/04/19 21:28
ところで、>>45は、マルチなわけだが。

51 名前:デフォルトの名無しさん :04/04/19 22:28
>>45
Matrix<X>の前にtypenameを入れたらどうか。
VC7.1は本来typenameを入れなければならない場所に入れなく
てもコンパイルが通ることがあるくせに、入れなくてもいい場所
に入れないとエラーを起こす事がある。

52 名前:45 :04/04/20 00:20
>>49
確かに前方宣言でこのoperatorに関してはコンパイルが通りました。
ところが同じ関数名で引数が異なる関数の宣言部分

template< typename X > class Matrix{
public:
Matrix<X> func(void);
friend Matrix<X> func<X>( Matrix<X> &);
};

のフレンドの funcでエラーが出ます。前方参照を使っても駄目なようです。
gccは全く問題なく通るのですが、これらの余計な前方参照を要するのは
VC7.1のバグなのでしょうか?

53 名前:45 :04/04/20 00:24
>>48
ストラウストラップよーく読んでね。ホント見落としそうなところに
チョコっとだけ書いてあるから。もちろん前方宣言要とは一言も書いてないけど。

54 名前:デフォルトの名無しさん :04/04/20 03:33
>>52
friend宣言しているfuncがメンバ関数のfuncを指していると解釈されてしまっていると思います.
スコープ解決子を使って見て下さい.

friend Matrix<X> (::func<X>)(Matrix<X> &);

ちなみに関数名の周りのカッコが無いと(Matrix<X>::func)と解釈しやがりますw.

前方宣言についてですが,
friend宣言の時点で関数テンプレートの実体化を行わせるわけですけれど,
その時点で関数テンプレートの宣言は見えていないとならないですから,
私としては前方宣言は必須だと思うのです.
gccの実装ではfriend宣言の後方にまで関数テンプレートの宣言を読みに行ってくれる
ようですが,むしろこちらの方が気が利きすぎかと思います.

55 名前:デフォルトの名無しさん :04/04/20 03:39
>>52
あと49にも書いたのですが,前方参照がわずらわしいなら,friend関数の定義を
クラススコープ内に書くのもおススメします.(49の書き方はわかりにくかったですね)

template<typename X> class Matrix{
...
friend Matrix<X> operator*(Matrix<X> const & lhs, Matrix<X> const & rhs){
//ここにoperator*の定義を書いてしまう.
}
};


56 名前:デフォルトの名無しさん :04/04/20 12:26
>>54,55
丁寧に回答していただきありがとうございました。

>ちなみに関数名の周りのカッコが無いと(Matrix<X>::func)と解釈しやがりますw.

これはここで質問しないと絶対にわかりませんでした。本当にありがとうございました。
前方宣言もgccに甘えていたわけですね。VCのせいにして恥ずかしい限りです。

あと>>49で十分よくわかります。一段余分に関数コールするのがちょっと気になったので
できればまっとうな(?)書き方でなんとかならないかと思っていましたので・・・

親切に教えていただき感謝の気持ちでいっぱいです。

57 名前:56 :04/04/20 14:24
つづきです。

template< class X > class Matrix;
template<class X> Matrix<X> & Func( Matrix<X> &);
template<class X> X FuncA( Matrix<X> &);

template<typename X> class Matrix{
Matrix<X> & FuncA(void);
friend Matrix<X> & (::FuncA<X>)( Matrix<X> &);

X FuncB(void) const;
friend X (::FuncB<X>)( Matrix<X> &);
};

FuncA はOKですが FuncBは
テンプレート'X'番目の引数の型が無効です。
関数ではありません。
と文句が出ますね。この違いは戻り値の違いでしょうか?

あと、
friend Matrix<X> (::func<X>)(Matrix<X> &);
これは、gcc ではsyntax errorではねられるみたいですね。

うーん!>>49さんの言われるトリック使わないとだめかも・・・

58 名前:56 :04/04/20 18:37
icc では前方宣言+スコープ解決子できれいに通りました。
結局
gcc3.3.1: テンプレートの前方宣言なしOK, スコープ演算子使うとエラー
icc8.0: 前方宣言+スコープ演算子が要
VC7.1: 前方宣言要,スコープ演算子要,時にスコープ演算子でもエラーとなる。
って結果でした。
さて、VCはどうしよう?

59 名前:デフォルトの名無しさん :04/04/20 23:54
C++のクラスってのが書き方がめんどくさいし、継承とか意味が分かりません
クラスって構造体に関数を加えたやつですよね
大規模な開発で関数が多くなったり、再利用するためにライブラリ化するのに
クラスを使えばいいとは思うんですが、それ以外ってややこしくなるだけですよね
小規模やライブラリ化しないのであれば、C++よりCの方が分かりやすくていいですよね

どうしてC++で作ったほうが良いのかがよく分かりません
小さいソフトでもややこしいC++で作ったほうが良いのでしょうか?
ややこしいC++なので、大きなソフトで使えばさらにややこしくなると思うんですが…
それでも使っ方が良いんでしょうか?

60 名前:デフォルトの名無しさん :04/04/21 00:02
>>59
そんな君に
ttp://www.amazon.co.jp/exec/obidos/ASIN/4797311126/250-5351434-6401851

61 名前:デフォルトの名無しさん :04/04/21 00:39
59はC,C言ってるけど実はFortran使いの匂いがするな…って気のせいか…

62 名前:デフォルトの名無しさん :04/04/21 00:55
> ややこしいC++なので、大きなソフトで使えばさらにややこしくなると思うんですが…

そうはならない。
C++のややこしさを使って、大きなソフトを単純な記述で表すことが可能になったりする。

63 名前:デフォルトの名無しさん :04/04/21 01:05
>>59
単に今のところC++から脱落していると言うだけのようですね。
がんばって理解すれば、ちょっとしたものでもC++で書きたくなります。

64 名前:デフォルトの名無しさん :04/04/21 01:07
>>60
>>59レベルのやつにいきなり読ますなって(w
むしろ「憂プラ」の方が入りやすいんじゃ?

というか、オプジェクト指向の必要性を感じないなら無理にC++つかわんでCでいいやン。
多分、>>59氏にはそれで十分なんだよ。

65 名前:デフォルトの名無しさん :04/04/21 01:43
>>59 の言ってる
>小規模やライブラリ化しないのであれば、C++よりCの方が分かりやすくていいですよね
は正しいと思うし、
>小さいソフトでもややこしいC++で作ったほうが良いのでしょうか?
こういう疑問を持つのは当然だと思う。ややこしいっていうのは単に文法がややこしいだけじゃなくて,
C++使っての駒組みっていうか全体構成を考えることもすごくややこしいと思うよ。デザインパターンの話じゃないんだよな。
C++を使って人様が実行速度に満足し,かつエクスキューズなしに安心して使えるクラスライブラリを提供すること
は至難の業だと思うよ。だからC#なんてのが出てきたわけだし,HDLでもC++ベースのSystemCなんてのは
ブレークするかと思った瞬間に牽引会社のSynopsysが手を引いた。これじゃ生産性があがらないと判断したと思う。
300ページぐらいなら読むけど1000ページ超えた言語解説書読破して隅々まで覚えてる奴そう多くないだろ?

66 名前:デフォルトの名無しさん :04/04/21 01:45
別にクラスを使わなくてもC++使ってると言ってる人は、
少なくはないんじゃないかと、ふと思ったり。。。

67 名前:デフォルトの名無しさん :04/04/21 02:01
>>66
多いよ〜。
「C++です」って注釈のついたソース読んだけど、OldCスタイルだったし。

で、「小規模」をどう判断するかでも変わるけど、
c++でcと同程度に書くことは可能だし巧く書ければ
可読性や保守性の点でcに勝ることも可能だと思う。
#問題は、それをできる技術者が少ないことだな。

68 名前:デフォルトの名無しさん :04/04/21 02:53
単純にC++で書いたほうが必然的に頭の中が整理されるので好んで使ってる。
こんな風に思ってるオレって、もしかしてC++のことよくわかって無いのかな?

69 名前:デフォルトの名無しさん :04/04/21 03:02
pure Cではほとんど書いてないな。// はANSI Cではコメントとして認められてたっけ?
TurboからBorlandに変わってすぐにPC-98の上でビヤーンとにらめっこ
しながらC++コード書いてたが、やってはいけないことがよくわからなかった。
Effective C++あたりはそこら辺がうまくまとめられてるんだけど、そんなの未だ出版
されてなかったから手探りで随分遠回りしたよ。
人様の作ったクラスライブラリ使わせてもらうだけならいいんだろな?多分!
禿げビヤーンとEffective Vol1,2読んでオブジェクト指向の本読んで、デザインパターンの
本読んで・・・いつになったら一人前になることやら・・・
そうこうしてるうちにC++自体あぽーんしたってか?

70 名前:デフォルトの名無しさん :04/04/21 03:14
>>68
いきなりクラスから作り始めるわけ?
俺それできない。
ある程度Cで関数作ってみてから全体構成考えてクラス作る。


71 名前:デフォルトの名無しさん :04/04/21 03:25
ハードウェアに密着してたり、アセンブラに近い速度出したい人はCとアセンブラでギンギンにチューンしてください。
アプリ組みたい人はC#でやってね。
C++は暇な人やってください。

俺は暇なのでC++使ってる。
あと,complex標準でサポートしてる言語ってFORTRANとC++以外にあった?

72 名前:デフォルトの名無しさん :04/04/21 04:28
>>58
あきらめてクラススコープ内に定義書いちゃいましょうw.
そっちの方が圧倒的に楽だと思います(色々実験して疲れたw).

73 名前:デフォルトの名無しさん :04/04/21 04:39
>>70
C++でやった方が綺麗に書けることが多いよ。
データソースが、ファイルかリソースかメモリであるかを
意識しないでアクセスできるようなストリームクラスを作ってみ?
C++のありがたさが本当にわかるから。
純粋仮想関数の使い方を理解したらCには戻れないよ。

74 名前:デフォルトの名無しさん :04/04/21 05:06
>>70
普通、データ構造とか先に考えてからじゃないと、
アルゴリズムは決まらないでしょ。
ちょっと、効率悪い作り方してるかもしれないから、
先輩とか上司に相談してみたらいいと思うよ。

75 名前:デフォルトの名無しさん :04/04/21 05:09
趣味のプログラミングだったら、その場の思いつきの
行き当たりばったりの作り方でいいと思うけど、
仕事でそんなことやったら上司から雷落ちるなー。
設計と製造を行ったり来たりどたばたしたらマジで鉄拳飛んでくるw
プロの仕事ってそんなもんよ。

76 名前:デフォルトの名無しさん :04/04/21 05:13
>>70
そういう怪しい作り方をしないようになるためにも、
C++やったほうがいいかもよ。いやまじで。

77 名前:76 :04/04/21 05:14
っていうか、いきなり作り始められるところがすごいと思う。
少なくても、作ろうと意識した瞬間、
既に頭の中には仕様書が出来ている?

78 名前:デフォルトの名無しさん :04/04/21 05:45
>77
最初から脳内ですべてのクラス設計が出来る人間などいない

まずは作ろうとしているソフトウェアの要素となる「もの」を
リストアップして紙に書き出してみろ
そしてさらにその「もの」が内包する要素を書き出していけ

で次はそれらがどう関連しあっているかを適当でいいから図にしてみろ
最初から完璧な図を書こうとするより、とにかく思うままに関連性を
図にしていってみろ
おかしい部分に気付いたら、その時に直していけばいい

そうやっていけば、何をクラスにしていけばいいかが見えてくる
こういうことを繰り返していけば、経験則としてどういうクラス設計が
妥当かというのはいずれ身についていくよ


79 名前:デフォルトの名無しさん :04/04/21 06:08
似たようなソフトばっかり作ってるんだから
惰性で決まるだろ

80 名前:デフォルトの名無しさん :04/04/21 07:01
>>73
ストリームクラスを作るより、むしろ、
ストリームを引数に持つ汎用関数を作ると思うのだが。
例:
void Func1(FILE* fp);
void Func2(std::iostream& strm);

ストリームクラスの自作は、あまりに面倒ではないかい?

81 名前:デフォルトの名無しさん :04/04/21 08:34
>>80
そんなに面倒じゃないと思うぞ

82 名前:デフォルトの名無しさん :04/04/21 09:07
>>80
そう考えてしまうのはオブジェクト”思考”ができていないから。
例えば、Func1を利用する巨大な処理がある場合、後でファイルからではなく
メモリからアクセスするように変更しようとしたとき、全て書き換えることになる。

基底クラスStreamで純粋仮想関数Readという感じで作っておき、
派生クラスFileStream、MemoryStreamなどで、Readをオーバーライドすれば、
Streamを扱う側は、それがメモリであるかファイルであるかを考えることなく、
それらを扱えるようになる。

簡単なリードライトであれば、初心者でも一日ぐらいでストリームクラスを自作でき、
その効果が実感できると思う。


83 名前:!=80 :04/04/21 12:15
>>82
Func2にstd::fstreamの代わりにstd::stringstreamを渡せば
良いだけでは?

84 名前:!=82 :04/04/21 12:41
Func1を利用する処理がある場合と書いてるじゃん

85 名前:デフォルトの名無しさん :04/04/21 13:45
>そう考えてしまうのはオブジェクト”思考”ができていないから。
アフォの一つ覚えじゃねえのか?オブジェクト指向プログラミングやりたいなら
C++がベストチョイスじゃないだろが?まっとうなオブジェクト指向でいきたけりゃ
別な言語使え。
しかもストリームクラスの自作?いったい何の必要性があってそんな無駄なこと
せにゃならんのだ?大体メモリに関しては速度低下もたらすような余計な操作を
経由することなくアクセスしたいがためにC#じゃなくC++を使ってるのに、バカ学生かお前?

86 名前:83 :04/04/21 13:47
>>84
そお?82氏の言いたい事ってストリームを抽象化したクラスを
作れって言いたいのでは。
80氏がFunc1とFunc2を何でならべて書いたのかわかんないけど、
>そう考えてしまうのはオブジェクト”思考”ができていないから。
ってのはちと的外れなような・・・。

87 名前:デフォルトの名無しさん :04/04/21 13:58
>>75
>設計と製造を行ったり来たりどたばたしたらマジで鉄拳飛んでくるw
>プロの仕事ってそんなもんよ。
君の会社暴力団かね?

88 名前:デフォルトの名無しさん :04/04/21 14:20
例えば、ハード屋にアルゴリズムを説明したり、DSPのコーディングを外部に委託
するとき、C++で元のコード書いてるとすごく見通しが悪くなるんだなこれが。
C++はこれからも使われ続けるだろうけど、ビジネスの峠は超えたな。
Unix系は相変わらずCが多いしな。


89 名前:デフォルトの名無しさん :04/04/21 14:21
>>78
それは>>70氏に言ってあげてください。

90 名前:デフォルトの名無しさん :04/04/21 14:25
>>87
そうやって話の腰を折るんだよね。
プロ意識が無い香具師ほど、こんなこと言って話をそらす。

91 名前:デフォルトの名無しさん :04/04/21 14:32
多重継承をサポートしてる言語ってC++以外にある?
で、これ禁止すれば随分すっきりするよな。

92 名前:デフォルトの名無しさん :04/04/21 14:42
使わなければすっきりするよ。

93 名前:デフォルトの名無しさん :04/04/21 14:59
今の会社で鉄拳制裁加えでもしたら傷害罪でやった奴は間違いなくクビ。
どころか前科者だわな。まっとうな会社でそんなことする会社あるのか?
聞いたことないな。

94 名前:デフォルトの名無しさん :04/04/21 15:00
粘着が1人いますね。

95 名前:デフォルトの名無しさん :04/04/21 15:01
C++で多重継承使ってる奴いる?多重継承の必要性について熱く語ってくれ!

96 名前:デフォルトの名無しさん :04/04/21 15:01
>>93
そんなこと気にするより、自己を磨くことに専念したほうがいいよ。


97 名前:デフォルトの名無しさん :04/04/21 15:03
そんな会社に居続けるよりやめたほうがいいよ。

98 名前:デフォルトの名無しさん :04/04/21 15:03
>>95
使う人は使えばいいし、必要性の感じない人は使わなければいい。
無理に使おうとして苦労するのも時間の無駄だし、
多重継承だけがC++のご利益では無いから。

99 名前:デフォルトの名無しさん :04/04/21 15:05
オレ、データのカプセル化、
ライブラリのラッパーぐらいにしか使ってないよ。。。
それでもC++がいいよ。Cよりちょっとだけコーディング楽だから。

100 名前:デフォルトの名無しさん :04/04/21 15:06
>>97
まあ、個人の自由だな。


101 名前:デフォルトの名無しさん :04/04/21 15:10
仕事でバタバタしたからといって殴るより、仕事中2CHにアクセスしてる奴を殴ってやりゃどうだ。有限会社ところか三ちゃん会社だろうけどよ。

102 名前:デフォルトの名無しさん :04/04/21 15:12
>>101
まったくその通りですね。先ずはあなたから。

103 名前:デフォルトの名無しさん :04/04/21 15:13
っていうか、殴るに異様に反応する人がいますね。

104 名前:デフォルトの名無しさん :04/04/21 15:14
普通だったら比喩的表現ってみるだろ。
何、過剰反応してるんだか。
関係ない話ですマソ。

105 名前:デフォルトの名無しさん :04/04/21 15:19
JavaもC#も多重継承は必要悪としてる。無くても十分と判断してるわけだな。
C++ではそれを認めてるわけだが、それが理由でC++を使ってる人居るのかい?

106 名前:デフォルトの名無しさん :04/04/21 15:21
WTL。

107 名前:デフォルトの名無しさん :04/04/21 15:27
必要な人は使ってるし、必要で無い人は使ってないんじゃないかな。

108 名前:デフォルトの名無しさん :04/04/21 15:29
だから、サポートしていても使わなければいいだけの話で。
他のC++の機能の恩恵を受けている人もたくさんいるわけで。

109 名前:デフォルトの名無しさん :04/04/21 15:30
必要、不必要と言う話なら、もうこの辺で終わりにしたら?
必要なら使う、必要でないなら使わない。以上。

110 名前:デフォルトの名無しさん :04/04/21 15:34
>>108
だから他の機能のことはどうでもいいよ。君に無理にそれを聞いてるわけじゃないんだから,
使ってなければわざわざレスはいいよ。
こっちは多重継承にどんな実例があるのか聞きたいわけなんだから。

111 名前:デフォルトの名無しさん :04/04/21 16:07
lib_socket_init(srvName, &errNum)
ソケット通信関連の関数みたいなんですが、なんなんでしょうか?。
一般的な物ですか?。

112 名前:デフォルトの名無しさん :04/04/21 16:10
> 一般的な物ですか?。
ググればわかるよ

113 名前:デフォルトの名無しさん :04/04/21 16:13
>>110
「多重継承の必要性について熱く語」られても今更迷惑だし…

114 名前:デフォルトの名無しさん :04/04/21 16:16
>>110
それこそ、本を買いあさって読むほうが早いと思うよ。
そこまでやってピンと来なければ、
そういうもんだと諦めるしかないかもね。
あと、仕事などでやってる実例はここでは言えないし。

115 名前:デフォルトの名無しさん :04/04/21 16:31
>>114
だから言えなければレスしなくていいってば!教えてくれる気がある人だけコメントくれればそれでいい。
そんなに書き込みたいの?まともな実例載ってる本が見当たらないから、ここに相談しに来てるんだし。

116 名前:デフォルトの名無しさん :04/04/21 16:33
>>115
cppll にでも行ってみ

117 名前:80 :04/04/21 16:34
このスレは「車輪の再発明」で独り悦に入るマニアの多いスレですね(w

118 名前:デフォルトの名無しさん :04/04/21 16:36
懐かしい話をここで聞くとはw

119 名前:デフォルトの名無しさん :04/04/21 16:37
オレにはどういう話のつながりかわからないよ〜。
車輪の再開発。話は知ってるけど。。。

120 名前:デフォルトの名無しさん :04/04/21 16:38
>>115
“自分が求めている答以外は許せないタチ”ですか?
いちいち反応しすぎです。

つか、iostream じゃダメ?

121 名前:デフォルトの名無しさん :04/04/21 16:40
要は車を作るのに車輪から新規開発するメーカーはないでしょってこと。
違ったっけ?
で、どこと話がリンクするの?

122 名前:デフォルトの名無しさん :04/04/21 16:40
リンクエラーです。。。

123 名前:デフォルトの名無しさん :04/04/21 16:41
>>115
>>106

124 名前:デフォルトの名無しさん :04/04/21 16:41
>>122
いや、ハイパーリンクでいいのですが。

125 名前:デフォルトの名無しさん :04/04/21 16:43
iostream っていう実例があるのに、周期的に「多重継承の実例ない?」厨が発生するのはなぜだろう。
は、ひょっとして釣り?

126 名前:デフォルトの名無しさん :04/04/21 16:45
車輪ってiostreamのことか。わかりましたー。

127 名前:デフォルトの名無しさん :04/04/21 16:46
>>115は先ずiostreamをよく調べてからここに来なさいって琴田。
話はそれからでも遅くは無い。以上。

128 名前:デフォルトの名無しさん :04/04/21 17:21
>>71
C(99)

129 名前:デフォルトの名無しさん :04/04/21 17:49
言語仕様の一部を実現するために全体の言語仕様を決めました。

130 名前:デフォルトの名無しさん :04/04/22 02:18
筒子の2から8を2個ずつ集めるのも車輪ですよ。それも大きな。

131 名前:デフォルトの名無しさん :04/04/22 02:48
つまんね

132 名前:デフォルトの名無しさん :04/04/23 09:32
newで確保した領域って,
私の環境(Linux 2.4.25,g++ 3.3.3)ではzero fillされるようなんですけど,
これって規格で保証されてるものなんでしょうか?
例えば,
map <short, double> m0;
m0 [0];
cout << m0 [0] << endl;
ってやったときに,0って返ってきて欲しいのだけれど.
たまたまかなぁ.


133 名前:デフォルトの名無しさん :04/04/23 09:53
mapの要素はデフォルトコンストラクトされるので、その場合は0が保証される。
newで生成する値については少し事情が違う。

134 名前:デフォルトの名無しさん :04/04/23 10:34
cppll、もうやだ。
FreeMSVCって環境依存のはなしだろ!?
初心者がそういう話したら、ぺきっておるくせに。

135 名前:132 :04/04/23 10:37
早速の返答,ありがとうございました.よく分かりました.
>>133
> mapの要素はデフォルトコンストラクトされるので、その場合は0が保証される。
ただ,この説明で新たに疑問が生じたのですが,
私の環境では,スタックに,
double d0;
とか取ったときにはd0が0でないことがあります.
スタックに組み込み型を取った場合は
デフォルトコンストラクトはされないんということでしょうか?



136 名前:デフォルトの名無しさん :04/04/23 10:42
>>135
133がいってるデフォルトコンストラクトは、mapのこと。
double自体には無いです。

137 名前:132 :04/04/23 10:55
>>136
> 133がいってるデフォルトコンストラクトは、mapのこと。
そうすると,133の内容が
最初の私の質問への返答として,分からなくなるのですが.

m0 [0];
した時点で要素であるdoubleがデフォルトコンストラクトされ,
それの値としては0が保証される.
って説明じゃないんですか???


138 名前:デフォルトの名無しさん :04/04/23 11:00
>>137
0は保障されないよ。コンパイラ依存。

139 名前:デフォルトの名無しさん :04/04/23 11:02
↑ごめん、ちょっとまって、試す
忘れて。

140 名前:デフォルトの名無しさん :04/04/23 11:06
m0 [0];
なんで、ここでコンストラクトされるとおもってるの?

141 名前:デフォルトの名無しさん :04/04/23 11:19
>>140
23.3.1.2 map element access
T& operator[](const key_type& x);
1. Returns (*((insert(make_pair(x, T()))).first)).second.

ということで、まあ T() でコンストラクトされたsecondを持つpairがinsertされ
そのsecond( = T()の結果 )が返ることは規格で定義されてるね。

で、ここでTはdoubleだが、組み込み型に対する明示的な引数なしコンストラクトは
0が返る。
連想コンテナのinsert()は値が存在しているときは追加されず既存の値を返すが
ここでは空コンテナからなので追加されたものが返る。
といことで0は保証。

142 名前:132 :04/04/23 11:21
>>140
> m0 [0];
> なんで、ここでコンストラクトされるとおもってるの?
誤解されてるかもしれないので丁寧に書きますと,
m0のコンストラクションは,
map <short, double> m0;
で起こり,その時点でm0.size ()は0です.
その後の,
m0 [0];
で,operator []が呼ばれて,
その関数の中で,m0にはkeyが0の要素はまだ無いので,
m0.insert (make (0, double ()));が自動的に呼ばれると
思ったんですが....
ここで,要素doubleのディフォルトコンストラクタが呼ばれると.

それとも,
mapのディフォルトallocatorが使用領域をzero fillしていて,
doubleのディフォルトコンストラクタがないので,
zeroが保証されるとかですか?


143 名前:デフォルトの名無しさん :04/04/23 11:21
m0[0]としたとこで、allocatorが動き出す。
ディフォルトのallocatorは0で埋めるから、
mapで生成される要素に関して0が保障される。
>>133

double *pd= new doubleは、0を保障しない。
double d; も0になるとは限らない。
スッタクだろうが、ヒープだろうが、同じ。

144 名前:132 :04/04/23 11:24
>>141
> で、ここでTはdoubleだが、組み込み型に対する明示的な引数なしコンストラクトは
> 0が返る。
おおっ! なるほど.
ありがとうございました.


145 名前:132 :04/04/23 11:26
>>143
> m0[0]としたとこで、allocatorが動き出す。
> ディフォルトのallocatorは0で埋めるから、
> mapで生成される要素に関して0が保障される。

おおっ! なるほど.
ありがとうございました.


146 名前:143 :04/04/23 11:26
>>141
m(_ _)m

147 名前:143 :04/04/23 11:38
スッタクってなんだぁ!
たのむ!流行らないでくれ!

148 名前:132 :04/04/23 11:40
141氏,143氏
>>141
> で、ここでTはdoubleだが、組み込み型に対する明示的な引数なしコンストラクトは
> 0が返る。

>>143
> double *pd= new doubleは、0を保障しない。
> double d; も0になるとは限らない。
> スッタクだろうが、ヒープだろうが、同じ。
が矛盾していますが.どちらが正解なんでしょう?
私の環境(Linux 2.4.25,g++ 3.3.3)では,
double *pd= new doubleは,常に0です.
double d;は0になるとは限らないです.
template <typename T> T default_constuctor (T) {return T ();}
default_constuctor (double ())は,常に0です.


149 名前:143 :04/04/23 11:43
double *pd= new double();
double d();
こういうことなら、非環境依存で0になるんじゃないかな。

150 名前:デフォルトの名無しさん :04/04/23 11:47
>>149
後者は関数宣言な罠

151 名前:143 :04/04/23 11:48
・・・。 ('A`)スッタク

152 名前:143 :04/04/23 11:53
VC7.1で、
double *pd= new double();
*pd == 0 です。

double *pd= new double;
*pd != 0 です。

153 名前:デフォルトの名無しさん :04/04/23 11:56
>>149
5.3.4(New)の15によると、Tが組み込み型(POD)の場合
new T() だと初期化され、 new T だと不定値になるね。
()の有無が重要なんだなあ。

154 名前:132 :04/04/23 12:08
>>153
> 5.3.4(New)の15によると、Tが組み込み型(POD)の場合
> new T() だと初期化され、 new T だと不定値になるね。
> ()の有無が重要なんだなあ。
なるほど,148の疑問が分かりました.
私の環境でdouble *pd= new doubleが,常に0なのはオマケということですね.

おつき合い頂いたみなさん,どうもありがとうございました.


155 名前:デフォルトの名無しさん :04/04/23 17:29
>>134

勝手に「メールアドレス付きの」ログをWebに晒されてるのが嫌。
spamがウザいので投稿で投稿したくない。

なので、2chにいるのだ。

156 名前:デフォルトの名無しさん :04/04/23 17:38
cppll_noviceが上級者に荒らされてるような気がするのは俺だけ?

157 名前:デフォルトの名無しさん :04/04/23 23:50
>>156
cppllもnoviceも万年初心者の漏れには投稿しづらいッス。

158 名前:デフォルトの名無しさん :04/04/24 01:14
スッタクドッコイ!

159 名前:デフォルトの名無しさん :04/04/24 03:40
ヒプー


160 名前:デフォルトの名無しさん :04/04/24 06:21
コンストラクタへの関数ポインタってどうやって宣言するの?

161 名前:デフォルトの名無しさん :04/04/24 09:34
コンストラクタは関数じゃな〜い

162 名前:デフォルトの名無しさん :04/04/24 09:57
ちょくちょく出てくる “cppll” って何かと思ったら、エビか…

163 名前:デフォルトの名無しさん :04/04/25 01:07
nslookupでk.vodafone.ne.jpのMXコードを調べたいんですが検索できません
何か検索する方法はないんですか?


164 名前:デフォルトの名無しさん :04/04/25 02:04
class Cexception{
const char* str_;
public:
Cexception(const char* str) : str_(str){}
const char* what() const {return str_;}
};

こんなかんじの例外クラスを見かけたんですが、コレ大丈夫なんでしょうか

165 名前:デフォルトの名無しさん :04/04/25 02:31
コンストラクタに渡すstr次第なんじゃね?

166 名前:デフォルトの名無しさん :04/04/25 02:45
>>165
そのとおりだが(w
エラーメッセージが全部グローバルで用意されているのかな?
使いにくそうな例外クラスではある。

167 名前:デフォルトの名無しさん :04/04/25 10:04
>>166
cから延々と引き継いでるプロジェクトとか、cから流れてきたプログラマとかだと
平気でやりそうな設計ですね。

168 名前:デフォルトの名無しさん :04/04/25 14:17
std::exception派。

169 名前:160 :04/04/25 14:45
コンストラクタへのテーブル作りたいのだけど困ったなぁ。。。

  Class{
  public:
    Class();
  };

のとき、

  Class& (*pfnClass)();

とかできそうなもんだが何故できない?


170 名前:デフォルトの名無しさん :04/04/25 14:52
>>169
で、そのコンストラクタが初期化すべきオブジェクトはメモリ上のどこにあるんだ?

素直にT*を返す関数作れ。なんならtemplateで。

171 名前:デフォルトの名無しさん :04/04/25 14:53
>>169
コンストラクタを直接呼び出すことは禁止
(領域の初期化がセットになる、つまりnew経由の必要がある)なので

Class hoge {
public:
static hoge * create() { return new hoge(); }
};
とでもすれば hoge::create()が静的なアドレスとれるが。

何がやりたいの?

172 名前:160 :04/04/25 17:26
>>171
そうだ、私がやりたかったのはソレダ
ありがとう

173 名前:デフォルトの名無しさん :04/04/26 00:01
すみません、自分はjavaを主にやってるのですが
ファイルを示すクラスを作るときなどに

ファイルが存在した場合はオブジェクトを返却する関数をつくり
ファイルが存在しない場合はnullを返却するようにしています。

c++の場合ってそういう場合は実装するといいでしょう?
ファイルが存在しない場合はnullポインタを返却するとして
存在する場合にnew したとするとスコープの問題があるようなきがします

c++のえろい人だったらどうやって実現しますか
こんな感じで作るというのをアドバイスいただけると助かります。

174 名前:デフォルトの名無しさん :04/04/26 00:08
>>173
スコープの問題とは?

175 名前:デフォルトの名無しさん :04/04/26 00:11
>>174
即レスサンクスです

Hogeというクラスがあって

Hogeというクラスの中にcreateHoge()という関数(メンバ関数ではない)を作るとして
そのなかでHoge*を返却する場合に new Hoge()とした場合に問題はないのでしょうか?


176 名前:デフォルトの名無しさん :04/04/26 00:11
例外投げる。

177 名前:デフォルトの名無しさん :04/04/26 00:16
>>175
NULLじゃなくてis_openみたいにすれば

178 名前:デフォルトの名無しさん :04/04/26 00:23
どうもサンクスです

>>176
そのケースもjavaでやったんですけど
例外キャッチするのがだるいじゃないですか

でもそのパターンも考えてみます

>>177
なるほど
コンストラクタ呼び出したあとに必ず
定められたメソッドを呼び出して判定すると

それが一番スマートですかね


179 名前:デフォルトの名無しさん :04/04/26 00:59
file存在しない場合はNULLObject作って>>177みたいにするとか
戻り値はauto_ptrにすれば安全かな

180 名前:デフォルトの名無しさん :04/04/26 08:58
>>175
auto_ptrを使うとか:
if (Hoge *ptemp = Hoge::createHoge()) {
std::auto_ptr<Hoge> phoge(ptemp);
// phogeを使って色々...
}
って手もあるけど、例外のほうがいいかも。

181 名前:デフォルトの名無しさん :04/04/26 13:21
例外で処理するのが一番だよ.
でもってファイル操作は。
必要になった時点で fopen 使えばいいじゃないか。
<< なんか使うより fprintf の方が簡単でずっと良いだろ?

182 名前:56 :04/04/26 22:54
>>55
いろいろやってみてわかりました。
結局 icc8.0/vc7.1/gcc 共
前方宣言に加えて、クラス内部でのfriend 関数の宣言をメンバ関数より先に行うことで、
スコープ解決子の助けなくコンパイルできることがわかりました。
因みに、(::func<X>)はgccが許可しません。
具体的に書くと次の通りです。

template< class X > class Matrix;
template<class X> Matrix<X> & Func( Matrix<X> &);

template<typename X> class Matrix{
friend Matrix<X> & (::Func<X>)( Matrix<X> &);
Matrix<X> & Func(void);
};

>>58にiccでコンパイルできたと書きましたが、Funcをコールしてないときに
コンパイルできてるだけで、Funcをコールするとリンクエラーになってました。
もちろんgcc はfriend 関数とメンバ関数の宣言順なんて関係なく通ります。
やっぱり、gccの方が歴史も古い分、出来がいいような気がしますが・・・?

183 名前:56 :04/04/26 22:57
間違い間違い。すみません。

template< class X > class Matrix;
template<class X> Matrix<X> & Func( Matrix<X> &);

template<typename X> class Matrix{
friend Matrix<X> & Func<X>( Matrix<X> &);
Matrix<X> & Func(void);
};


184 名前:デフォルトの名無しさん :04/04/26 23:04
ファイル内static変数は近い将来なくなるとストラウストラップが言っていたそうですが
変わりに使えと言われる無名namespaceはファイル内staticな変数と比べて
どんな利点がありますか?

185 名前:デフォルトの名無しさん :04/04/26 23:40
副作用など無く、ただ
「スコープを制限するためだけにある」
ってことくらいか

186 名前:デフォルトの名無しさん :04/04/27 01:09
ハァ?何がstatic?とか思いながらタイプしなくていい。
スコープ引っ越すときにつけたりはずしたりしなくていい。
内部リンケージとか外部リンケージとか気にしなくていい。

187 名前:175 :04/04/27 02:10
いろいろなパターンを教えていただき感謝です

結論からいうと
今自分で作ってるソフトの例外クラスを一つ作って
そいつにエラーコードを渡すようにしました。
でファイルが存在しない場合は例外を返すようにしますた。


>>179
NULLObjectっていうことは
必要なメンバの初期化をすっ飛ばして
isOpenとかで有効かどうかチェックするってことですねたぶん

>>180
auto_ptrってのは初めて聞きますが
stlのコンポーネントみたいですね
余裕が出てきたら調べて見ますサンクス

>>181
結局例外で処理することにしました
多謝です



188 名前:デフォルトの名無しさん :04/04/27 03:46
>>182
自分も色々試したのですが,結論としては,テンプレート引数に依存する型を返り値とする関数
(そしてこれはまず間違いなく関数テンプレートになると思いますが)
をfriendとして宣言するときには,型の付かないスコープ解決子(::)は使えない
(使わなくて良い)ということみたいです.
で,このときはクラス内での宣言順に気をつけたほうが良い(>>182)というわけですね.
なので54の前半分で書いたことはどうやら間違いくさいです.
誤った情報を提供してしまって申し訳ないです.
自分も色々試してみて勉強になりました.(が,細かい規格に正直うんざりした面もw)

189 名前:デフォルトの名無しさん :04/04/27 12:52
Matrix ライブラリのBlitz++ですが、もう随分前からファイルが
消えてるんですが、
http://www.oonumerics.org/blitz/download
プロジェクト自体あぽーんしたんでしょうか?

190 名前:デフォルトの名無しさん :04/04/27 13:24
>>189
sorceforgeのミラーから普通に落とせたが?

191 名前:デフォルトの名無しさん :04/04/27 13:29
>>189
本当だね。最終更新日も去年の7月だし。boostのuBLASにBlitz++
その他のライブラリを開発する時のノウハウを盛り込んだと書いて
あるから、もしかしたらBlitz++プロジェクトは事実上停止し、uBLAS
に開発者が移った可能性はある。

どっかにソースないかな。

192 名前:デフォルトの名無しさん :04/04/27 13:32
>>190
ttp://sourceforge.net/project/showfiles.php?group_id=63961
から落とせた?

193 名前:デフォルトの名無しさん :04/04/27 13:36
>>192
ttp://easynews.dl.sourceforge.net/sourceforge/blitz/Blitz++-0.7.tar.gz
少なくとも俺はこれを落とせた。

194 名前:デフォルトの名無しさん :04/04/27 13:39
>>193
本当だね。URLを全部指定しないとだめぽ・・・・
CGIからは全部削られているみたい。

195 名前:デフォルトの名無しさん :04/04/27 18:30
C++って何で、
extern "C" { }
が要るの?

これのせいで、どれだけ手間が増えてるか!

196 名前:デフォルトの名無しさん :04/04/27 18:32
>>195
オブジェクトファイルの命名規則がCと違うから。

197 名前:196 :04/04/27 18:34
性格には、
オブジェクトファイル内で使われるシンボルの命名規則が違うから。
誤解を招く表現だったな。

198 名前:デフォルトの名無しさん :04/04/27 18:42
>>195
そんなに手間増えるか?

199 名前:デフォルトの名無しさん :04/04/27 19:24
>>195
多分、ここにそんなレスを書き込む手間のほうがめんどいとおもう。

200 名前:56 :04/04/27 19:54
最終報告です。
上でgccの出来が云々と書いたのですが、コンパイラオプション
vc/icc /O2 /arch:SSE2 /G7
gcc -O2 -march=pentium4 -mfpmath=sse -msse2
としルーチンの入り口と出口で
time_t start, end;
start = time((time_t *)0);
...
end = time((time_t *)0);
std::cerr << difftime( end,start);
としたところ,
icc 1.0e+001
gcc 2.0e+001
vc 4.4e+001
となりました。icc8.0が断トツ。icc比gcc は半分。vc7.1は1/4の速度となりました。


201 名前:56 :04/04/27 20:14
上のgcc はWinXPのCygwinです。version 3.3.1 -mno-cygwin としてます。
因みに同マシン上でFreeBSD 5.2 gcc 3.3.3では 1.5e+001となりました。
FreeBSDが何でXPより遅いのか判ってませんが??

202 名前:56 :04/04/27 20:17
あ!XP では20 FreeBSD 15だから速いんだ。オカルトが起こらなくてよかった。
間違いばかりでスンマセン。


203 名前:デフォルトの名無しさん :04/04/28 02:56
>>202
レポートおつ〜。

>!XP では20 FreeBSD 15だから速いんだ
20、15ってなんでしょうか?

スッタク、ヒプー ワロタよw

204 名前:デフォルトの名無しさん :04/04/28 04:33
>>183
> template<typename X> class Matrix{
> friend Matrix<X> & Func<X>( Matrix<X> &);
> Matrix<X> & Func(void);
> };

どうでもいい話かもしれませんが、↓のほうがよくないですか?

template<typename X> class Matrix{
friend Matrix& Func<>( Matrix&);
Matrix& Func(void);
};

205 名前:デフォルトの名無しさん :04/04/28 05:45
difftime の結果が
Cygwin -mno-cygwinだと20sec
FreeBSD のgcc だと 15sec

206 名前:デフォルトの名無しさん :04/04/28 05:54
も一度書き直します。
XP
icc8.0 10sec
gcc3.3.1 -mno-cygwin 20sec (因みに-mno-cygwin指定なければ 80sec)
vc7.1 44sec

FreeBSD 5.2
gcc 3.3.3 15sec
テストソースはMatrix計算を多用(カルマンフィルタ)したものです。

207 名前:デフォルトの名無しさん :04/04/28 06:32
コマンドラインからファイルかディレクトリ名を入力してもらって、
ファイルの場合は末尾にabcと書き込んで、ディレクトリの場合にはそのディレクトリに
abc.txtというファイルを作成し、そこにabcと書き込むようなプログラムを作りたいのですが
コマンドラインから入力されたものが、ファイルかディレクトリかを識別する方法ってありますか?

208 名前:デフォルトの名無しさん :04/04/28 07:20
>>207 bool boost::filesystem::is_directory( const boost::filesystem:path & ph );

209 名前:デフォルトの名無しさん :04/04/28 07:45
>>208
boostを使うわけね。
実はboostって触ったことすらなくてちんぷんかんぷんなんだけど、
調べてみたら面白そう。少しやってみるよ。
ありがとうございました。

210 名前:デフォルトの名無しさん :04/04/28 12:52
>>204
本当にどうでもいい話なら
boost::numeric::ublas::matrixを使えば終わるという説も

211 名前:デフォルトの名無しさん :04/04/28 18:16
テンプレート引数を持つ関数のfriend宣言は何もmatrixライブラリに限った話ではない。

212 名前:C++ :04/04/28 22:24
http://page4.auctions.yahoo.co.jp/jp/auction/d47227135

213 名前:デフォルトの名無しさん :04/04/28 23:19
>>204
下の方が良いというか,どっちでも良いはずです.

>>210
どうでも良くなくても,普通はそうするべきですね.

214 名前:デフォルトの名無しさん :04/04/28 23:20
すいません。自然定数eを計算によって求め、結果を表示するプログラムの作り方を教えてください。

215 名前:デフォルトの名無しさん :04/04/28 23:47
>>214
まず数値計算を勉強汁!
っつーか自然定数って何だよ。自然対数の底だろうが...ったく。
そもそもさぁ、おまえにはググって答えを見つけるぐらいの知恵はないのかよ。

216 名前:デフォルトの名無しさん :04/04/28 23:57
そう問題に書かれているからわからんのですよ

217 名前:デフォルトの名無しさん :04/04/28 23:59
「自然定数」ってなんだかわかんなかったから、かわりに
「自然対数の底」を求めるプログラムを作りました。

って書いて提出すれば問題なし(たぶん)

218 名前:デフォルトの名無しさん :04/04/29 00:05
とりあえずそうしてみます。アドバイスありがとう


219 名前:デフォルトの名無しさん :04/04/29 00:30
自然対数の底 e = 自然定数

220 名前:デフォルトの名無しさん :04/04/29 00:33
"+自然定数" の検索結果 約 108 件
"+自然対数" の検索結果 約 6,330 件

221 名前:デフォルトの名無しさん :04/04/29 01:09
>>213
>どうでも良くなくても,普通はそうするべきですね.
それは違うな!そんなことはboostがISOの仕様に含まれてからいうべき。
標準仕様に含まれてないものを使うべきなどとは誰もいえない。


222 名前:デフォルトの名無しさん :04/04/29 01:17
どうでもいいけどBoostダウンロードできるか?
http://www.boost.org

223 名前:213 :04/04/29 01:26
>>221
あ,違います違います.
213は,既存のライブラリがあるなら,自分で車輪の再発明をするよりは
それを使うべきではないか?という意図の書き込みです.
boost::numeric::ublasを使うことを強制するつもりはまったく無いです.
特にmatrixは他の有力な候補もありますし.

224 名前:デフォルトの名無しさん :04/04/29 01:28
sfのミラーから落とせないならsf.net自体の不調だろ。なんかあそこトラブル多いし。

225 名前:デフォルトの名無しさん :04/04/29 01:31
for( double x = 0; x < 1.e6; x += 1.0 ){
double tmp = 1.0 + 1.0/x;
double ex = pow( tmp, x);
fprintf(stderr, "%e %e\n", x, ex);
}
質問してきた奴をぐちゃぐちゃ罵倒してる暇あるならわずか5行で回答
できるだろが!

226 名前:デフォルトの名無しさん :04/04/29 01:54
>>225
#include <math.h>
#include <stdio.h>
int main(void) { printf("%f\n", pow(2, (1 / log(2)))); return 0; }
わずか3行でできるだろうが!

227 名前:デフォルトの名無しさん :04/04/29 02:01
よく車輪の再発明が愚の骨頂のように言う人いるけど、温故知新ってことわざもあります。
boost使って楽だけど、楽して一ユーザとして過ごしてるだけじゃ、難しくて膨大な
言語仕様のC++はなかなか身につかないんじゃないすか?C++習得の教育効果という意味で
matrixのクラスライブラリの作成は有意義だと思いますが・・・

228 名前:デフォルトの名無しさん :04/04/29 02:04
まあ確かに、演習としてはStringとかArrayとか作るわな。

229 名前:デフォルトの名無しさん :04/04/29 02:04
>>226
>>すいません。自然定数eを計算によって求め、結果を表示するプログラムの作り方を教えてください。
出題者は収束する様子を確認させたいんだよ.

230 名前:デフォルトの名無しさん :04/04/29 02:14
それと、自分のプログラムの中でその依存度があまりに高い場合、自前で作るのは決して悪くないと思う。
汎用目的のものをカスタマイズすると思いもかけず速度が改善したりってこともあるし。何より内容をちゃんと
理解しとくとサポートを中止されたときでも安心ってのもあるよ。


231 名前:デフォルトの名無しさん :04/04/29 02:53
車輪を作るのは面白いし勉強になる。
しかし自分が本当にやるべきこととはズレていることが多いので注意。

232 名前:デフォルトの名無しさん :04/04/29 02:58
再発明上等ヽ(`Д´)ノVC5じゃboostまともに使えねーんだもん

233 名前:デフォルトの名無しさん :04/04/29 03:10
>>227
教育的効果については激しく同意します.

>>230
使いたい機能が本当に限定される場合だけですね.普通に使えるものを作ろうとすると結構大変ですし.
string, vector, matrixとかって見た目ほど中身は簡単ではないですし.
それに最近のC++のライブラリは,汎用性を維持しつつ,ユーザが要求に合わせてカスタマイズし
最大限に効率を発揮させることのできる,いわゆるpolicy_basedなものが多くなってきていますから,
「ライブラリ=汎用で遅い」という図式は必ずしも成り立たなくなってきているように感じます.
(その代償として使い方が異常に煩雑になるという欠点を負うんですが)

>>231
耳が痛いですw

234 名前:デフォルトの名無しさん :04/04/29 03:34
この仕事長くやってると、車輪作るのウザったくない?
まあ、若いうちだけだなって感じ。

235 名前:デフォルトの名無しさん :04/04/29 03:35
あれだよ。そんな雑魚仕事は新人研修の課題にでもすればいい。
今がちょうどいい時期。

236 名前:デフォルトの名無しさん :04/04/29 05:09
所詮、人様の作ったライブラリの wrapper 作ってるだけのソフト屋が雑魚仕事とは片腹痛し。


237 名前:デフォルトの名無しさん :04/04/29 05:23
初心者が「これがあれば(゚∀゚)イイ!!」
と思うようなものはすでに存在している。
複数人参加型のプロジェクトで使わない事を前提にするなら、
自作ライブラリを作るなりなんなり勝手にすればいい。
ただし自作を自慢すんな、このスレで。はずかしいぞ。

238 名前:デフォルトの名無しさん :04/04/29 05:39
>人様の作ったライブラリの wrapper 作ってるだけ
あいたた! まさに>>237 の仕事そのもの

239 名前:デフォルトの名無しさん :04/04/29 06:25
と、以前に自作自慢で恥をかかされた経験のある>>238が申しております。

240 名前:デフォルトの名無しさん :04/04/29 06:26
と、以前に自作自演で恥をかかされた経験のある>>238が申しております。

241 名前:デフォルトの名無しさん :04/04/29 06:29
と、顔を真っ赤にして煽りをいれる>>239-240が申しております。

242 名前:デフォルトの名無しさん :04/04/29 06:35
と、顔を真っ赤にして煽った経験があるから
他人も同じ事するに違いないと思い込んでいる>>241が申しております。

243 名前:デフォルトの名無しさん :04/04/29 07:12
再発明という表現にも語弊がある気がするね。
結局、誰かがもう通った道をなぞってるだけじゃん。そりゃ楽だし面白いわ。

自分だけの新大陸を見つけよう。

244 名前:210 :04/04/29 07:16
>>227
matrix作るのも悪くは無いが>>228くらいにとどめておくか
貧弱な2(or多)次元配列クラスが作れた、程度でいいと思う。
matrixで学習すべきはExpression Templateじゃないかと。
てことで誰か俺にExpression Templateを学習できる出来れば日本語のサイトを教えてくれ_| ̄|○

245 名前:デフォルトの名無しさん :04/04/29 07:32
>>243
実は、コロンブスやマゼランは中国(明王朝)の探検団の作った地図を頼りに
新大陸に到達したという説が浮上している。
TBSの「世界ふしぎ発見」でやってたよ。マジレス。

246 名前:デフォルトの名無しさん :04/04/29 07:46
ほとんどの製品開発っていうのは再発明なんだよな。再発明じゃないのは製品の規格制定段階の
ファーストランナーだけ。ところが再発明といっても全く同じプロセスじゃないから新たな発明が生まれる。

247 名前:デフォルトの名無しさん :04/04/29 08:31
>>245
それはもしかして鄭和のことか?

248 名前:デフォルトの名無しさん :04/04/29 12:08
日経サイエンスにコロンブス以前に新大陸について書かれた地図の真贋論争というネタが
載ってたな。というか、コロンブス以前にヴァイキングが行ってたのは間違いないらしいが。

249 名前:デフォルトの名無しさん :04/04/29 12:14
ここは車輪の再発明ネタだけで何倍もおかわりするインターネットですね。

250 名前:245 :04/04/29 12:26
>>247
そういえば、そんな名前が出てたかもしれない。

コロンブスの大陸到達時の文献に、
アメリカ原住民と明らかに肌の色が違う人々が他にいたと書かれている。
由来不明の古い灯台の遺跡が存在し、その設計寸法の最小単位が
中国で用いられていた単位と一致する。
などなど、色々番組で言ってたよ。


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