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

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

C++相談室 part33

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

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

2 :v(^・^)v:04/07/19 04:48
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

3 :v(^・^)v:04/07/19 04:49
改行制限により分割
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/

4 :v(^・^)v:04/07/19 04:51
■基本■
[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/ (日本語)

5 :v(^・^)v:04/07/19 04:52
■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 :v(^・^)v:04/07/19 04:53
■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

7 :デフォルトの名無しさん:04/07/19 05:09
>>1
こんな朝っぱらに乙!

8 :v(^・^)v:04/07/19 05:13
■関連スレ■
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
ようかんマンがC/C++の宿題を片付けて見せます 28棹
http://pc5.2ch.net/test/read.cgi/tech/1089974839/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/
COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/
WTLお勉強スレッド
http://pc5.2ch.net/test/read.cgi/tech/1078150663/

9 :v(^・^)v:04/07/19 05:14
■コンパイラスレ■
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/(html化待ち)
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/

10 :v(^・^)v:04/07/19 05:15
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part13
http://pc5.2ch.net/test/read.cgi/tech/1089011118/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/

11 :v(^・^)v:04/07/19 05:18
連続投稿規制に引っかかってむしゃくしゃしていた.
スレが立てられるなら何でも良かった.
今はあらかじめ串を用意しておくべきだったと反省している.

12 :デフォルトの名無しさん:04/07/19 05:22
>>1 は無罪。

13 :7:04/07/19 05:27
>>1
割り込んですまんかった...orz

14 :デフォルトの名無しさん:04/07/19 11:08
前スレの>>928
>>927ですが、ネットで調べても解決できなかったので他に当たってみます。

15 :デフォルトの名無しさん:04/07/19 13:52
v(^・^)v が復活したな。酸素〜

16 :デフォルトの名無しさん:04/07/19 21:55
STLつかうと一気に実行ファイルサイズが10倍に?!

17 :デフォルトの名無しさん:04/07/19 22:02
つまんね
実測すりゃ済むことで
人に聞く必要性は完璧にゼロ

18 :デフォルトの名無しさん:04/07/19 22:11
>>17
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

19 :デフォルトの名無しさん:04/07/19 22:19
( ・_・)?

20 :デフォルトの名無しさん:04/07/19 22:18
>>17
もー。
打ち合わせ通りにやってよね。
正しくは

> >>16
> 環境によるだろ。
> 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
> ランタイムを使用するようにして使っているが、例えばstd::vectorを
> 使っても使わない時と比べ10Kほどしか増えない。

21 :デフォルトの名無しさん:04/07/20 00:21
(;´Д`)

22 :デフォルトの名無しさん:04/07/20 00:29
>>20
わざわざタイムマシンで乙

23 :デフォルトの名無しさん:04/07/20 00:31
STL信者が我慢できなくなったようだなw

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

25 :デフォルトの名無しさん:04/07/20 01:05
もういいってw
何回やれば気が済むんだ?

26 :デフォルトの名無しさん:04/07/20 01:28
むしろこれもテンプレの一部だろ

27 :デフォルトの名無しさん:04/07/20 05:04
実は今日は火曜日だったりするわけ。

28 :デフォルトの名無しさん:04/07/20 05:27
C1010(ry

29 :デフォルトの名無しさん:04/07/20 06:54
>>28
#include "stdafx.h"

あと死ね。

30 :デフォルトの名無しさん:04/07/20 09:13
テンプレ扱いならテンプレ扱いで、気合入れてやってくれよ。
死ぬほど面倒くさそうにやられると、見てるこっちも疲れてくる(^_^;

31 :デフォルトの名無しさん:04/07/20 10:31
次スレから気合入れてやるってことで

32 :デフォルトの名無しさん:04/07/20 20:11
class CMyClass
{
public:
static const int nState = 0;
};
これだとコンパイルが通るんですが
intをdoubleに変えるとエラーになるのは何故ですか?


33 :デフォルトの名無しさん:04/07/20 20:21
>>32
どこかでCMyClass::nStateをintだとおもってつかってるからでしょう。

34 :デフォルトの名無しさん:04/07/20 20:21
C++の仕様

ちと古いコンパイラはその書き方もダメだった

35 :デフォルトの名無しさん:04/07/20 20:44
昔は整数型定数しか初期化できなかった

36 :デフォルトの名無しさん:04/07/20 21:12
え?今は浮動小数点数もいけるのか?

37 :デフォルトの名無しさん:04/07/20 23:10
いけません。

38 :デフォルトの名無しさん:04/07/20 23:43
主人が帰ってきますわ。

39 :デフォルトの名無しさん:04/07/20 23:59
ああ、そんなこと、やめてください。

40 :デフォルトの名無しさん:04/07/21 00:20
パソリンカット


41 :デフォルトの名無しさん:04/07/21 00:25
L."DANCHI",R

42 :デフォルトの名無しさん:04/07/21 09:25
ttp://www.open-std.org/jtc1/sc22/wg21/
News 2004-07-21: The C++ Standard Library Issues List (Revision 31) is available

43 :デフォルトの名無しさん:04/07/22 01:10
>>42
auto_ptr_ref はついに消えてくれそうだな。前から怪しいと思ってはいたんだ。

44 :デフォルトの名無しさん:04/07/22 01:54
怪しさ大爆発!
というよりは、むしろ不気味な存在。

45 :デフォルトの名無しさん:04/07/22 12:43
VC.netについて相談させてください。

実行exeにアイコンを登録したいのですがわかりません。
ご教授お願いします。

46 :デフォルトの名無しさん:04/07/22 12:54
>>45
スレ違い。
ttp://pc5.2ch.net/test/read.cgi/tech/1083995297/
テンプレの「開発環境」にVC++.Netが無いようだが、誘導はこれでいいのかな?

47 :デフォルトの名無しさん:04/07/22 13:12
すれ違いって>>1の
C++に関する質問には入らないの?

48 :デフォルトの名無しさん:04/07/22 13:14
>>47
各開発環境ごとに専用の別スレがあるから、そっちのほうが適切。
>>1に明示的に書いてないようだが、ここはおそらく(標準ライブラリを含む)言語スレ。

49 :デフォルトの名無しさん:04/07/22 16:53
#include <iostream>
#include <string>
using namespace std;

int i,k;
int main()
{
string str[4][2];

str[0][0] = "就職 ";
str[0][1] = "活動 ";
str[1][0] = "会社 ";
str[1][1] = "訪問 ";
str[2][0] = "集団 ";
str[2][1] = "面接 ";
str[3][0] = "学校 ";
str[3][1] = "推薦 ";

for(i=0;i<4;i++){
for(k=0;k<2;k++){

cout << str[i][k] << endl;

}
k=0;
cout << "\n";
}

return 0;
}

これってどうよ?

50 :デフォルトの名無しさん:04/07/22 16:57
>>49
不採用


51 :デフォルトの名無しさん:04/07/23 03:48
不問

52 :デフォルトの名無しさん:04/07/23 18:27
int main(int argc, char* argv[])
{
try
{
throw int();
}
catch(int)
{
}

return 0;
}

これだけのプログラムなのですが
例外処理 (初回) は hoge.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception。
とデバッガのアウトプットに出るのです。
前は出てなかったような気がするんですが
throwを使うと必ず出るものなんですか?

53 :52:04/07/23 18:28
書き忘れました。
VC++6.0 SP5 Win2kです。

54 :デフォルトの名無しさん:04/07/23 19:49
機種依存の話は受け付けてません

55 :デフォルトの名無しさん:04/07/23 19:53
>>52
警告無視してるだろ

56 :デフォルトの名無しさん:04/07/23 21:00
warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクス
は有効にはなりません。-GX を指定してください。


57 :デフォルトの名無しさん:04/07/23 23:52
VC++7.1のコード補完は軽いけどテンプレートとかでうまく動かない。
C++Builder6のコード補完は重いけどテンプレートでも使える。
まともなコード補完してくれて軽いIDEはいつでるんだろうか…

58 :デフォルトの名無しさん:04/07/23 23:53
マシン買い換えろ

59 :52:04/07/24 00:59
>>55
警告は何も出ずビルドできてます。(リビルドしても変わらず)
/GX オプションも付いていることを確認しています。


60 :52:04/07/24 01:02
試しにGXを外してみたら>>56の警告が出ました。

スレ違いとのことなので移動します。
ありがとうございました。

61 :デフォルトの名無しさん:04/07/24 01:23
VCのIntellisenceは、なんか初回発動時にハードディスクからガガガガガって音が聞こえてきてちょっと怖い。

62 :デフォルトの名無しさん:04/07/24 01:44
multisetから重複している要素のみを抽出したいのですが、
どうすればよいでしょうか?

63 :62:04/07/24 01:51
自己解決しました。
adjacent_findでできました

64 :デフォルトの名無しさん:04/07/24 02:01
おまんこぺろぺろ

65 :デフォルトの名無しさん:04/07/24 02:02
>>63
template<typename T>
void unique(std::multiset<T>& x);
実装貼り付けきぼんぬ。

66 :デフォルトの名無しさん:04/07/24 02:04
>>63
adjacent_find は等値判定に基づくアルゴリズムなので、
multisetに対する操作としてはまずいかも。

67 :65:04/07/24 02:16
重複要素の削除かと勘違いした。ごめん。
もう一度>>62を読み直したら、どんな動作がさせたかったのかわからなくなった。

ということで、やっぱり実装貼り付けきぼんぬ。

68 :デフォルトの名無しさん:04/07/24 02:24
>>66
EffectiveSTL読み直してみます。

>>67
こんな感じでresultが欲しかったのです。

HogeMultiSet result;
for(HogeMultiSet::iterator it = hogeMultiSet_.begin();;)
{
  it = std::adjacent_find(it, hogetMultiSet.end(),
  HogeEquals());
  if(it != hogetMultiSet.end())
  {
    int count = hogetMultiSet.count(*it);
    for(int i=0; i<count; ++i)
      result.insert(*it++);
  }
  else
    break;
}

69 :デフォルトの名無しさん:04/07/24 06:13
>>68
欲を言うと,重複要素のカウントはメンバ関数のcountじゃなくて,
自前でイテレータを動かして重複要素を数え上げたほうが速いかも知れないということが1点と,
resultがhogeMultiSetと同じ順序を使っているなら
result(*it++);よりもresult.insert(result.end(), *it++);の方が推奨されるってことが1点.
非常に細かい話で申し訳ない.
後は66さんの言うように等値と等価の違いに注意するぐらいですかね.

70 :デフォルトの名無しさん:04/07/24 09:09
More Exceptional C++の和訳は出る予定あるのかな?
もしかしてExceptional C++があんまり売れなかったとか?

71 :デフォルトの名無しさん:04/07/24 10:32
STLportのhashコンテナで比較関数にgreater<>を使ったんですが
降順に正しくソートされません。
MSのSTLだと比較関数のデフォルトにless<>がセットされているのですが
STLportだと、_EqualKeyとしてequal_to<>になっているのも気になります。
もしかしてhashコンテナにソートを求めるのが間違っているのでしょうか?

72 :デフォルトの名無しさん:04/07/24 11:21
間違ってる

73 :デフォルトの名無しさん:04/07/24 13:28
クラスって自分自身で自分自身をdeleteすることはできないのですか?

あるメンバ関数の処理を終えたら、自分自身でデストラクターを呼んで
開放したいのですが…やってもいいのですか?

74 :デフォルトの名無しさん:04/07/24 13:30
一応できるよ。
でもdeleteした後に自分自身にアクセスしちゃ駄目だよ。

75 :デフォルトの名無しさん:04/07/24 13:45
delete this; // suicide

76 :デフォルトの名無しさん:04/07/24 18:05
メールチェッカーを作ってるんですけど
参考になるページ教えて下さいませんか?
全然見通しがたたなくって

77 :デフォルトの名無しさん:04/07/24 18:22
>>76
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=%E3%83%A1%E3%83%BC%E3%83%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AB%E3%83%BC

78 :デフォルトの名無しさん:04/07/24 18:30
>>73
そのクラスのオブジェクトをスタック上に作ることはないのか?

79 :デフォルトの名無しさん:04/07/24 19:11
>78
当然privateデストラクタでガードだな。

80 :デフォルトの名無しさん:04/07/24 19:26
そこですかさず
#define private public
ですよ

81 :デフォルトの名無しさん:04/07/24 19:28
そこで間髪いれず
#undef private
ですよ

82 :デフォルトの名無しさん:04/07/24 19:36
#if 0
>>80-81
#endif

83 :デフォルトの名無しさん:04/07/24 23:04
つーか、自殺オブジェクト作った場合も結局はdelete前に、自分を参照しているオブジェクトに通知する必要があるわけだが。


84 :デフォルトの名無しさん:04/07/24 23:11
一つのクラスを *.h と *.cpp の 2 ファイルに分けて、
実装は原則として *.cpp ファイルに書いてるんですが、

 inline const String getName(void) const { return _name; };

みたいな inline 関数とか短いのとかは *.h ファイルに書くこともあります。

でも、なんかこういうのって気持ち悪いと感じるんですよ、性格的に。
関数によってファイルが違ったら統一性に欠けるじゃないですか。
プログラミングってのは美しくないとね。

だから月曜日からは実装は全部 *.cpp ファイルに書け!という
決まりを制定しようとたったいま酒をあおりながら思ったんですが、
別に問題ないですよね?

なにかご意見頂ければ幸いです。

85 :デフォルトの名無しさん:04/07/24 23:18
>>84
個人で開発するぶんには無問題

ただ、気持ち悪いとかいう主観でそんなことする人間が職場にいたら多分殴ると思う

86 :デフォルトの名無しさん:04/07/24 23:19
>>84
インラインの実体は *.inl に書いといて *.h から #include するとか・・・

87 :デフォルトの名無しさん:04/07/24 23:19
全部.hにかけばいいとおもうが。

88 :デフォルトの名無しさん:04/07/24 23:20
>>85
ソースの体裁って主観以外の何だ?
肝心なのは空気読むことだろ

89 :デフォルトの名無しさん:04/07/24 23:24
テンプレートってヘッダーファイルにしか書けない環境もあるんじゃなかったっけ?

90 :デフォルトの名無しさん:04/07/24 23:27
>>88 勝手に体裁の話にすんなよ。

91 :84:04/07/24 23:37
>>85
殴られやしないから無問題☆

>>86
なぜにわざわざ?

>>87
そんなのかっこわるいし!

>>89
テンプレートの場合は *Inter.h と *Impl.h に分けてます。


んじゃあまあ、結論としては全然おっけーってことで。
ご回答ありがとうございました!

92 :デフォルトの名無しさん:04/07/25 00:07
>>91
86だが、理由は84が述べているから説明していない
まあ酔っ払いの相手なんてこんなもんかw

93 :84:04/07/25 00:23
>>92
あーもう、そういうことを聞きたかったのに!

いまネットで調べてみたら
inline 関数はヘッダファイルに書くんじゃん!
*.cpp に書いたら問題大ありじゃん!

もっと早く教えてよ!

だいたい「決まりを制定」とか大きな口叩いたけど、
現行ソースいじってるのは漏れ一人だし、まだ製品レベルでもなくて
C++入門したての新人だから、そんなこと知らなくても当然なの!

もう寝ます。おやすみなさい。

#前スレ 518-609 だけど今度は追放しないでね(はぁと

94 :デフォルトの名無しさん:04/07/25 00:32
素でキモイ…

95 :デフォルトの名無しさん:04/07/25 00:32
>>93
今後は初心者スレに逝け

96 :84:04/07/25 00:38
ごめんなさい。なんかすごく反省しています。
恥ずかしいのでもう一杯お酒飲んでから寝ます。

>>94
リアルだともっとキモイよ!

>>95
初心者スレって↓ですか?今度からはそうします。

【初心者歓迎】C/C++室 Ver.7【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1086373839/

お騒がせしました。さようなら。

97 :デフォルトの名無しさん:04/07/25 09:24
まあMSは*.inlだよね、俺もそうしてるよ。

98 :デフォルトの名無しさん:04/07/25 11:10
>>94
同意
ついでに酒飲んでりゃ何でも許されると思ってる人種はくたばれ

99 :デフォルトの名無しさん:04/07/25 11:48
>>98
「何でも」とはずいぶん拡大解釈したものだな
誰かそんなに許されないことでもしでかしたのか?

真面目くさった勤務を終えた後でくだけた話をするなというなら2ch自体いらないと思うが
無職な人にはここが聖域だったりするわけかw

100 :デフォルトの名無しさん:04/07/25 11:51
読解力のない香具師がいるな

101 :デフォルトの名無しさん:04/07/25 12:18
>>99
そういう目的ならこちらでどうぞ^^
ttp://life5.2ch.net/yume/
ttp://life6.2ch.net/mental/

102 :デフォルトの名無しさん:04/07/25 13:51
C++でJavaのinstanceofに相当するものはありませんか?
よろしくお願いします。

103 :デフォルトの名無しさん:04/07/25 13:52
>>102
dynamic_cast

104 :デフォルトの名無しさん:04/07/25 14:02
dynamic_cast を本当に使わなきゃならん時なんてあんまりないと思うが

105 :102:04/07/25 14:06
どうもありがとう

106 :デフォルトの名無しさん:04/07/25 14:24
>>104
たまにある。

107 :デフォルトの名無しさん:04/07/25 14:31
>>106
どんなとき?

108 :デフォルトの名無しさん:04/07/25 14:32
Javaでinstanceofを使いたくなるような時

109 :デフォルトの名無しさん:04/07/25 14:34
>>108
どんなとき?

110 :デフォルトの名無しさん:04/07/25 14:47
悲しいとき〜

111 :デフォルトの名無しさん:04/07/25 14:52
http://www-6.ibm.com/jp/developerworks/java/010907/j_j-diag4.html

112 :デフォルトの名無しさん:04/07/25 15:04
>>109
C++ 版の union がほしいとき (boost::any とか)

スクリプト言語とデータをやりとりするとき。スクリプト側に C++ 並の型システムを
実装するのは骨なので、スクリプト側には総称的なハンドル型を渡しておいて、
そこから C++ コードが呼ばれたときに dynamic_cast で検証して使う。


113 :デフォルトの名無しさん:04/07/25 15:36
>>111
そこの結論はinstanceof使わない方法だろ。

114 :デフォルトの名無しさん:04/07/25 15:50
多重継承しているときなんかで汚いコードだとは思うがおまえはだれって聞きたくなるときがある。

115 :デフォルトの名無しさん:04/07/25 16:17
abstract factoryで一群の公開インターフェイスで返したオブジェクト群が
互いに内部用インターフェイスで通信したいときに
dynamic_castで引っ張りだしたりすることはあるな。

116 :デフォルトの名無しさん:04/07/25 17:04
つーか、virtual 使いまくって dynamic_cast だけ毛嫌いする論理的な議論ってどんなんだ?

117 :デフォルトの名無しさん:04/07/25 17:22
>>116
dynamic_castのコストは継承ツリーの大きさが大きいほど大きくなる。
virtual関数コールは定数オーダー。
同列に扱うほうがおかしい。

118 :デフォルトの名無しさん:04/07/25 17:35
ディレクトリツリーをコンポジットパターンで操作するとき、必要にならないか?

119 :デフォルトの名無しさん:04/07/25 17:41
>>118
ディレクトリかどうかの判定はC++言語じゃなくてOSなりに任せるべきだろ。

120 :デフォルトの名無しさん:04/07/25 17:44
かみ合って無いやり取りが続いてるな

121 :デフォルトの名無しさん:04/07/25 17:54
>>118
葉も幹もすべて同じ仮想関数を持てばdynamic_castは必要にならない。

が、そうすることが最適解とも思えない。

122 :デフォルトの名無しさん:04/07/25 18:53
>>121
処理はVisitorにまかせる

123 :デフォルトの名無しさん:04/07/25 19:02
BorlandC++compilerを使ってコンパイルしたんですが
exeファイルが見つかりません。
作成された↑はどこに保存されるんでしょうか?
初歩的なことですみません;

124 :デフォルトの名無しさん:04/07/25 19:08
>116
RTTIの必要性

125 :デフォルトの名無しさん:04/07/25 19:35
double dispatchとか。

126 :デフォルトの名無しさん:04/07/25 20:41
>>123
情報が足りない。

コンパイラのexeなのか、
自分でコンパイルしたモノのexeなのか、
他のexeなのか。
何のexeだ?

127 :デフォルトの名無しさん:04/07/25 20:57
>>126
「コンパイルした」ということから、コンパイラのexeは候補から消えるだろう。
「作成された↑」ということから、自分でコンパイルしたモノのexeである可能性が高いと言えるだろう。

本当に必要な情報は
・何をしたのか(なるべくそのまま、正確に)
・自分の期待した結果とどうちがっていたのか(なるべく詳しく)
だろう。

>>123
スレ違い。こっち逝け→http://pc5.2ch.net/test/read.cgi/tech/1054390397/

128 :デフォルトの名無しさん:04/07/25 22:51
dynamic_castはきれいな設計をしたら防げるんじゃないかと思うのが7,8割じゃないかと思うんですが...
これは自分に言い聞かせ。

double dispatchにはつかわね。

129 :デフォルトの名無しさん:04/07/25 22:54
コンソールに文字を左寄せで出力したいのですが
その際に、10文字とか決めて出力したいです。

cout << name << data << endl;

とかなっている時に、nameのサイズ決めないと後ろがずれてしまうので…
setwだと右寄せになってしまって、できなかったです。
Cではprintfの%-dとかやってたんですが、C++ではどう書けばいいのでしょうか?
初歩的ですいませんが、ご教授お願いします。

130 :デフォルトの名無しさん:04/07/25 23:09
C++でもprintf()使えるよ。

131 :デフォルトの名無しさん:04/07/25 23:09
>>128
> dynamic_castはきれいな設計をしたら防げるんじゃないかと思うのが7,8割じゃないかと思うんですが...
dynamic_cast を使った方がきれいな設計になることもある。
むやみに dynamic_cast 使うのはやめた方が良いが、
むやにみ dynamic_cast 禁止するのもやめとけ。

132 :129:04/07/25 23:12
>>130
返答ありがとうございます。
この場合はprintfとかを使うしかないのかな…

133 :デフォルトの名無しさん:04/07/25 23:23
>>123は「コンパイルした」とは書いてるが「リンクした」とは書いてないところが気になるが。

まさかとは思うが、デスクトップに自分で作ったbcc32.exeのショートカットをダブルクリックしてるとか。 (藁
あと、そのショートカットにソースをドロップして「コンパイルした」とか...。

いや、冗談じゃなくて、本当にいたんだよ、こーゆーアフォが。


134 :デフォルトの名無しさん:04/07/25 23:35
>131
禁止はしないんだけれど、なんか引っかかるんですよね。
dynamic_cast使うと結局もしこれだったらって言うコードになるから。

135 :デフォルトの名無しさん:04/07/26 00:20
>>129
cout.setf(...)はどう?

136 :デフォルトの名無しさん:04/07/26 00:23
>>129
std::left を突っ込め。

137 :129:04/07/26 00:26
>>135-136
ありがとうございます、両方これから試してみます。

138 :デフォルトの名無しさん:04/07/26 00:26
boost::formatとか

139 :129:04/07/26 00:43
cout.setf(ios::left)とstd::left、どちらもちゃんとできました。
boostについては、使ったことがないので、いずれ勉強します。
ライブラリダウンロードしたりしなくてはいけないようなので。
皆さん、親切にありがとうございました。


140 :デフォルトの名無しさん:04/07/26 03:21
boost っていつになったら組み込まれるんだろう

141 :123:04/07/26 06:23
よくわからず環境変数を設定してadministrator>bcc32を実行したため
その下のディレクトリに保存されてました。お騒がせしてすみません、、
アドバイスありがとうございました〜

142 :デフォルトの名無しさん:04/07/26 06:38
子クラスを引数としたメンバ関数内から
子クラスを親クラスに代入するのって
class Hoge2::Hoge1;
Hoge2::HogeHoge(Hoge1 *hoge){
 this->… = hoge->…;
 …
}
って感じで力技でやるしかないんですか?
 this = hoge;
って感じでやりたいんですが。

143 :デフォルトの名無しさん:04/07/26 07:32
>>142
Hoge1::operator=(Hoge1 const&) が正しく定義されてるなら、
*(Hoge1*)this = hoge;
で良いんじゃない?


144 :デフォルトの名無しさん:04/07/26 07:33
>>142
Hoge2::HogeHoge(Hoge1 *hoge){
 Hoge1::operator =(*hoge);
}

145 :デフォルトの名無しさん:04/07/26 08:16
>>144
(*hoge);
この括弧は関数呼び出しの括弧になるの?

146 :デフォルトの名無しさん:04/07/26 08:24
>>145
Hoge1::operator=(Hoge1 const&) が正しく定義されてるなら

Hoge2::HogeHoge(Hoge1 *hoge){
  *(Hoge1*)this = *hoge;
}

じゃないかな?
っていうかHogeHoge自体不要


147 :デフォルトの名無しさん:04/07/26 08:24
そう

148 :デフォルトの名無しさん:04/07/26 11:12
>142-147
そんなoperator書いている後輩がいたら有無を言わさず消去する人

ノシ

149 :デフォルトの名無しさん:04/07/26 15:22
お前らなんか間違ってないか?
>子クラスを親クラスに代入する
んだから、
*this = *hoge;
で十分だろ。

150 :デフォルトの名無しさん:04/07/26 21:04
>>148
お前の存在が有無を言わさず消されるといいな

151 :デフォルトの名無しさん:04/07/26 21:35
delete 150

152 :デフォルトの名無しさん:04/07/26 23:38
>>151
エラー:セミコロンが見つかりません。

153 :デフォルトの名無しさん:04/07/26 23:58
#kill TERM >>150-151

154 :デフォルトの名無しさん:04/07/27 00:24
>>152
なかなかのコンパイラだね。

155 :デフォルトの名無しさん:04/07/27 00:39
>>149
(Hoge1)*this = *hoge;

156 :デフォルトの名無しさん:04/07/27 02:01
>>155 なんだそりゃ?

157 :デフォルトの名無しさん:04/07/27 09:23
*(Hoge1)this

158 :デフォルトの名無しさん:04/07/29 10:45
ああ

159 :デフォルトの名無しさん:04/07/29 11:51
なんですか?

160 :デフォルトの名無しさん:04/07/29 12:02
>>159
女は恐いし

161 :デフォルトの名無しさん:04/07/29 12:03
ネタない?

162 :デフォルトの名無しさん:04/07/29 12:04
>>161
C++の基礎を教えて。

163 :デフォルトの名無しさん:04/07/29 12:21
privateとprotectedの違いってなんだっけ

164 :デフォルトの名無しさん:04/07/29 12:27
class A
{
protected:
 int a;
private:
 int b;
}

class B : public A
{
 void Hoge()
 {
  a = 0; //OK
  b = 0; //エラー
 }
}

165 :デフォルトの名無しさん:04/07/29 12:35
なんかこのスレも門下金柑だな

166 :デフォルトの名無しさん:04/07/29 13:07
>>162
ごめん君には基礎は教えられない。君に理解できるとは思えないから。

167 :デフォルトの名無しさん:04/07/29 13:42
void Unko(Poko** p)
{
*p = new Poko();
}
void Unko(Poko* p)
{
p = new Poko();
}

int main()
{
Poko* p;

Unko(p);
Unko(&p);
}

どう使い分ければいいのですか?

168 :デフォルトの名無しさん:04/07/29 13:49
#include <iostream>
int main()
{
Poko* p = 0;

Unko(p);
std::cout << p << '\n';
Unko(&p);
std::cout << p << std::endl;
}

169 :デフォルトの名無しさん:04/07/29 13:50
>>167
マジレスすると後者のUnko()は一時変数のポインタにPokoのインスタンスへの
ポインタを代入しているだけだから、関数から抜けたらメモリリークを起こす。
(Pokoのインスタンスを解放するすべがなくなる)。

というか、C++ならポインタへのリファレンスを使おうよ。

170 :デフォルトの名無しさん:04/07/29 13:55
なるほど。納得しました。ありがとうございました。
危ないところでした・・・

171 :デフォルトの名無しさん:04/07/29 15:36
for_eachにsetのiterator渡すのはまずいのでしょうか?

コンパイラに怒られてしまったのですが。
[C++ 警告] W8091 template の _InputIter 引数('for_each' に渡される)は \
output 反復子:input 反復子が必要

172 :デフォルトの名無しさん:04/07/29 15:40
C++しらないけどconst渡したとか?

173 :デフォルトの名無しさん:04/07/29 15:46
begin()とend()渡しただけなので普通のiteratorだと思うのですが。

174 :デフォルトの名無しさん:04/07/29 15:48
>>171
まずくないはず。
g++で通ったし。
コンパイラとバージョンは?

>>172
それは問題なし

175 :デフォルトの名無しさん:04/07/29 15:50
>>171
まずくはないでしょ.これ通るでしょ.
#include <iostream>
#include <set>
#include <algorithm>
#include <functional>
using namespace std;
class A {
private:
int value_;
public:
A (int p): value_ (p) {}
bool operator < (const A &p) const {return value_ < p.value_;}
void show () const {cout << value_ << endl;}
};
int main () {
typedef set <A> Set;
Set s0;
for (int i (0); i < 10; ++ i)
s0.insert (A (i));
for_each (s0.begin (), s0.end (), mem_fun_ref (&A::show));
return 0;
}


176 :デフォルトの名無しさん:04/07/29 15:51
BCB6です。
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland

177 :デフォルトの名無しさん:04/07/29 15:52
>>175
警告 W8091 tewst.cpp 19: template の _InputIter 引数('for_each' に渡される)は
output 反復子:input 反復子が必要(関数 main() )

との事です。

178 :175:04/07/29 15:55
>>177
なぬぅ!? 私のはg++ 3.3.4なんだけど,この警告は何なの?
因みに実行は問題ないんですよね?


179 :デフォルトの名無しさん:04/07/29 15:55
tewstはファイル作る時にtestとタイプミスしただけです。

180 :デフォルトの名無しさん:04/07/29 15:57
>>178
実行は問題無いです

181 :デフォルトの名無しさん:04/07/29 16:24
setのiteratorをoutputと申告するようなstlは捨てちまえ。

ところでBCCの警告はテンプレート引数名に反応してるのか?
親切だな。

182 :デフォルトの名無しさん:04/07/29 19:31
あー、俺もBCB使ってて、以前から「なんだろこれ?」と思ってた。

問題が起こってるようには見えないんで、無視してるけど・・・。

183 :デフォルトの名無しさん:04/07/29 21:06
反復子って単語知らなかった…
どこのコンパイラか知らんが,iteratorまで翻訳するなよ(><

184 :デフォルトの名無しさん:04/07/29 23:42
BCC5.6.4のSTLはSTLport4.5.3だよ。BCCが悪いのかSTLportのバージョンが古い
のが悪いのかわからんが、時々おかしな警告は出るね。(KT変数がどうのこうのとか)。

しかしSTLportなかなか新しいの出ないね。gcc3.4.0への対応に手間取っているら
しい。かなり変更点があったからね。

185 :デフォルトの名無しさん:04/07/29 23:46
std名前空間のなりすましとコンパイラ提供のiostreamを混在させたときに破綻してたのは解決したんだろうか?

186 :デフォルトの名無しさん:04/07/29 23:57
うちはBCB6だが>>175で警告は出ないが?

187 :デフォルトの名無しさん:04/07/29 23:59
警告 (藁8091

188 :デフォルトの名無しさん:04/07/30 00:03
>>186
-w付けろよ

189 :デフォルトの名無しさん:04/07/30 00:25
イテレータ
イタレータ
どっち使いますか?

190 :デフォルトの名無しさん:04/07/30 00:26
-藁

191 :デフォルトの名無しさん:04/07/30 00:45
-w付けろよデコ助野郎!!

192 :デフォルトの名無しさん:04/07/30 01:12
>>189
繰返子

193 :デフォルトの名無しさん:04/07/30 07:52
痛レータ

194 :デフォルトの名無しさん:04/07/30 08:00
http://www.google.co.jp/search?q=%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF&ie=UTF-8&hl=ja&lr=
イテレータ の検索結果 約 9,640 件中 1 - 10 件目 (0.12 秒)

http://www.google.co.jp/search?q=%E3%82%A4%E3%82%BF%E3%83%AC%E3%83%BC%E3%82%BF&ie=UTF-8&hl=ja&lr=
イタレータ の検索結果 約 130 件中 1 - 10 件目 (0.28 秒)

http://www.google.co.jp/search?hl=ja&ie=UTF-8&c2coff=1&q=%22%E5%8F%8D%E5%BE%A9%E5%AD%90%22&lr=
"反復子" の検索結果 約 1,530 件中 1 - 10 件目 (0.18 秒)

195 :デフォルトの名無しさん:04/07/30 10:04
板前の源さん

196 :デフォルトの名無しさん:04/07/30 12:33
void型のポインタを宣言して
そこに動的に確保したクラスのポインタを収納して
必要なときに、dynamic_castか何かでキャストして取り出してそうさすることは可能ですか?
さまざまなクラスのポインターを一様に収納できる入れ物を作りたいのです。

void *ptr;
class1 *hoge;

hoge = new class1();

ptr = hoge;

class1 *test;

test = dynamic_cast<class1*>(ptr);

test->〜
test->〜

これは可能ですか?

197 :デフォルトの名無しさん:04/07/30 12:41
>>196
5分もかからないのに、なぜやってみないのですか?

198 :デフォルトの名無しさん:04/07/30 12:42
>>196
reinterpret_cast でならできるよ。
どうやって型を覚えておくのかはしらないけどね。

199 :デフォルトの名無しさん:04/07/30 12:44
なんでアップキャスト使わないの?

200 :デフォルトの名無しさん:04/07/30 12:44
>>199
へ?

201 :デフォルトの名無しさん:04/07/30 12:45
>>196
試せ

202 :デフォルトの名無しさん:04/07/30 12:45
>>198
static_cast でも大丈夫だと思う。
どうやって型を(ry

203 :196:04/07/30 12:51
型の覚え方は簡単です。

実はこの間に仲介するクラスがあって。

publicメンバーで
int型とvoid*型が宣言されています。

intが1であったら
class1で型キャストする
intが2であったら
class2で型キャスト
intが3であったら…

という風にしようとおもっています。

204 :デフォルトの名無しさん:04/07/30 13:01
>>203
「可能かどうか?」と聞かれれば「可能」だが、
絶 対 に 設 計 を 見 直 し た 方 が い い !

205 :デフォルトの名無しさん:04/07/30 13:02
>>203
C++ 以外の言語でやりなさい

206 :196:04/07/30 13:40
そうですか…
しかしメインのタスクシステムがあってそのタスクシステムから
他の機能モジュールへ実行命令を発行させようとおもったらこの形がいいかな
とおもって…

こういう設計は、バグの要因になるでしょうか???


207 :デフォルトの名無しさん:04/07/30 13:42
>196
なにするかによるが、たぶん設計間違ってる

208 :デフォルトの名無しさん:04/07/30 13:42
>>206はC++には向いてない

209 :デフォルトの名無しさん:04/07/30 13:44
>>206
boost::anyじゃ駄目なの?

210 :196:04/07/30 13:48
実はタスクシステムはスレッドが回っています。
そしてList型をprivateメンバーに持っていて。

そのList型に

class Ctask{
public:
int TaskType;
void *ptr;
}

こう言ったtaskクラスが順に格納できるようになっています。

インターフェイスからCtaskに適切な情報を入力して。
このタスクシステムのListに放り込んでやったら。

タスクシステムが順にListを呼んでいって、TaskTypeに適切なクラスにptrをキャストして
実行すると…というふうなシステムを考えました…

211 :デフォルトの名無しさん:04/07/30 13:49
CCtask多重継承しときゃいいやん。

212 :196:04/07/30 13:50
>>209
boostはしりません…(TT
STLで同じようなものはないでしょうか?

213 :196:04/07/30 13:51
>>211
えっとどういうことでしょうか?
もっと詳しく教えてくれれば幸いです。おながいしますm(_ _)m

214 :デフォルトの名無しさん:04/07/30 13:52
>>196
>さまざまなクラス
とやらの基底クラスを作れ。void*の代わりにその基底クラスへのポインタを持て。

215 :デフォルトの名無しさん:04/07/30 13:53
全部の昨日モジュールクラスがこれから派生する。
class CCtask{
virtual public void Execute(){}=0;
}
見たいな感じで。
単一継承でもいいけど

216 :デフォルトの名無しさん:04/07/30 13:53
>>214
共通のメソッドがなかったりして(w

217 :デフォルトの名無しさん:04/07/30 13:54
class AbstractTask
{
public:
 virtual void Process() = 0;
};

class TaskA : public AbstractTask
{
 //いろいろ
}

class SugoiTask : public AbstractTask
{
 //いろいろ
}

class ShoboiTask : public AbstractTask
{
 //いろいろ
}

std::list<AbstractTask*> taskList;

これじゃあ駄目なの?

218 :デフォルトの名無しさん:04/07/30 13:54
それか呼び出し自体をファンクターにしてそれを保持しておくとか

219 :196:04/07/30 13:56
>>216
そのとおりです…
機能モジュールは何か共通のクラスから派生しているわけではないです…

220 :デフォルトの名無しさん:04/07/30 13:57
だから多重継承したらいいやん。

221 :デフォルトの名無しさん:04/07/30 14:00
機能モジュール変更できないならファンクター使うべし

222 :196:04/07/30 14:00
>>217
なるほど、この方法なら僕のけったいな設計よりはるかにスマートですね。
ちょっとコードを書いてみます。

223 :196:04/07/30 14:01
>>221
ファンクターってのは…なんでしょう…ぐぐってきます

224 :デフォルトの名無しさん:04/07/30 14:02
変更できるのかよ…

225 :196:04/07/30 14:03
機能モジュールはいくらでも変更可能ですw
まだまだコーディング段階なので…
いわれてみれば>>217さんの言うようなシステムでまとまりますね!

まだまだ経験が足りないようです。

みんなありがとう!

226 :デフォルトの名無しさん:04/07/30 14:04
こーどーも電話っ相談室ー

227 :デフォルトの名無しさん:04/07/30 14:07
また一人ヤバすぎる設計をする馬鹿を救う事が出来た

228 :デフォルトの名無しさん:04/07/30 14:19
ある意味、そのような機能を実装するのにリフレクションもどきを使おうとする196に才能の片鱗を見たが

229 :デフォルトの名無しさん:04/07/30 14:47
>>228
見ないって。

230 :デフォルトの名無しさん:04/07/30 14:49
>>227
猪突猛進中が多いなか、素直な奴で良かった。
おまえは伸びるかもしれない。周りにいい奴がいればな。

が、こいつは多態も知らずに……いや、なんでもない。がんばれよ。

231 :196:04/07/30 16:13
>おまえは伸びるかもしれない。周りにいい奴がいればな。
周りには誰もいない(TT…(学生なもので

232 :デフォルトの名無しさん:04/07/30 16:16
学生が無人島からアクセス

233 :デフォルトの名無しさん:04/07/30 16:53
>196
始めてどのぐらい?

234 :デフォルトの名無しさん:04/07/30 18:34
関数の中の引数と関数の中の変数の名前が同じ場合名前を変えないでやるにはどうしたらいいですか?

235 :デフォルトの名無しさん:04/07/30 18:34

COM の IUnknown は、相当イカス仕組みだと思う。
とくに QueryInterface はナイスアイデア

236 :デフォルトの名無しさん:04/07/30 18:36
>>234
名前を変えてください

237 :デフォルトの名無しさん:04/07/30 18:38
>>236
変えないでやる方法があるはずです
おしえてください

238 :デフォルトの名無しさん:04/07/30 18:39
>>237
変えたくない理由を教えてください

239 :デフォルトの名無しさん:04/07/30 18:42
クラスの中のメンバー変数とメンバー関数の引数の名前が同じだからです
これを変えてしまうとシステムを初めから構築しなければなりません

240 :デフォルトの名無しさん:04/07/30 18:43
それなら this してください

241 :デフォルトの名無しさん:04/07/30 18:43
>239
だったらはじめから作り直したらどうですか?

242 :デフォルトの名無しさん:04/07/30 18:44
thisとはどのようにしてつかったらよろしいのでしょうか?

243 :デフォルトの名無しさん:04/07/30 18:44
ググって下さい無能

244 :デフォルトの名無しさん:04/07/30 18:46
かしこまりましたグッグてみることにいたします

245 :デフォルトの名無しさん:04/07/30 18:46
りファクタリング使えボケ

246 :デフォルトの名無しさん:04/07/30 18:47
りファクタリングとはどのようにつかったらよろしいのでしょうか?

247 :デフォルトの名無しさん:04/07/30 18:49
ググれよ...

248 :デフォルトの名無しさん:04/07/30 18:50
C++のまともなりファクタリングツール内の?

249 :デフォルトの名無しさん:04/07/30 18:51
ない

250 :デフォルトの名無しさん:04/07/30 19:00
this->aがメンバー変数になるのはわかりましたが
メンバー変数ではなくてメンバー関数の中で変数を定義した変数と引数の名前が同じ場合は
どうやればいいですか?

251 :デフォルトの名無しさん:04/07/30 19:04
>250
無理だっつーの。
そもそもコンパイルも出来ないんだから、素直に書き換えろ。

252 :デフォルトの名無しさん:04/07/30 19:06
>250
聞いてる間に書き換えられませんか?

253 :デフォルトの名無しさん:04/07/30 19:08
たまたま宣言した変数がバッティングしただけで何でシステム全部書き直す必要が出てくるんだ?

254 :デフォルトの名無しさん:04/07/30 19:12
高度にカプセル化してあるので書き換えするとバグが出る可能性が高そうです

255 :デフォルトの名無しさん:04/07/30 19:15
いっそのことクラス名からメソッド、メンバ、一時変数全部同じ名前にしたら?

256 :デフォルトの名無しさん:04/07/30 19:16
>253
システム全部が同じメソッドに入っている

257 :デフォルトの名無しさん:04/07/30 19:35
>>255
そんなことできるんですか!?

258 :255:04/07/30 19:40
可能
ついでにnamespaceも一緒にしとけ

でそれが出来たらなにがしたいんでしょう?

259 :デフォルトの名無しさん:04/07/30 19:40
Eclipseのメトリクスプラグインのような、ソースコードの各種複雑度を測るようなツールの
http://eclipsewiki.net/eclipse/index.php?%A5%E1%A5%C8%A5%EA%A5%AF%A5%B9%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3
C++用のって何かありますか(無料のもの)?


260 :デフォルトの名無しさん:04/07/30 20:05
「関数の引数の名前」って・・・。とんでもなアホなのか。

261 :デフォルトの名無しさん:04/07/30 20:08
C++ようのりファクタリングツール作ったら売れるかな?

262 :デフォルトの名無しさん:04/07/30 20:15
>>259
CCCC

263 :デフォルトの名無しさん:04/07/30 20:54
>高度にカプセル化してあるので書き換えするとバグが出る可能性が高そうです

あきらかに、いい加減なカプセル化がしてある例だろう。

264 :デフォルトの名無しさん:04/07/30 20:56
プログラミングのことで質問があります。

ある関数z=f(x,y)を数値計算し、各(x,y)ごとにzをプロットしたい
のですが、どのようなプログラムを組めばよいでしょうか?

プログラミングで絵を描かせるというよりは、出力されたファイルを
他のソフトで開いてその分布を表示させる、という形にしたいのです。
特に、連続的な(x,y)をどのように離散化させて出力するか
お聞きしたいです。

Excelでも出来るかもしれませんが、どうしてもプログラミングで
行いたいのです。

できれば、C++をもちいておしえていただければ幸いです。

すみませんが、よろしくおねがいします!

265 :デフォルトの名無しさん:04/07/30 20:56
無粋な人だ

266 :デフォルトの名無しさん:04/07/30 20:59
>264
なにを聞きたいのでせう?
範囲広すぎてたまらん

267 :デフォルトの名無しさん:04/07/30 21:21
>>264
#include <iostream>
using namespace std;
typedef double (*Function) (double, double);
const double XMIN (-1); const double XINTERVAL (0.01); const double XMAX (1);
const double YMIN (-1); const double YMAX (1); const double YINTERVAL (0.01);
double func (double x, double y) {return x * x + y * y;}
ostream &output (ostream &p_os, const Function &p_func,
double p_xmin, double p_xinterval, double p_xmax,
double p_ymin, double p_yinterval, double p_ymax) {
for (; p_ymin < p_ymax; p_ymin += p_yinterval)
for (; p_xmin < p_xmax; p_xmin += p_xinterval)
p_os << p_xmin << " " << " " << p_ymin << " " << (*p_func) (p_xmin, p_ymin) << "\n";
return p_os;
}
int main () {
output (cout, &func, XMIN, XINTERVAL, XMAX, YMIN, YINTERVAL, YMAX) << endl;
return 0;
}


268 :267:04/07/30 21:29
267は慌てすぎた.こんな感じでどうでしょう? 大文字のところはすきにして下さい.
#include <iostream>
using namespace std;
typedef double (*Function) (double, double);
const double XMIN (-1); const double XINTERVAL (0.1); const double XMAX (1);
const double YMIN (-1); const double YINTERVAL (0.1); const double YMAX (1);
double FUNC (double x, double y) {return x * x + y * y;}
ostream &output (ostream &p_os, const Function &p_func,
double p_xmin, double p_xinterval, double p_xmax,
double p_ymin, double p_yinterval, double p_ymax)
{
for (double y (p_ymin); y < p_ymax; y += p_yinterval)
for (double x (p_xmin); x < p_xmax; x += p_xinterval)
p_os << x << " " << y << " " << (*p_func) (x, y) << "\n";
return p_os;
}
int main ()
{
output (cout, &FUNC, XMIN, XINTERVAL, XMAX, YMIN, YINTERVAL, YMAX);
return 0;
}


269 :デフォルトの名無しさん:04/07/30 21:36
>267さん、

ありがとうございます!
これをもとに取り組んでみたいと思います。
丁寧に書いていただき、また、このようなことに時間をとっていただき、
ありがとうございました!
(23才、OL)

270 :デフォルトの名無しさん:04/07/30 21:59
整数値をchar*型に文字列として格納する方法どうしたらいいでしょうか。
123→"123"こんなかんじです。おねがいします。

271 :デフォルトの名無しさん:04/07/30 22:04
>>270
sprintf
他には非標準だけどitoaとか

272 :デフォルトの名無しさん:04/07/30 22:11
>>270
int i0 (123);
boost::lexical_cast <string> (i0).c_str ();


273 :270:04/07/31 00:00
ありがとうございます。
標準ライブラリのsprintfを使ってみたところコンパイルが通りません。
重ね重ねすみませんがミス指摘お願いします。

#include<stdio.h>

int main(){
int a = 123;
char *str;
sprintf(str,"%d",a);
printf(str);
}

274 :デフォルトの名無しさん:04/07/31 00:05
#include <string.h>
あと領域確保してない str にいきなり書き込むな

275 :デフォルトの名無しさん:04/07/31 00:13
>>270
残念ながらchar*型に「文字列」は格納できません。

276 :デフォルトの名無しさん:04/07/31 00:17
#include<stdio.h>

int main(){
int a = 123;
char *str = "0000000000000000000000000000000000000000";
sprintf(str,"%d",a);
printf(str);
}

にしてみろ。

277 :デフォルトの名無しさん:04/07/31 00:22
>273、>276
おまえも、おまえもC++禁止。C#でも使っててくれ..

278 :デフォルトの名無しさん:04/07/31 00:27
>>277
ここC++スレだろ?


279 :デフォルトの名無しさん:04/07/31 00:29
あんなコード核奴は許さん

280 :デフォルトの名無しさん:04/07/31 00:38
これでどうや。

#include<stdio.h>

int main (int argc, char * const argv[]) {
int a = 123;
char str;
sprintf(&str, "%d", a);
printf("%s", &str);
return 0;
}


281 :デフォルトの名無しさん:04/07/31 00:39
ネタならねたといってくれ...

282 :デフォルトの名無しさん:04/07/31 00:50
C++止めろとは言わんが、初心者スレに移動してくれ。

283 :デフォルトの名無しさん:04/07/31 08:00
何でポインタ理解出来てないんだよ

284 :デフォルトの名無しさん:04/07/31 08:22
× stdio.h
○ cstdio

285 :デフォルトの名無しさん:04/07/31 09:49
そこつっこむところちゃう

286 :デフォルトの名無しさん:04/07/31 09:53
>>274
sprintfもstdio.hの中にプロトタイプがある。

287 :デフォルトの名無しさん:04/07/31 14:01
>>286
そんなのどうでもいい

288 :デフォルトの名無しさん:04/07/31 14:09
こう…?やっぱりCは難しい…

#include <iostream>
#include <math.h>

using namespace std;

int main(void)
{
  int i = -123;
  char* str = NULL;
  int l = (int) log(fabs((double) i));

  // - 記号と \0 のため +2
  str = new char[l + 2];

  sprintf(str, "%d", i);

  printf("%s\n", str);

  delete[] str;

  return 0;
}

289 :デフォルトの名無しさん:04/07/31 14:12
ここは C++ スレですよ?
ostringstream oss;
oss << a;

290 :デフォルトの名無しさん:04/07/31 14:54
どうでもいいけど、ostringstreamって長いよな、名前が。

291 :デフォルトの名無しさん:04/07/31 15:06
>>288
math.h→cmath
log→std::log
fabs→std::fabs
それからiostreamをインクルードしてるのになんでsprintf()とかprintf()なの?
インクルードするならcstdioだろが。当分C++スレに来ないでくれないか。
>>290
長けりゃtypedefすればいい。

292 :デフォルトの名無しさん:04/07/31 15:21
>>291
fabs→std::abs
の方が良くないか?

あと、言葉遣いは丁寧にな。

293 :デフォルトの名無しさん:04/07/31 15:44
関係ないが std::assert() と書いて悩んだことがあるのは、俺だけ?

294 :デフォルトの名無しさん:04/07/31 17:58
>>293
俺もある。

295 :デフォルトの名無しさん:04/07/31 18:10
assert()って使ったことない

296 :デフォルトの名無しさん:04/07/31 18:24
>>295の作ったソフトはバグだらけ

297 :デフォルトの名無しさん:04/07/31 18:32
実行時エラーチェックなんてダサすぎ。
全てコンパイルタイムに検出、これがC++。

298 :デフォルトの名無しさん:04/07/31 18:37
へー。C++って凄いんだね。これならCppUnitなんていらないね。

299 :デフォルトの名無しさん:04/07/31 18:40
質問させてもらいます・・
ゲーム画面に文字を表示したときに文字の背景が白なんですが、
この背景を変える方法はありませんでしょうか

ググってみたりいろいろ調べたんですがまったく見つからず困ってるところです・・


300 :デフォルトの名無しさん:04/07/31 18:42
C++にゲーム画面に文字を表示する機能や
背景を変える方法はありません。
コンソールに文字を出力する機能ならありますが。

301 :デフォルトの名無しさん:04/07/31 18:57
全部コンパイルタイムなんてムリ

302 :デフォルトの名無しさん:04/07/31 19:02
>>299
>ゲーム画面に文字を表示したときに文字の背景が白なんですが・・・

とっても面白そうなゲームですね。なんというゲームですか。
ゲームの名前を教えてください。
それがわからないと、答えられません。

303 :299:04/07/31 19:03
すいません、WIN32APIての使ってウインドウ作ってまして、
sprintf関数とTextOut関数で表示させてるんですが

こういうのになるとスレ違いなんでしょうか?

304 :デフォルトの名無しさん:04/07/31 19:07
Win32API質問箱 Build21
http://pc5.2ch.net/test/read.cgi/tech/1090422324/

305 :299:04/07/31 19:10
>>304
ど、どうも・・失礼しました(´・ω・`)

306 :デフォルトの名無しさん:04/07/31 19:39
メンバ関数をqsortの第四引数に渡したい場合どうしたら良いのでしょうか?

307 :デフォルトの名無しさん:04/07/31 19:55
MURI

308 :デフォルトの名無しさん:04/07/31 20:01
緩衝コードを書く

309 :306:04/07/31 20:07
緩衝コードとは何でしょう?
例えばこんなのですが?

class C;
static C* g_ptr = NULL;
class C
{
public:
    void f(){}
    C(){ g_ptr = this; }
};

void
f()
{
    return g_ptr->f();
}

でもグローバル変数使うのが嫌でつ

310 :デフォルトの名無しさん:04/07/31 20:14
std::sort は使えんのか?

311 :デフォルトの名無しさん:04/07/31 20:29
メンバ関数ポインタは関数ポインタよりでかいからqsortに渡すのはムリだな

312 :デフォルトの名無しさん:04/07/31 20:39
>>311
ハァ?

313 :デフォルトの名無しさん:04/07/31 20:52
>>312
何がハァ?なの?

314 :デフォルトの名無しさん:04/07/31 20:57
>>309
一口にメンバ関数といっても
比較対象を lhs と rhs としたときに
lhs.compare(rhs) と someobj.compare(lhs, rhs) のどっちの形だ?
前者の場合であれば、compare(lhs, rhs) の形の非メンバ関数でラップしてやるだけ。
後者の場合、静的オブジェクト使いたくないのなら std::sort 使った方がいいだろう。


315 :デフォルトの名無しさん:04/08/01 00:16
ポインタに大小なんてあるんか?

316 :デフォルトの名無しさん:04/08/01 00:19
64bitOSならポインタは8バイトだろ。
32bitOSならポインタは4バイトだ。

317 :デフォルトの名無しさん:04/08/01 00:23
>>312
リップマンの本にだって書いてあるぞ
それ以前に実験くらいしてるのかよ

318 :デフォルトの名無しさん:04/08/01 00:27
アフォはこれでも読んどけ
http://66.102.7.104/search?q=cache:MEEg_aU1vNEJ:www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03058.html+%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF+%E3%82%B5%E3%82%A4%E3%82%BA&hl=ja&lr=lang_ja&inlang=ja

319 :デフォルトの名無しさん:04/08/01 00:31
>>316
おまいの言ってることは残念ながら滅茶苦茶だが、それはおいといて、
315のような質問に、そういったニュアンスの答えをしたくなるわな。
(316の言ってることは正しくないが、316がどういうことを言いたかったかはわかるということ)

さて、それをふまえると>>311に対しては、やはり ハァ? というリアクションしかでねぇだろう?

320 :デフォルトの名無しさん:04/08/01 00:34
>>311
> メンバ関数ポインタは関数ポインタよりでかいから
単純に型が違って変換できないだけなのに、
実装依存の理由を持ち出すのは感心できない。

321 :デフォルトの名無しさん:04/08/01 00:34
>>319
話がピーマンw

322 :デフォルトの名無しさん:04/08/01 03:57
どなたか教えてください。
3次元配列を確保する関数を作ったのですが、これで合ってるでしょうか・・?

// 確保する
template <class X>
X*** new3D(X type, int x1, int x2, int x3){
X*** p = new X**[x1];
for(int i=0; i<x1; i++){
p[i] = new X*[x2];
for(int j=0; j<x2; j++)
p[i][j] = new X[x3];
}
return p;
}

// 解放する
template <class X>
void delete3D(X& p, int x1, int x2){
for(int i=0; i<x1; i++){
for(int j=0; j<x2; j++)
delete [] p[i][j];
delete [] p[i];
}
delete [] p;
}

// 使うとき
BYTE ***p = new3D((BYTE)0, HEIGHT, WIDTH, DEPTH);
delete3D(p, HEIGHT, WIDTH);

一応動くのですが、なにか勘違いをしてないか不安です。
コンパイラはVC++の.NETを使ってます。

323 :デフォルトの名無しさん:04/08/01 04:06
見づらくてすいません・・・タブは消えてしまうみたいですね。

// 確保する
template <class X>
X*** new3D(X type, int x1, int x2, int x3){
  X*** p = new X**[x1];
  for(int i=0; i<x1; i++){
  p[i] = new X*[x2];
  for(int j=0; j<x2; j++)
    p[i][j] = new X[x3];
  }
  return p;
}

// 解放する
template <class X>
void delete3D(X& p, int x1, int x2){
  for(int i=0; i<x1; i++){
    for(int j=0; j<x2; j++)
      delete [] p[i][j];
    delete [] p[i];
  }
  delete [] p;
}

長文ですいません。

324 :デフォルトの名無しさん:04/08/01 04:37
>>321-322
・std::vector 使ったほうがよくない?
・new3Dの第1引数は何?
・delete3Dの第1引数が参照になってるのは何故?

325 :デフォルトの名無しさん:04/08/01 05:25
>>324
>delete3Dの第1引数が参照
これはたぶんdelete3D内でp = 0; なんてやるつもりなんだろうけど。

326 :デフォルトの名無しさん:04/08/01 05:40
>>321
new3D内のoperator new[]やXのデフォルトコンストラクタが例外を投げると、
それまでにoperator new[]によって確保成功したメモリがリークします。

あと、new3Dとdelete3Dとで、同じテンプレート仮引数名に対する型が違うのは良くないので、
template <class X> void delete3D(X*** p, int x1, int x2); としたほうがいいでしょう。

327 :326:04/08/01 05:51
324につられてレス番まちがえた。正しくは>>322宛て。

328 :デフォルトの名無しさん:04/08/01 06:28
レスありがとうございます。

>>324
まだC++始めたばかりで、STLは使ったことがないのですが、 
ttp://sapporo.cool.ne.jp/tanomi/qanda/a049.html ←このページのようなやり方で3次元にするということでしょうか?
確かにこっちの方が便利そうですね。
new3Dの第1引数はただ型名を教えるためだけのものなんですが・・・よく考えるといらなかったですね;

>>325
特に深く考えないで参照にしたのですが、ポインタの方がいいみたいですね。

>>326
例外処理をした方がいいということですよね?
これで合ってるでしょうか・・・。


329 :デフォルトの名無しさん:04/08/01 06:31
template <class X>
X*** new3D(int x1, int x2, int x3){
    int i,j,k;
    try{
        X*** p = new X**[x1];
        for(i=0; i<x1; i++){
            p[i] = new X*[x2];
            for(j=0; j<x2; j++)
                p[i][j] = new X[x3];
            }
    }catch (bad_alloc){
        int ii=i, jj=j;
        while(--jj>0) delete [] p[ii][jj];
        delete [] p[ii];

        for(; ii>=0; ii--){
            for(jj=0; jj<x2; jj++)
                delete [] p[ii][jj];
            delete [] p[ii];
        }
        delete [] p;
    }

    return p;
}

330 :デフォルトの名無しさん:04/08/01 06:46
>>329
コンパイル通らないソース貼ってどうするよ。
それ以外にも、基本的にダメ。
すべての new で例外が発生することを考慮しないといけない。もう少しシミュレーションを密にせよ。
Xのデフォルトコンストラクタでの例外を考慮すると、catch(...)が必要。
あと、巻き戻し処理が終わったら throw; で受け取った例外を外にそのまま伝えるべし。

・・・と、まぁ真面目に例外処理を行うためには必要な知識も多く、コーディングも面倒だから、
おとなしく std::vector 使っとけってこった。

331 :デフォルトの名無しさん:04/08/01 06:54
>>330
あれ?僕のだとコンパイル通るのですが・・・
とりあえず、力不足でした・・・。
やっぱりvectorで作ってみることにしますね。
アドバイスありがとうございました。

332 :デフォルトの名無しさん:04/08/01 07:10
>>331
ほんとうに通ったのか?
少なくとも、pのスコープがtryの中なので、catchの中とreturnの時点では使えないはず。

333 :デフォルトの名無しさん:04/08/02 00:16
>Xのデフォルトコンストラクタでの例外を考慮すると、catch(...)が必要。
例外指定による

>あと、巻き戻し処理が終わったら throw; で受け取った例外を外にそのまま伝えるべし。
ミッションによる

>必要な知識も多く、
こんな程度で多いと言う人の基準が謎(精一杯の好意的表現)

>コーディングも面倒だから、
だったら std::vector なんか使うより C++ から撤退すべき

んで、
>基本的にダメ
プ

334 :デフォルトの名無しさん:04/08/02 00:20
>>332
pというグローバル変数があるのでしょう。

335 :デフォルトの名無しさん:04/08/02 00:21
何一つ論破出来てないんですが

336 :デフォルトの名無しさん:04/08/02 00:21
釣りは放置しろ

337 :デフォルトの名無しさん:04/08/02 08:21
absやfabsfを使い分けるのが面倒なのですが
勝手にうまくやってくれる関数はありませんか?

338 :デフォルトの名無しさん:04/08/02 08:41
>>337
その程度ならテンプレで自作

339 :デフォルトの名無しさん:04/08/02 10:22
>>337
VC++ならabsはオーバーロードされている。

340 :デフォルトの名無しさん:04/08/02 11:31
C++ のファイル入出力やロケールは、かなり奥が深いのに、
Web上にドキュメントがほとんどない。

日本語で書かれたオススメの本または、web サイトがあれば教えてください。
ちなみに今知りたいのは、basic_filebuf のカスタマイズについてです。

341 :デフォルトの名無しさん:04/08/02 17:25
テキストファイルの中に指定の文字があったらtrueを返す関数として
次のように書いたら、鼻で笑われてしまいました_| ̄|○
どの辺が駄目なのか指摘してもらえないでしょうか

bool hoge( const char* file_name, const char* sz_target ){
using namespace std;
ifstream ifstrm( file_name );
if( ifstrm.fail() ) return false;

string str;
while( ! ifstrm.eof() ){
. getline( ifstrm, str );
. if( str.find( sz_target ) != -1 ) return true;
}
return false;
}

342 :デフォルトの名無しさん:04/08/02 17:26
>>341
-1のあたり。
つーか質問する前にちゃんと動くか位試せよ。

343 :デフォルトの名無しさん:04/08/02 17:31
>>342
いえもちろん動かした上です
環境はVC6です

そこ以外は問題ないのでしょうか

344 :デフォルトの名無しさん:04/08/02 17:32
-1でちゃんと動くの?

345 :デフォルトの名無しさん:04/08/02 17:33
ちゃんと動くね。
わざわざstringを使う必要ない気がするが。

346 :デフォルトの名無しさん:04/08/02 17:35
普通はstring::nposと書く。

347 :デフォルトの名無しさん:04/08/02 17:36
てぬいて書く分にはいいんでないの?
その分他の仕事したほうがいい!

348 :デフォルトの名無しさん:04/08/02 17:42
>>344 >>346-347
初めて見た例が-1だったため、ずっとこれでやってました_| ̄|○

>>345
やっぱり普通に>>で文字列取って、strcmpとかの方が良いのでしょうか?
早速、書き直します

皆さんレスありがとうございました

349 :デフォルトの名無しさん:04/08/02 17:47
いや自分で比較ルーチン作るかでなければ今のでいいんじゃない?
−1でいいのかは知らん.

350 :デフォルトの名無しさん:04/08/02 18:12
関係ないが、昔の記事だけどこれを思い出した
ttp://pc.2ch.net/tech/kako/996/996640937.html
の900

これがクソコードらしいな
何故なのか未だに分からないが

351 :デフォルトの名無しさん:04/08/02 18:25
magicnumberの使用

352 :デフォルトの名無しさん:04/08/02 18:59
>>350
かなりの古参でつね。

353 :デフォルトの名無しさん:04/08/02 19:42
>>350
コードの断片だけで、クソかどうか言われてもね。
ちなみに、私なら、1行ずつ処理するよりも、
ファイル内容を全部ベクタに詰め込んでから処理したいから、
以下のように書く。

ifstream file("test.txt", ios::in | ios::binary );
istreambuf_iterator< char > file_begin( file ), file_end;
vector< char > buff;
buff.insert( buff.end(), file_begin, file_end );

よく見るコードだから、取り立てて言うまでもないけどさ…

354 :デフォルトの名無しさん:04/08/02 20:12
>>353
クソコードだな

355 :デフォルトの名無しさん:04/08/02 20:13
ほんとだな。ファイルでかかったらメモリ食い尽くすし。

356 :デフォルトの名無しさん:04/08/02 20:26
どこでこんなのをよく見るんだ・・・

357 :デフォルトの名無しさん:04/08/02 21:26
perlとかならよく見る。

358 :デフォルトの名無しさん:04/08/02 22:29
ifstreamで全て読み込み終わってEOFとなるとseekgによって
ファイルポインタを動かすことができなくなるという仕様らしいのですが
再び先頭から読み込みたい場合はもう一度、ファイルを閉じて開いて
というようなことをするしかないのでしょうか

もっと上手い方法をご存知の方がいらっしゃいましたらよろしくお願い致します

359 :デフォルトの名無しさん:04/08/02 22:36
clearすればええやん。

360 :デフォルトの名無しさん:04/08/02 22:48
>358
そこらへんのapiの動作に依存するのやで全部かいてますが
自分でバッファも確保しうまくやる

361 :デフォルトの名無しさん:04/08/02 23:23
>>341
禁則やWordWrapの問題があるんでない?
2行以上にまたがった比較もしないといけないケースはないの?


362 :デフォルトの名無しさん:04/08/03 00:03
http://pc.2ch.net/tech/kako/996/996640937.html

363 :353:04/08/03 01:03
>>355
最近のOSならば、vector::reserve で 20MB くらいの確保なら余裕だし。
それに、std::distance でサイズ調べて、あまりに大きかったら分割すればOKっしょ。

364 :デフォルトの名無しさん:04/08/03 01:08
いや明らかに糞だよ?

365 :デフォルトの名無しさん:04/08/03 01:10
プゲラ

366 :デフォルトの名無しさん:04/08/03 02:52
std::listってどんなときに使うの?
std::dequeでよくね?
つーか、ぶっちゃけいらないんだけど・・・

367 :デフォルトの名無しさん:04/08/03 03:07
初心者には必要ないよ

368 :デフォルトの名無しさん:04/08/03 05:07
vectorやlistってハンガリー記法だとどんな接頭語になるの?

369 :デフォルトの名無しさん:04/08/03 05:24
クラスに接頭語はつけないだろ
アルファベットが足りなくなる

370 :デフォルトの名無しさん:04/08/03 08:30
>std::distance でサイズ調べて

オイオイ、めちゃくちゃ時間かかるぞ

371 :デフォルトの名無しさん:04/08/03 08:48
>>368
俺はvectorとstringは例外的にvc, strを付けているけどそれ以外のクラスに接頭語は付けていない。
つかハンガリアンスレ行け。

372 :デフォルトの名無しさん:04/08/03 09:41
>368
うちの会社で駆逐したハンガリアン派がまだいたか

373 :デフォルトの名無しさん:04/08/03 10:51
>>371
ダサッ

374 :デフォルトの名無しさん:04/08/03 10:55
ダサイかダサくないかの問題ではない

375 :デフォルトの名無しさん:04/08/03 10:56
>>373にとってはそれが全て

376 :デフォルトの名無しさん:04/08/03 11:38
ハンガリアン使わなくなったけど、いまだにポインタにはpを付ける。

377 :デフォルトの名無しさん:04/08/03 11:44
>>364
詳しく


378 :デフォルトの名無しさん:04/08/03 12:03
>>376
ナカーマ

379 :デフォルトの名無しさん:04/08/03 12:06
変数名が短い時代は終わった。ポインタは接尾辞にPtrだろう。

380 :デフォルトの名無しさん:04/08/03 12:08
>>379
>変数名が短い時代は終わった。
だったら接尾辞にPointerじゃないの?

ただのなんかのカウンタのローカルポインタなら
localTemporaryCountPointer

381 :デフォルトの名無しさん:04/08/03 12:10
>>376
スマートポインタにも付けるの?

382 :デフォルトの名無しさん:04/08/03 12:10
>>380
コード補完が無い環境とか1行に表示できる文字数が少ない環境にとっては嫌がらせに近いな。

383 :デフォルトの名無しさん:04/08/03 12:11
localTemporaryCounterInHogehogePointerToSignedInt32bits

384 :デフォルトの名無しさん:04/08/03 12:17
localTemporaryCounterInHogehogePointerToSignedInt32bitsButShouldBeScoped_ptrAtBoostLibrary

385 :デフォルトの名無しさん:04/08/03 12:19
変数名を考えるだけで一日が終わりそうだ

386 :376:04/08/03 12:22
>>381
最初spとか付けようと思ったけど
そんなことやってるとハンガリアンに戻りそうだったので
何も付けないことにしてる。

387 :デフォルトの名無しさん:04/08/03 13:30
pとか言ってる時点でハンガリアンケテーイ

388 :デフォルトの名無しさん:04/08/03 13:31
>>382
それが狙いなんだよ。
糞エディタ捨ててIDEを使えと教育してやってるの。

389 :デフォルトの名無しさん:04/08/03 14:08
ポインタにp付けるのは,C++以前,K&Rの頃からあると思うが…
ハンガリアンだと,lpとかじゃないの?

390 :デフォルトの名無しさん:04/08/03 14:18
>>389
lpはポインタにfar/nearの区別があった頃の名残で、比較的新しいAPIはpに変わってきている。

391 :デフォルトの名無しさん:04/08/03 14:40
ハンガリアンマンセーな奴とアンチってどこにでも見かけるんだけど、実際プロの現場ではどうなのよ?

392 :デフォルトの名無しさん:04/08/03 14:42
もちろん両方いるよ。
ただハンガリアン使わないほうが賃金が高いという傾向にあるという統計データが出てるよ。
もちろん表記を使うかどうかで差が出るわけではなく
賃金の低いC/C++のロートルプログラマが好んで使うというカラクリ。

393 :デフォルトの名無しさん:04/08/03 14:59
あやしいー

394 :デフォルトの名無しさん:04/08/03 15:10
C++限定だけど、
非ハンガリアンはハンガリアンのことをアホだと思っているけど、
ハンガリアンは非ハンガリアンのことを「なんでこんな便利なのに使わないんだろう」程度に思っている。

私は非ハンガリアン。
Cでハンガリアンなのは構わないけどね。

395 :デフォルトの名無しさん:04/08/03 16:04
なんで C++ 限定なの?

396 :デフォルトの名無しさん:04/08/03 16:06
OOP だろ

397 :デフォルトの名無しさん:04/08/03 16:10
C++使ってると、ポインタ/スマートポインタにpは付けるな。
アンチハンガリアンが過ぎるあまり、型情報を含んだ接頭語自体を
必要以上に毛嫌いしすぎてる気がする。

gotoみたいに、分からなくてもとりあえず排除しとけばいいってモンでもないのに。

398 :デフォルトの名無しさん:04/08/03 16:25
C++だと継承とか多態性とか。
抽象クラスの変数に実装クラスのインスタンスを割り当てる時とか。
ハンガリアンじゃ困らないか?

intとかのプリミティブな型はどっちでもいい。
変数へのアクセスって自クラスからか、ローカルか、friend関数・クラスからしかありえないと
思うんで(グローバル使ってるのは論外)。
そんなものは、どう付けようと宣言がすぐそばにあるはず。
IDE使わなくても何型かすぐわかるだろ?
ただ、名称は意味のあるものにしてほしいけど。

399 :デフォルトの名無しさん:04/08/03 16:40
メンバ変数を区別するかどうか
これが悩む

400 :デフォルトの名無しさん:04/08/03 16:58
ハンガリアンてなに?

401 :デフォルトの名無しさん:04/08/03 17:04
オレ、goto使ってるけどな。

402 :デフォルトの名無しさん:04/08/03 17:06
多重ループ抜ける goto とか上から下のみの goto な許せる

403 :デフォルトの名無しさん:04/08/03 17:09
>>399
どちらでもいいと思う。
ローカル変数とメンバ変数の区別だけなら
メンバ変数の前にthis->をつける
メンバ変数の最後にアンダーバーや最初にm_
など。

>>400
M$の一プログラマが決めた変数の命名規約。ハンガリー出身だったからハンガリアン規約と呼ばれる。
当初M$は推奨していたが、今は非推奨。

>>401
C言語でエラー処理を一カ所にまとめて記述するのに用いるのはそう悪いことではないという人もいる。
C++だと悪。
というか、ネタ?
マジレスごめん。

404 :デフォルトの名無しさん:04/08/03 17:11
>>399
ローカルじゃないのは、ほぼ間違いなくメンバだろうし
ローカルとメンバの区別さえできれば良い気がするんだけどなぁ。
でも世のサンプルはm_とかついてるの多いよね。

おいらローカル変数は小文字のみでnum_applesみたいに
メンバ変数はnumApplesって感じにしてるけど、良いのやら悪いのやら

405 :デフォルトの名無しさん:04/08/03 17:13
403さんとかぶった

DirectXのMSによるサンプルは、
C++だけどエラー処理にgoto使いまくってるねぇ

406 :デフォルトの名無しさん:04/08/03 17:20
エラー処理といっても、そのエラーが頻繁に起こりうる場合は
例外は使いづらい。

407 :デフォルトの名無しさん:04/08/03 17:24
エラーってどうしておこるの?

408 :デフォルトの名無しさん:04/08/03 17:25
仮引数やローカル変数とメンバの区別はthis->でいいけど
コンストラクタと初期化リストの場合は区別できないから悩む。
メンバにm_とかケツアンダースコアとかつけたくないけど、
仮引数の名前にそれをつけるのも気が引けるしな。

409 :デフォルトの名無しさん:04/08/03 17:25
人間が無能だからさ

410 :デフォルトの名無しさん:04/08/03 17:28
だからといってgoto文を使っていい理由にはならない。
if else で何とかするか、設計を見直してみる。

以前みた一番酷いgotoは、forの2重ループの中のif文の中に飛び込むやつ。
外部からきた完成品なもんで修正することもできず、そのまま利用。Cだったけどね。


411 :デフォルトの名無しさん:04/08/03 17:30
>>408
じゃあ>>404さんみたいに小文字と大文字でとかどうだろ。
むずかしいね、そこんところは。


412 :デフォルトの名無しさん:04/08/03 17:31
自分ひとりでやるのならa b c d e f g h i j k l m で十分と思う

413 :デフォルトの名無しさん:04/08/03 17:33
if else で何とかして見難くなるくらいだったら、
オレは喜んでgoto使うな。っていうか使ってる。
関数の最下行のreturn(...);に飛ばすときだけだけど。

414 :デフォルトの名無しさん:04/08/03 17:35
>>413
途中でreturnするのはだめなの?

415 :デフォルトの名無しさん:04/08/03 17:35
素直にメンバ変数にm_付けてて何の不自由も感じないよ。

416 :デフォルトの名無しさん:04/08/03 17:36
>>410
うへぇ〜。。。。。

CPU時間が厳しい場所で例外も関数呼び出しもイヤな状況下でgoto使うのはそれほどイヤじゃないけど。
ループの中に入るなんて。。。。

417 :デフォルトの名無しさん:04/08/03 17:36
>>414
戻値のチェックをするときは一箇所にまとめたほうが楽だからね。


418 :デフォルトの名無しさん:04/08/03 17:38
いろんなところで return があると見にくい

419 :デフォルトの名無しさん:04/08/03 17:39
tryのthrowでchatchしてリターンさせれば?

420 :デフォルトの名無しさん:04/08/03 17:39
>>410
> forの2重ループの中のif文の中に飛び込むやつ

それは論外ですね。掟破りでしょう。
それ作った香具師は逝って吉ですw

421 :デフォルトの名無しさん:04/08/03 17:41
>>417
戻り値のチェックは普通、外側でやるもんじゃないの?

422 :デフォルトの名無しさん:04/08/03 17:42
ハンガリアン、gotoスレ逝け。
この低賃金どもが。

423 :デフォルトの名無しさん:04/08/03 17:44
>>421
そうとは限らないす。
戻値によってreturnする前の内部あと処理を分けたいときなど。

424 :デフォルトの名無しさん:04/08/03 17:46
とにかく、処理の流れの中で、必ずここを通るってのがあると、
デバッグとかしやすいかな。

425 :デフォルトの名無しさん:04/08/03 17:47
>>422
もしかして、forループ内にgotoで飛び込んじゃう人でしょ。
恥ずかしいからって切れなさんな。


426 :デフォルトの名無しさん:04/08/03 17:49
>>422
低賃金どころか無収入ですが何か?

427 :デフォルトの名無しさん:04/08/03 17:55
>>426
ステキ!!

428 :デフォルトの名無しさん:04/08/03 18:18
標準C/C++ ライブラリで、ファイルサイズを求める関数・メソッドはありますか?



429 :428:04/08/03 18:19
あと、ついでに、ファイルのコピーと、ファイルの削除を行う関数もありましたら教えてください。


430 :デフォルトの名無しさん:04/08/03 18:20
ない

431 :デフォルトの名無しさん:04/08/03 18:24
remvoveってあったような。

432 :431:04/08/03 18:24
removeね

433 :デフォルトの名無しさん:04/08/03 19:32
>>429
ファイルコピーをする関数は標準ライブラリ関数だけで当然作れる。

434 :デフォルトの名無しさん:04/08/03 19:34
ファイルの内容だけならな

435 :デフォルトの名無しさん:04/08/03 19:35
>>433
それ言っちゃファイルサイズも……。

436 :デフォルトの名無しさん:04/08/03 19:37
俺たちは、ファイルのコピーすら、OS の力を借りないと出来ないのか…!

437 :デフォルトの名無しさん:04/08/03 19:40
ハードディスク会社が独自のAPIを開発してくれればいいんだよ

438 :デフォルトの名無しさん:04/08/03 19:43
よー考えたら全部仮想化の賜だな


439 :デフォルトの名無しさん:04/08/03 19:50
C++.NETなら標準でできるよ

440 :デフォルトの名無しさん:04/08/03 20:06
C++って非力だな。
N88BASIC以下じゃん。

441 :デフォルトの名無しさん:04/08/03 20:20
そりゃそうさ、いちいちコンパイルしなきゃな上
GOTO使えば怒られる始末だからな

442 :デフォルトの名無しさん:04/08/03 20:41
BASIC の単細胞ぶりが羨ましいぜ

443 :デフォルトの名無しさん:04/08/03 20:49
AUTO 10

444 :デフォルトの名無しさん:04/08/03 21:28
初歩的な質問で申し訳ありませんが,
クラス内にprivateで配列を宣言したとき,
その配列の値をもらうためにはクラスに十分な大きさの
ポインタなどを渡して,クラス内の関数でポインタに値をコピーするしか方法は
無いのでしょうか?
それともprivateで宣言した配列のポインタを取得してクラス外で操作しても
問題無いのでしょうか?
前者だと,配列の大きさによっては処理に時間がかかってしまいます.
後者だとprivateで宣言した意味が無いような気がします.



445 :デフォルトの名無しさん:04/08/03 21:31
>それともprivateで宣言した配列のポインタを取得してクラス外で操作しても
>問題無いのでしょうか?

問 題 な い わ け な い だ ろ ! !

446 :デフォルトの名無しさん:04/08/03 21:34
>>444
後者。こんなこともやれる。
class Hoge {
 char Buf[255];
public:
 char *GetBuf() {return Buf;}
};
std::stringのc_strなんかのようにconstポインタを返すこともある。

447 :デフォルトの名無しさん:04/08/03 21:35
>>444
constなポインタなりイテレータを返せばいいやん。

448 :デフォルトの名無しさん:04/08/03 21:35
>>444
後者。

449 :デフォルトの名無しさん:04/08/03 21:37
「その配列の値をもらう」って、「クラスの中から外へ」と「クラスの外から中へ」とで曖昧じゃないか?
答えてる人たちはどっちだと思って話してるの?

450 :デフォルトの名無しさん:04/08/03 21:45
>>446
Bufがprivateである意味は?

451 :デフォルトの名無しさん:04/08/03 21:47
>>449
同じことだろ。

publicなポインタ取得メソッドを用意して万人にさらけだすのは問題だが
自メソッド内で他クラスにポインタ渡して操作してもらう分には無問題(であることもある)

452 :デフォルトの名無しさん:04/08/03 21:49
class Unko{
char buf[100];
public:
char getAt(int i) const{ return buf[i]; }
void setAt(int i,char ch){ buf[i]=ch; }
};

453 :デフォルトの名無しさん:04/08/03 21:50
private メンバのハンドルを const もつけずに返そうとしてるんだったら、今後の身の振り方を考えた方がよい

454 :デフォルトの名無しさん:04/08/03 21:52
>>450
>Bufがprivateである意味は?

あとで
class Hoge {
 char* Buf;
public:
 Hoge() { Buf = new char[max_buffer_size] };
 char *GetBuf() {return Buf;}
};
とか変更しやすいようにじゃない? sizeof とかされたくないジャン。

455 :デフォルトの名無しさん:04/08/03 21:53
>>453
例えば 2次元の画像データのバッファを抽象化した Bitmap クラスなんかでは、
const じゃないポインタを返すのも十分ありだと思うけど。

456 :デフォルトの名無しさん:04/08/03 21:55
しかしレベル低いな

457 :デフォルトの名無しさん:04/08/03 21:58
クラス外で作った配列をクラス内の配列に一気に持って来たいならコピーするべきだし、
それがメモリ容量、スループット上問題になるなら >>452 みたいにちまちまクラス内部
の配列に直接書くなり、もっと効率のよい関数を作るなりするべき。
さらに、それらが現実にそぐわないなら・・・・

458 :デフォルトの名無しさん:04/08/03 22:09
>>445はアフォということで

459 :デフォルトの名無しさん:04/08/03 22:12
classで宣言するからよくない。structで宣言してこれはちょっと便利な
関数つきの構造体ですよと言い張る。

460 :デフォルトの名無しさん:04/08/03 22:15
privateなのにメンバ関数もなしにいつの間にか値が変わってる…
そんなことなら最初からpublicにしてくれyo!

461 :444:04/08/03 22:17
>>444です.

レスありがとうございます,とりあえず後者でも問題無いと言うことでよいのでしょうか?
(少し理解しきれてない模様です...)

あと,ちょっと疑問に思ったのですが,
>>451
>publicなポインタ取得メソッドを用意して万人にさらけだすのは問題だが
つまり
class Hoge {
 char Buf[255];
public:
 void *GetBuf(char *buf) { buf = Buf;}
};
このようなのはダメってことで良いのでしょうか?




462 :461:04/08/03 22:19
微妙に間違えてました.
public:
 void GetBuf(char *buf) { buf = Buf;}
です.


463 :デフォルトの名無しさん:04/08/03 22:23
>>462
strcpy( buf, Buf );
じゃダメなのか?

464 :デフォルトの名無しさん:04/08/03 22:28
>>461-462
その処理、何か意味があるの?

465 :デフォルトの名無しさん:04/08/03 22:30
>>461 462
っていうか、コンパイル通る?

466 :デフォルトの名無しさん:04/08/03 22:32
>>462は引数の値を変えただけ。
外部には何の影響も与えないけど。

467 :461:04/08/03 22:44
あああ,何か基本的なことを間違えていたようです.
それで,話を勝手にふくらませてprivateがうんぬんとか考えていたようです.
>>461みたいなことをやっていました,orz
とりあえずプログラムは動きましたが,
頭は夏休みらしいので逝ってきます...




468 :デフォルトの名無しさん:04/08/04 00:55
for (int counter=0; counter<count_end; counter++) {
 try {
  func_throws_exceptions();
 } catch (std::exception&) {
  operations(counter);
 }
}

try {} catch() {} のオーバーヘッドの所為で上が非常に重いので、

int counter=0;
try {
loop_top:
 for (; counter<count_end; counter++) {
  func_throws_exceptions();
 }
} catch (std::exception&) {
 operations(counter);
 if (++counter != count_end) {
  goto loop_top;
 }
}

こうしたのですが、もっとスマートな書き方ないでしょうか?

469 :デフォルトの名無しさん:04/08/04 01:08
gotoって好きだなぁ。

470 :デフォルトの名無しさん:04/08/04 01:11
>>468
なんか目眩がするコードだな
例外が出た時点でオーバーヘッドなんて言葉はでないと思うんだが
例外処理は例外に使いなされ…

471 :デフォルトの名無しさん:04/08/04 01:24
>>468
func_throws_exceptions()が投げる例外オブジェクトに
counterの値を記録すればすむんじゃ?

472 :デフォルトの名無しさん:04/08/04 01:26
↑そういう問題じゃないんだな。
>>470が正しい。

473 :デフォルトの名無しさん:04/08/04 01:30
自演乙

474 :デフォルトの名無しさん:04/08/04 02:00
>>470
throwが重いのではなく、try/catchが重いから困ってるんですよ。
20万ファイル位あるディレクトリでファイルの情報を取得する処理なんですが、
スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。

ループの中にtry/catchを入れると遅くなるのを回避したいのです。

475 :デフォルトの名無しさん:04/08/04 02:02
>>468
これって例外オブジェクト開放されんの?

476 :468=474:04/08/04 02:04
>例外処理は例外に使いなされ…

の意味がいまいちわかんないのですが、
もしかして func_throws_exceptions のところで、
自分で if (hogehoge) throw exception; とかやってると思ってます?

472さんとかが理解してるような書き込みしてますが、
よければその辺ちょっと教えてもらえないでしょうか。

477 :デフォルトの名無しさん:04/08/04 02:10
>>474
> スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。

本気か?例外を通常処理の分岐に使ってる時点で駄目
煽りじゃないぞ

478 :デフォルトの名無しさん:04/08/04 02:16
例外というのは例外的な処理を行うためのシステムなので、多用して重いと文句つけるのはアレだ。
ということでしょ。めったに起きない珍しい事態になんで効率を云々するんだと

479 :デフォルトの名無しさん:04/08/04 02:20
>>477
アクセス権が無いのも例外でない
ファイルが存在しないのも例外でない
何らかの障害によって開けないのも例外でない

例外って突き詰めてしまえば条件分岐なわけで
その言い分だと例外を使う事自体あってはならない事にならない?


480 :475:04/08/04 02:21
駄目だここアフォしかいない

481 :468=474:04/08/04 02:27
>>487 めったに起きない珍しい事態になんで効率を云々するんだと

それは関係ないと思います、実際に例外が発生しなくても
ループ内に try/catch が紛れ込んでいるだけで重くなるから悩んでるんです。
例外が発生したときだけ重くなるのなら、何も問題はありません。


482 :475:04/08/04 02:28
tryで囲んだ時点で入り口と出口でコードが生成されるので重くなって当たり前。
でもIOの方が重いだろ多分。

483 :デフォルトの名無しさん:04/08/04 02:33
速度を求めるなら例外を使わない関数を使うっていうのは、
質問者の意図とちょっと違うでしょ。
嫌でも例外を使わされちゃう場面はあるわけで。

とりあえず、tryが結構いろいろやってることを知らない人はこれでも読んでください。
http://www.codeproject.com/cpp/exceptionhandler.asp

484 :475:04/08/04 02:50
とりあえず例外あんま吐かないならこう書き直せ。
>>468の下じゃ例外オブジェクトのデストラクタとかが走らないから。

void enumfunc(int countstart, int countend)
{
for (int counter=start; counter<count_end; ++counter)
  func_throws_exceptions();

}

int counter = 0;

while(counter<count_end)
{
 try
 {
   enumfunc(counter, countend)
 } catch (std::exception&) {
   operations(counter);
   ++counter;
 }
}


485 :デフォルトの名無しさん:04/08/04 03:19
速度を求めるなら別の手段を考えるのは当然。
この場合ファイルの有無をチェックして、func_throws_exceptionsがフラグ返すだけでいいしな。

そもそも例外処理なんてのが作られた経緯を考えれば、
>>479みたいなアフォな意見はでないんだがなぁ。

>>484
おいおい、それじゃ例外が出たあとの処理が468の意図と違うだろ。
まぁ例外が出た時点で諦めろって感じだがな。

486 :485:04/08/04 03:21
おっとすまん、読み違えてた。読みづらいなぁと言い訳。

487 :デフォルトの名無しさん:04/08/04 03:23
catchブロックから抜けたらデストラクタは呼ばれるんじゃないの?
コンパイラ依存?
と思って実験してみたら、vc++6ではcatchからtry内に飛べて、デストラクタが呼ばれるが、
vc++7.1では飛べねーよってことでコンパイルが通らない。

下のページの2を見ると、ANSI仕様では、飛べないのが正しいらしい。
http://www.codeproject.com/cpp/ANSI-cpp-dec96/except.asp


488 :デフォルトの名無しさん:04/08/04 03:23
>>485
有無だけでいいのか?

489 :デフォルトの名無しさん:04/08/04 03:31
485はnewが例外を投げるのすら許せないんだろうな。
たとえば.NETのFileStreamクラスとかでも例外投げてるんだし、
クラス製作者の分析センスに依存するというだけの問題だろう。

アフォとか読みづらいとか、人を貶す言葉しか出てないけど
いわゆる見下し厨というやつなのだろうか。


490 :デフォルトの名無しさん:04/08/04 03:36
まあ、現実的な解は、
try内にforを置いて、
for内で、例外が発生しそうか、ある程度チェックして、
そうならcontinue、そうじゃなくて例外が発生しちゃったら、
異常事態扱いであぼーんってな感じじゃないかと。

491 :デフォルトの名無しさん:04/08/04 03:42
例外で悩んでいると言う質問があれば、とりあえず
例外を分岐に使うなと煽るのはテンプレみたいなもんだ。

492 :デフォルトの名無しさん:04/08/04 03:52
しかしム板見てると自分がいかにレベル低いかが分かるよ・・・
大学のプログラムなんて研究用だからCでアルゴリズムばっかりだし、趣味でやってると細かいこと気にしないから上達しないし。
どうにかスキルアップしたいもんだ。

493 :470:04/08/04 03:53
すごいスレが進んでるね、意外に支持派が多いのにびっくり

>>476
例外処理はやっぱりエラー処理を別に記述して
可読性を高めるのが本意だと思うよ、という意味ですよ>例外処理は例外に
この場合は特に横着してるだけだし、可読性最悪だしね

エラーってのは出た時点でそれまでの処理を全て中止するくらいの意味を持つと思うのね

おいらも説教厨とかいわれそうなので、薦めないけど一応ひとつ出しておくよ
20万ファイルじゃちと怖いけど

void func( int counter=0 ){
 try{
  for ( ; counter < count_end; ++counter )
   func_throws_exceptions();
 } catch (std::exception&){
  operations(counter);
  func( counter+1 );
 }
}

-----
func()

494 :デフォルトの名無しさん:04/08/04 03:54
>20万ファイル位あるディレクトリでファイルの情報を取得する処理なんですが、
>スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。
statとかの例外投げないの直接呼べば?

495 :デフォルトの名無しさん:04/08/04 04:00
>>493
お見事!

496 :デフォルトの名無しさん:04/08/04 04:02
例外ってださいな

497 :デフォルトの名無しさん:04/08/04 04:04
470が横着せずに、493のレスを470の時点でしていれば荒れなかったなw

498 :デフォルトの名無しさん:04/08/04 04:12
スタックオ(ry

499 :デフォルトの名無しさん:04/08/04 04:33
今回の例とは違うだろけどロガーなんかの場合はエラーが
出たらそれを通知して続行するべきで処理を中断するわけにはいかないだろ。


500 :デフォルトの名無しさん:04/08/04 07:52
どう見ても問題は
func_throws_exceptionsでoperationsのコンボの仕様だろ?

501 :main.cpp:04/08/04 08:56
#include <exception>
#include <iostream>
#include "boost/timer.hpp"
void func_throws_exception();
void operation(int);
void try_in_loop(int counter_end)
{
  for (int counter = 0; counter < counter_end; ++counter)
  {
    try { func_throws_exception(); }
    catch (std::exception const& e) { operation(counter); }
  }
}
void try_outof_loop(int counter_end)
{
  int counter = 0;
CONTINUE:
  try { for (; counter < counter_end; ++counter) func_throws_exception(); }
  catch (std::exception const& e) { operation(counter); goto CONTINUE; }
}
int main()
{
  int const counter_end = 1000 * 1000 * 1000;
  boost::timer t;
  t.restart(); try_in_loop(counter_end); double const in_loop = t.elapsed();
  t.restart(); try_outof_loop(counter_end); double const outof_loop = t.elapsed();
  std::cout
    << "try_in_loop : " << in_loop << '\n'
    << "try_outof_loop: " << outof_loop << std::endl;
  return 0;
}

502 :sub.cpp:04/08/04 08:56
void func_throws_exception(){}
void operation(int){}

503 :g++ (GCC) 3.3.1 (cygming special):04/08/04 09:01
$ g++ -O3 main.cpp sub.cpp && ./a.exe
try_in_loop : 20.329
try_outof_loop: 21.04

504 :デフォルトの名無しさん:04/08/04 09:03
>>493だとスタックが死ぬので>>484がお勧め
>>501は論外

505 :デフォルトの名無しさん:04/08/04 09:05
>>504
再帰は遅いしね

506 :501-503:04/08/04 09:07
gccならtryのオーバーヘッドはほとんど除去できている模様。
>>468が実測無しで「try {} catch() {} のオーバーヘッドの所為で」と言っている可能性もある。

507 :501-504:04/08/04 09:08
>>504
あれ?もしかして、なんか処理間違ってる?

508 :デフォルトの名無しさん:04/08/04 09:09
>>506
gccならって時点で本題から外れてるじゃん。
try,catchのプロローグコードとエピローグコードが重い事を前提に議論してるんだし。

509 :501:04/08/04 09:19
あ、カウンタが進んでないな。 goto の前に ++counter; を入れないと処理が違う。

>>508
重い処理系での計測結果きぼん。

510 :デフォルトの名無しさん:04/08/04 09:37
Borland C++ 5.6.4(BCB6)
bcc32 -O2
try_in_loop : 31.55
try_outof_loop: 14.62

511 :デフォルトの名無しさん:04/08/04 09:40
少なくともC++では、例外に関しては実行速度は全く考慮されていないからなあ。

512 :デフォルトの名無しさん:04/08/04 09:47
>>510
もっと重い処理系も多そうだね

513 :デフォルトの名無しさん:04/08/04 09:49
VC++7.1
cl -O2
try_in_loop : 0
try_outof_loop: 0

やっぱVC++の最適化は格が違うね

514 :デフォルトの名無しさん:04/08/04 09:59
>>513
別ファイルに分けても消されるのか?すげえな。

sub.cpp を以下に変更して追試してみてほしい。
volatile int n;
void func_throws_exception(){++n;}
void operation(int){n=0;}


515 :デフォルトの名無しさん:04/08/04 10:08
>>514
それじゃ throw() と解釈されるかもしれないから、
void func_throws_exception(){++n;if(n<0)throw n;}
くらい入れといたほうがいいかも。

516 :デフォルトの名無しさん:04/08/04 10:08
>>514
try_in_loop : 0.43
try_outof_loop: 0.441

517 :515:04/08/04 10:10
catch(std::exception const&) だから、throw std::exception() にしないといけないな。

518 :デフォルトの名無しさん:04/08/04 10:19
VC++7.1
cl -O2 -GX
一応さっきのも-GXは全部付けてるんで

try_in_loop : 13.669
try_outof_loop: 14.751
try_outof_loop2: 8.597

void func_throws_exception()
{
static int i=0;
if(++i % 4096 == 0)
throw std::exception();
}

void try_outof_loop2(int counter_end)
{
int counter = 0;
while(counter < counter_end)
{
try { for (; counter < counter_end; ++counter) func_throws_exception(); }
catch (std::exception const& e) { operation(counter); ++counter; }
}
}

519 :デフォルトの名無しさん:04/08/04 11:25
>>518
その try_outof_loop2 を参考にして、以下のようなものを思いついた。
void loop_in_try(int counter_end)
{
  for (int counter = 0; counter < counter_end; ++counter)
  {
    // ループ内での try によるオーバーヘッドを軽減するため、 try の中でも同じ条件でループします
    try { do func_throws_exception(); while (++counter < counter_end); break; }
    catch (std::exception const& e) { operation(counter); }
  }
}

オリジナル(try_in_loop)からの変更箇所も少なく、見た目のキモさをフォローするコメント付き。
>>468への答えとしてはこれが適切と思う。

520 :デフォルトの名無しさん:04/08/04 11:42
>>505
今回のケースだと>>484の方が遅いはず

521 :デフォルトの名無しさん:04/08/04 11:57
std::nth_element(vec.begin(), vec.begin(), vec.end(), HogeComparator());
最も条件に適合する要素を先頭に持ってくるコードですが、
これより良い方法はありますか?
あったら教えて下さい。

522 :デフォルトの名無しさん:04/08/04 12:01
何かを勘違いしちゃってるな

523 :デフォルトの名無しさん:04/08/04 12:12
とりあえず
std::partial_sort(vec.begin(), vec.begin(), vec.end(), HogeComparator());
よりはnth_elementの方が速いと思うのですが。
先頭に来て欲しい要素が1個なので結果は同じですよね?

524 :デフォルトの名無しさん:04/08/04 12:49
>>523
定義だと、nth番目を境に[first,nth)のどの要素も[nth,last)より小さくなるように並び替えるってことなので、
vec.begin(), vec.begin() はダメでしょう(特定の実装でどうなってるかは知りません)。

サイズが1以上かどうかを確かめた上で、
std::nth_element(vec.begin(), vec.begin()+1, vec.end(), HogeComparator());
の方が良いと思う。

525 :524:04/08/04 12:50
あ、ごめん。ダメじゃないかも。

526 :デフォルトの名無しさん:04/08/04 13:21
>>489
まじかよ。
MFCのCFileでファイルクラスの例外スローに苦しめられた経験があるもんで、
.NETでも例外スローするってのは正直ひくね。
ファイル操作のような、アプリ依存の分岐処理が必須になる分野に
例外機構が向いているかどうか疑問だ。

527 :デフォルトの名無しさん:04/08/04 13:26
>>405
gotoもそうだし、ダウンキャストしまくりでびびったよ
ゲームだからいいのかね

528 :デフォルトの名無しさん:04/08/04 13:38
C++の落とし穴とは、普通はどういう物を指しますか?
オブジェクトコピーによってデストラクタが二度呼び出されたり、
ポインタ位置破壊を行ってしまうような事を指すんでしょうか?

529 :デフォルトの名無しさん:04/08/04 13:48
>>521
std::swap(*std::max_element(vec.begin(), vec.end(), HogeComparator()), vec.front());
ではどう?

530 :デフォルトの名無しさん:04/08/04 14:17
>>527
ハンガリアンも使いまくり

531 :デフォルトの名無しさん:04/08/04 14:24
>>526
へぇ。

私の場合、標準の fstream 関係がデフォルトでは例外を投げないことの方が気持ち悪いです。
ファイル関連こそ、例外を使った方が楽だと思うんだけど。

532 :デフォルトの名無しさん:04/08/04 14:42
>>527
ゲームとか関係ないかと…
単にスタイルの問題?

533 :デフォルトの名無しさん:04/08/04 14:50
>527
やる着なかったんだよ.

534 :デフォルトの名無しさん:04/08/04 15:44
>>532
ゲーム > 速度重視 > 実行時型チェックなんかしてられるか(ノ `Д´)ノ ミ _I___I_
じゃない?

535 :デフォルトの名無しさん:04/08/04 15:46
C++を基礎から勉強しています。
質問なのですが、
http://wisdom.sakura.ne.jp/programming/cpp/cpp12.html
このページにある"オブジェクトを返す"のサンプルでは、関数内で定義した
オブジェクトを関数の返り値として返しています。
これは、
http://www.cmagazine.jp/src/kinjite/c/variable.html#index17
【自動変数をポイントして,それを関数の戻り値にする】
に該当するのではないでしょうか?これはC++ではやっても良い事なのですか?
よろしくお願いします。

536 :デフォルトの名無しさん:04/08/04 15:47
>>531
釣り?

自分のエラー処理(任意)とクラス例外処理(強制)で2度手間。
ファイルの例外を楽と思うヤシの気が知れんね。経験浅いの?

537 :535:04/08/04 15:50
関数内で定義→関数内で宣言、でした。

538 :デフォルトの名無しさん:04/08/04 15:52
>>534
でも dynamic_cast は…

ひょっとしたら、HDR がどうとか、そういうアルゴリズムを他の事に
気が紛らわされることなく理解してもらためにやってるのかも…

539 :デフォルトの名無しさん:04/08/04 15:53
>>535
> 戻り値として生成したオブジェクトの複製を返して終了します
複製を返しているので
>【自動変数をポイントして,それを関数の戻り値にする】
には当たりません.該当するのは以下のような場合です.
Kitty *getKitty(char *str) {
Kitty *obj (new Kitty ());
obj->str = str;
return obj;
}


540 :539:04/08/04 15:55
>>539
ボケけてた.該当するのは,
Kitty *getKitty(char *str) {
Kitty obj Kitty ())
obj.str = str;
return &obj;
}
です.


541 :デフォルトの名無しさん:04/08/04 15:55
>>530
つーか元祖ハンガリアン勤務先なので ドゾー( ´∀`)つ

542 :デフォルトの名無しさん:04/08/04 15:55
>>535
int func()
{
int a = 1;
return a;
}

と同じこと。
戻り値として返されるのは関数内の自動変数をコピーしたもの。

543 :デフォルトの名無しさん:04/08/04 15:56
ローカルの参照やポインタを返すなってことさ

544 :デフォルトの名無しさん:04/08/04 15:57
>>535
C-Magazineが間違っているだけ。

545 :539:04/08/04 15:57
何度もすんません.540は
- Kitty obj Kitty ())
+ Kitty obj;
に訂正致します.


546 :デフォルトの名無しさん:04/08/04 16:05
どうでもいいけど>>535のリンク先
while(NULL != thePtr){
ってやってる。宗教健在かぁ。

547 :デフォルトの名無しさん:04/08/04 16:06
害の無い宗教は放置。

548 :535:04/08/04 16:11
解説ありがとうございます。return時に指定された変数(や定数)を
スタックにコピーした上でretするということなのでしょうか。
何にしてもC・C++に関係なく自分が勘違いしていたようです。
-S出力したりしてもう少し勉強しようと思います。

549 :デフォルトの名無しさん:04/08/04 16:11
>>547
見難いだろ。

550 :デフォルトの名無しさん:04/08/04 16:11
>>547
その通り。
変数・定数の頭文字を大文字にされた日にゃ、困るけど。

551 :デフォルトの名無しさん:04/08/04 16:17
>>536
うーん。経験浅いのかも。計算系が主だし。
自分のエラー処理とクラスの例外処理を「まとめて」扱えるから楽かなと思って。

今は、

std::ifstream ifs(filename);
if (!ifs)
  throw Hoge();

とかやってる。そうすると catch を一カ所にまとめてかけて楽だし。
ヘボい?どうやるのがかっこいいのかな?


552 :デフォルトの名無しさん:04/08/04 16:30
>>551
自分の投げたいときだけ投げるわけじゃねーだろ、ライブラリの例外クラス。
お前の書いたサンプルは、任意使用の例外処理だろが。
経験が浅いだけでなく、日本語も不自由なのか?

553 :デフォルトの名無しさん:04/08/04 16:35
>>552
>>551は強制処理の例外をstd::ifstreamが投げないから仕方無く任意処理の例外を書いてるんじゃないのか?

554 :553:04/08/04 16:35
任意処理->任意使用

555 :デフォルトの名無しさん:04/08/04 16:40
>>553
自分でthrowしている時点で、論点が違うでしょ。
今問題にしているのは、クラス内部から勝手にthrowするファイルクラスの利便性について。

556 :デフォルトの名無しさん:04/08/04 16:51
>>552
ごめん。日本語が不自由なのは認めるけど、言いたいのは >>553 がフォローしてくれた通り。
「クラス内部から勝手に」ってのが、よくわからないけど……。
普通、例外ってメソッドから勝手に投げられてくるものじゃないの?

557 :デフォルトの名無しさん:04/08/04 17:00
おまいらー。はなしがかみあってないぞー。

558 :デフォルトの名無しさん:04/08/04 17:10
>>556
とりあえず、メソッドから直接投げられると困ることがあるってことに気付けよ。

計算系って、大学か?
どうせ、exit()乱用するアフォプログラム書いてんだろ?

559 :デフォルトの名無しさん:04/08/04 17:12
>メソッドから直接投げられると困る
std::bad_alloc投げない化石コンパイラでも使ってて下さい

560 :デフォルトの名無しさん:04/08/04 17:15
>>558
そのための例外だろ?

561 :531=551=556:04/08/04 17:23
>>556

え?すみません。全然わからなくなってしまいました。

「メソッドから直接投げられると困ることがある」ことに、どうしても気づけません。
私の主張(というほどじゃないけど)「メソッドから直接例外を投げてくれないと面倒くさい。」です。

556さんじゃなくても構いませんので、556さんがどういうことを言いたいのか解説してもらえませんか?
日本語不自由ですみません……orz

562 :デフォルトの名無しさん:04/08/04 17:24
>>561
すみません。556は自分でした。558さんですね。

563 :デフォルトの名無しさん:04/08/04 17:25
例外処理に関して知った風なこと言ってるヤシ、
「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。
完全に自己満足の世界といっていい。

他人に使われることを想定してクラスを作ったら、
クラス内部からスローするような仕様は下の下だということに気付けるはずだ。

564 :デフォルトの名無しさん:04/08/04 17:26
>>563
俺も、こいつが何を言いたいのかさっぱりわからん。
newを使うな、ってことを言いたいのか?

565 :デフォルトの名無しさん:04/08/04 17:28
C++ で new を使わないのはある意味尊敬するなw

566 :デフォルトの名無しさん:04/08/04 17:29
>>563
主張は分かったから、良かったら根拠を挙げて紅か?

567 :デフォルトの名無しさん:04/08/04 17:29
>>563

568 :デフォルトの名無しさん:04/08/04 17:29
関数から例外を投げないほうがいいと言っている人は
ライブラリは戻り値でエラーかどうかを毎回返したほうが良い
と言っているのですか?

569 :デフォルトの名無しさん:04/08/04 17:30
newどころかSTL全般が駄目なのでは。

570 :デフォルトの名無しさん:04/08/04 17:30
何のためのC++なんだろうな(w

571 :デフォルトの名無しさん:04/08/04 17:31
>>563
心から同意
誰か意地になってるやつがいるだけの気がする

実際は作るときより、使うとき困るんだがな

572 :デフォルトの名無しさん:04/08/04 17:31
昔の人は偉いよね。例外なんかなくてもちゃんと作ってたんだから。
今同じことしようとするとめんどくさくて仕方ない。

573 :デフォルトの名無しさん:04/08/04 17:31
つーかクラス内部ってどこだよ。

574 :デフォルトの名無しさん:04/08/04 17:32
>>563はきっと大域newオーバーロードしてあるし、
STLは全部自分で書いてる。

575 :デフォルトの名無しさん:04/08/04 17:33
いくらなんでも一気にこれだけレスが憑くのはありえないな…

576 :デフォルトの名無しさん:04/08/04 17:33
563 == 571 ?

どっちでもいいから
早 く 具 体 例 を 挙 げ ろ

577 :デフォルトの名無しさん:04/08/04 17:33
発生したエラーが致命的かどうか判断するのは、
クラス利用者であってクラス作成者ではない。

クラスに例外処理を実装して得意気になる馬鹿はPGをやめた方がいい。

578 :デフォルトの名無しさん:04/08/04 17:34
>>563は例外安全

579 :デフォルトの名無しさん:04/08/04 17:34
>>577
是非C++標準委員会のSTL策定したメンバーの方々のメールでも送りつけて下さい

580 :デフォルトの名無しさん:04/08/04 17:35
>>563はthrow()の男

581 :デフォルトの名無しさん:04/08/04 17:36
564から自演の嵐

582 :デフォルトの名無しさん:04/08/04 17:38
例外投げられても、それが致命的じゃないなら
catchして処理して正常系に戻ればいいのではないのか?

583 :デフォルトの名無しさん:04/08/04 17:38
>>563はtry,catch構文の書き方が分からない

584 :デフォルトの名無しさん:04/08/04 17:39
>>577
別に致命的じゃなくても例外投げて良いと思うぞ。
要は、処理を続行できない事態が発生した時に投げれば良い。

致命的かどうか判断するのは>>577の言うように利用者だから、
tryの位置やcatchの内容にそれを反映させる。

585 :デフォルトの名無しさん:04/08/04 17:40
>>563の戻り値はいつもint

586 :デフォルトの名無しさん:04/08/04 17:41
>>563はGetLastErrorマニア

587 :デフォルトの名無しさん:04/08/04 17:42
自演もうざいが、煽りもうざい。
議論に参加しない奴は黙ってろ。

588 :デフォルトの名無しさん:04/08/04 17:43
低レベルすぎるのでageときますね

589 :デフォルトの名無しさん:04/08/04 17:44
>>563さんがどうやってエラーを返してるのか知りたいです。
やっぱ返り値は全部intかenumですか?
それともエラーの時はNULLとか返してGetLastError機構を用意するのですか?

590 :デフォルトの名無しさん:04/08/04 17:45
スレ立てて他でやれ

>>587
煽りが自演だろ

591 :デフォルトの名無しさん:04/08/04 17:47
>>589
は!ひょっとして >>563 の方が釣りなのか。そんな餌に...クマー

592 :デフォルトの名無しさん:04/08/04 17:47
>>576
とりあえず、MFCのCFileやCInternetSessionなどを使ってプログラムを組め。
CException系例外クラスをキャッチするプログラムだ。

サンプルを示したところで、それはちゃんと動くし動作確認されたものだ。
それでは煩雑さを説明したことにならない。わかるだろ?
MS様の作った仕様を逐一追いかける意味で、自力でサンプルプログラムを組め。
いかにクラスの例外スロー機構が煩わしいかが実体験できる。

593 :デフォルトの名無しさん:04/08/04 17:48
>>563==592さん
>>589

594 :デフォルトの名無しさん:04/08/04 17:50
どう煩わしくなったかは教えてくれないのね。

595 :デフォルトの名無しさん:04/08/04 17:50
>>591
気づいてしまったね。うまくやられたっぽいよね。

596 :デフォルトの名無しさん:04/08/04 17:51
>>563さんは自分でクラス書いた事無いんですか?

597 :デフォルトの名無しさん:04/08/04 17:52
>>584
>tryの位置やcatchの内容にそれを反映させる。

多くの場合、スコープがcatchに移動していて、エラーの原因となったデータは消滅している。
エラー番号が判る程度では、役不足だった経験はあるだろ?

598 :デフォルトの名無しさん:04/08/04 17:52
例外禁止だとRAIIが達成できないな。
無効状態のオブジェクトを作りたくないときどーすんだ?

599 :デフォルトの名無しさん:04/08/04 17:54
>>563==597さん
例外ならエラー番号以上の事が分かりますよ。

600 :デフォルトの名無しさん:04/08/04 17:54
このスレは以後>>597の役不足につっこむスレとなります

601 :デフォルトの名無しさん:04/08/04 17:54
一体何人が>>563を演じているんだ

602 :デフォルトの名無しさん:04/08/04 17:56
>>601
563は一人だろ
粘着が自演

603 :デフォルトの名無しさん:04/08/04 17:58
>>563は結局何が言いたいのか分からないのですが。
結局tryとかcatch書くのが面倒なだけなんですか?

604 :デフォルトの名無しさん:04/08/04 17:59
>>597
消滅させるかどうか選ぶのはtry/catchを書いたプログラマ自身じゃないか?
投げられた例外について多くを知りたければ
呼び出しの深いところで(throwに近いところで)catchすればいい。

605 :デフォルトの名無しさん:04/08/04 18:00
>>599
サンプルを示して。

606 :デフォルトの名無しさん:04/08/04 18:00
例外はエラー以外には使うな、という考えでもないんだよな。
主張がよくわかんね。

607 :デフォルトの名無しさん:04/08/04 18:00
>>597
そのために例外クラスを作るんじゃないの?
自作クラスでは、全部 exception とか投げてるから
そーいうことで困るんだとおもうよ。

608 :デフォルトの名無しさん:04/08/04 18:00
>>605
std::exception

と、563のまねをしてみるテスト。

609 :デフォルトの名無しさん:04/08/04 18:00
>>563は例外クラスを定義しているライブラリは使いません。
IndyとかMFCとかSTLとかboostとか。

610 :デフォルトの名無しさん:04/08/04 18:01
例外が駄目だということなのですが、
どうするのが良いスタイルなのかを示してくれたほうが嬉しいです。
自分が提供するライブラリクラスで例外使用を禁じられた場合
1. 関数からintやenumの戻り値を返す。
2. エラー情報格納部を用意してGetLastErrorのようなことをする。
のような解決を試みると思います。
1や2のようにしているのか、それとももっと良い方法なのか
示していただけ無いでしょうか。


611 :デフォルトの名無しさん:04/08/04 18:02
>>605
サンプルも何も、
例外クラス定義してエラー番号以上の情報を入れるだけなんですけど…

612 :デフォルトの名無しさん:04/08/04 18:03
>>604
信者の詭弁ですよ。

×呼び出しの深いところで(throwに近いところで)catchすればいい。
○呼び出しの深いところで(throwに近いところで)catchしなければならない。

613 :デフォルトの名無しさん:04/08/04 18:03
もういいんじゃない。
>>563は例外クラスが分かってないでFAで。
スレの無駄。

614 :デフォルトの名無しさん:04/08/04 18:03
>>604
恐らくライブラリ関数内で作られたようなオブジェクトの情報を
取得できないことを指摘しているのだと思う。

ライブラリ作成者側が気を使ってくれるなら、
例外クラスの中にその情報を入れてくれるんだけどね。

615 :デフォルトの名無しさん:04/08/04 18:05
>ライブラリ関数内で作られたようなオブジェクトの情報を取得
良く意味分からないんですけど、例外じゃくて戻り値ベースだと
それが分かるんですか?
そもそもライブラリ関数内で作られたようなオブジェクトの情報を取得するのは
カプセル化と相反していませんか?

616 :デフォルトの名無しさん:04/08/04 18:05
ちょっと相互リンクしておきますね。
http://pc5.2ch.net/test/read.cgi/tech/1068302657/

617 :デフォルトの名無しさん:04/08/04 18:06
>>563はここで勉強してきたら?
例外処理exception, runtime_errorの使い方
http://pc5.2ch.net/test/read.cgi/tech/1051690231/

618 :デフォルトの名無しさん:04/08/04 18:08
>>617
そこの8=468

619 :デフォルトの名無しさん:04/08/04 18:08
>>563のようなバカにエラー処理を強制させる意味でも例外を使うべきだ。
>>563は戻り値ベースだったら戻り値なんてチェックしないだろう。間違いない。
もっとも>>563のようなヴァカは全部tryで囲んでcatch(...){}で終わりだろうけど。

620 :デフォルトの名無しさん:04/08/04 18:09
>>615
いや、俺も例外推奨派なので、戻り値ベースだとできるとか
そういう意味の発言はしていないよ。>>614にもそうは書いてないよね。
必要な情報を入れてくれていない「例外を投げる側の不備」が
あることもあるよねって話。

ライブラリ関数内で一時的に生成されて
関数内で一生を終えるような情報を例外クラスに入れて投げるのって
カプセル化に反するの?別にメンバ変数の内容を公開するわけじゃないよ。

621 :デフォルトの名無しさん:04/08/04 18:12
>>610
それで十分。

622 :デフォルトの名無しさん:04/08/04 18:15
>>619
逆だな。
戻り値を厳密にチェックしてエラー時の処理を細かく制御したい場合、強制スローは迷惑。

623 :デフォルトの名無しさん:04/08/04 18:16
>>621
なるほど。じゃぁ何かするたびにif文でその処理が成功したかどうかを
逐一チェックしろと言われているのですね。了解。

624 :デフォルトの名無しさん:04/08/04 18:17
>>620
いまいち何が言いたいのか分かりませんが、
ライブラリ作成者側はエラーの詳細を伝えるべきではありますが、
内部で使うオブジェクトの詳細を与えるべきだとは思えません。
本来利用者側かでは知る必要がない、
内部で使うローカルオブジェクトの実装の詳細を知る必要が出てくるので。

625 :デフォルトの名無しさん:04/08/04 18:18
>>624
オブジェクトの詳細じゃなくて、エラーや例外の詳細だと思う。

626 :デフォルトの名無しさん:04/08/04 18:19
>>622
(゚Д゚)ハァ?
例外クラスは一種類だけではありませんし、
例外クラスの中にも情報を入れる事が出来るのですよ。

627 :デフォルトの名無しさん:04/08/04 18:21
アンチを相手にするのは時間の無駄だろ。
アホを啓蒙してやりたいって事なら話は別だが。

628 :デフォルトの名無しさん:04/08/04 18:21
つーかさ、何で話がすり変わってるの?
MFCが吐くCFileのExceptionクラスとやらは詳しい情報吐いてくれないのかも知れないけど、
自分で例外クラス作ればいくらでも詳しい情報書けるぜ。
それなのに自分でクラス書く時に例外吐くなとはどういう事よ?
>>563出てこいよコラ

629 :デフォルトの名無しさん:04/08/04 18:23
ぶっちゃけ、このスレには何人いるんだろうか。

630 :デフォルトの名無しさん:04/08/04 18:23
とりあえず初めの>>563はもういない気がする。
己の無知に気づいて。

631 :デフォルトの名無しさん:04/08/04 18:25
>>623
逐一チェックしろ。
いざ、エラー発生位置などのダンプ情報が欲しくなった時、
手に負えないのが、クラスの例外スロー。

632 :デフォルトの名無しさん:04/08/04 18:25
そんな事より人に使わせるクラスに
例外仕様も書かない輩が嫌いだ。

633 :デフォルトの名無しさん:04/08/04 18:26
>>563は正しいでしょ。
マジで馬鹿だよ、クラスから例外吐くヤシ。

634 :デフォルトの名無しさん:04/08/04 18:26
>>631
エラー発生位置を例外クラスに詰める事も出来るし、
そもそもデバッガってご存じ?

635 :デフォルトの名無しさん:04/08/04 18:27
>>632
>>580

636 :デフォルトの名無しさん:04/08/04 18:27
議論云々の前に例外を知らなすぎる

637 :612:04/08/04 18:28
>>628
信者の詭弁ですよ。

×自分で例外クラス作ればいくらでも詳しい情報書けるぜ。
○自分で例外クラス作らないと詳しい情報書けないぜ。

638 :デフォルトの名無しさん:04/08/04 18:29
>>624
こんな例を出すのが適当かどうかわから無いけど例を出す。
ある仕様のXMLファイルのストリームを受け取って、
必要な情報を返すようなライブラリ関数があったとしよう。
(ライブラリの実装としてはそのXML情報をDOMとして取り出して処理しているとする)

DOMツリー構築後、処理途中で与えられたXMLが仕様と合っていない
不備があったとして、どこが不備なのか返すために
Nodeオブジェクトを例外クラスに格納して返したいと思わない?
Nodeオブジェクトがあればどこが仕様に合っていなかったのか
すぐわかると思うけど。

これが無いと、ユーザにXMLのどこが間違っているか示してあげることも
できないんじゃないかな。

639 :デフォルトの名無しさん:04/08/04 18:30
>>637
そもそもstd::exceptionを直接吐く事の方が少ないと思うのですが、
詭弁ですか?そうですか。

640 :デフォルトの名無しさん:04/08/04 18:31
>>634は、クラス使用者に強要される制限が理解できていない。
>>634は、デバッガが動く環境でしか開発したことがない。

641 :デフォルトの名無しさん:04/08/04 18:32
>>638
そもそもそのライブラリを使うのに
Nodeオブジェクトの実装を知っている必要がある
(メソッドにNodeを渡したりメソッドからNodeが帰ってきたりする)
のであればそれは構わないのでは無いかと。

642 :デフォルトの名無しさん:04/08/04 18:32
例外を使う/使わないは純粋に記述量にしか影響しない。
多くの場合、戻り値主義で完璧にやろうとすると複雑さが許容範囲を越える。

643 :デフォルトの名無しさん:04/08/04 18:33
>>563が返す例外はいつもint

644 :デフォルトの名無しさん:04/08/04 18:33
>>618
ファイルのエラーはシーンチェンジと同列ってことですか

645 :デフォルトの名無しさん:04/08/04 18:34
.NET Framework クラス ライブラリ
FileStream コンストラクタ (String, FileMode, FileAccess)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemiofilestreamclassctortopic4.asp

例外
例外の種類 条件
ArgumentNullException path が null 参照 (Visual Basic では Nothing) です。
ArgumentException path が空の文字列 ("") か、空白しか含んでいないか、無効な文字を 1 つ以上含んでいます。
FileNotFoundException ファイルが見つかりません。たとえば、 mode が FileMode.Truncate または FileMode.Open の場合に、 path で指定されたファイルが存在しません。これらのモードでは、ファイルが既に存在している必要があります。
IOException FileMode.CreateNew が指定されているのに、 path で指定したファイルが既に存在していることなどが原因で I/O エラーが発生しました。
SecurityException 呼び出し元に、必要なアクセス許可がありません。
DirectoryNotFoundException 割り当てられていないドライブであるなど、指定されたパスが無効です。
UnauthorizedAccessException access が Write または ReadWrite であるのに、ファイルまたはディレクトリが読み取り専用に設定されているなど、指定した path に対する access 要求がオペレーティング システムで許可されません。
PathTooLongException 指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。
ArgumentOutOfRangeException mode に無効な値が含まれています。


646 :デフォルトの名無しさん:04/08/04 18:35
>>640
>クラス使用者に強要される制限
で、それは何?

647 :デフォルトの名無しさん:04/08/04 18:35
>>645
そもそも.NETは純粋なC++では動きません。ManagedC++。

648 :デフォルトの名無しさん:04/08/04 18:36
>>563は神

649 :デフォルトの名無しさん:04/08/04 18:37
>>647
無知なお前らにまともなクラスライブラリの仕様を教えてやったんだよ。

650 :デフォルトの名無しさん:04/08/04 18:38
>>641
ライブラリ使用者側が知っている情報レベルのものなら
例外クラスに入れても良いという考え方だということか。納得できる。

じゃぁ、もしライブラリ使用者側がNodeオブジェクトについて
知らない場合、君ならどうやって例外情報を構築するのか示して欲しい。
俺としてはそれができるならそうしたいのだし。


651 :563:04/08/04 18:38
やっぱ、夏休みでノンプロが多いな・・・。

一応いっとくけど、漏れは例外処理そのものは肯定する。
特に、エンドPGが>>551のサンプルのように自分で自作クラスをスローするのは賛成だ。
糞なのはクラスの例外throw。支持する馬鹿、氏ね、マジで。

652 :デフォルトの名無しさん:04/08/04 18:38
何かさあ>>563の頭の中には何か意見があるんだろうけどさあ、
それを書いてくれないとこっちは分からないんだよね。
漏れは例外は嫌いだしか伝わってこないんだもん。
実生活でも話すの苦手なのかな?

653 :デフォルトの名無しさん:04/08/04 18:38
>>646
try節を書く必要がある、という制約 (プゲ

654 :デフォルトの名無しさん:04/08/04 18:39
>>647
例外を適用するコンテキストは言語には依存しないだろう。

655 :デフォルトの名無しさん:04/08/04 18:40
>>650
そういう場合はassertだろう。

656 :デフォルトの名無しさん:04/08/04 18:40
563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25
例外処理に関して知った風なこと言ってるヤシ、
「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。
完全に自己満足の世界といっていい。

他人に使われることを想定してクラスを作ったら、
クラス内部からスローするような仕様は下の下だということに気付けるはずだ。

563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25
例外処理に関して知った風なこと言ってるヤシ、
「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。
完全に自己満足の世界といっていい。

他人に使われることを想定してクラスを作ったら、
クラス内部からスローするような仕様は下の下だということに気付けるはずだ。

563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25
例外処理に関して知った風なこと言ってるヤシ、
「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。
完全に自己満足の世界といっていい。

他人に使われることを想定してクラスを作ったら、
クラス内部からスローするような仕様は下の下だということに気付けるはずだ。


657 :デフォルトの名無しさん:04/08/04 18:41
>>563

>他人に使われることを想定してクラスを作ったら、
>クラス内部からスローするような仕様は下の下だということに気付けるはずだ。

この部分はどう説明なさるのですか?

658 :デフォルトの名無しさん:04/08/04 18:43
>>651
それで結局どうして糞なんですか?

659 :563:04/08/04 18:43
>>652
一応PGを飯の種にしてるから、核心の部分はぼかさせてもらう。
例外が嫌いなのは悪い事じゃないと思う。
むしろ、C++の固有機能を必死に使おうとする馬鹿の方が困る。
エレガントに見えて追跡不能である場合が多い。

660 :デフォルトの名無しさん:04/08/04 18:44
>>659
>他人に使われることを想定してクラスを作ったら、
>クラス内部からスローするような仕様は下の下だということに気付けるはずだ。

どうしてクラス内部からスローするような仕様は下の下なんですか?
あなたの>>563の発言からして核心はそこだと思うのですが。

661 :デフォルトの名無しさん:04/08/04 18:45
核心を伝えよう。

この業界ではプロ==バカ

662 :デフォルトの名無しさん:04/08/04 18:45
>>651
お前やっぱりアホだろ。

自分で例外を投げても、そのコードを利用するクライアントから見たら、
クラス内で勝手に例外が発生してるんだよ。
現在のスコープより上位に投げないと言うのなら goto で十分だ。

それとも、まさか再利用される可能性の無いアプリケーション固有の
コードでのみ例外をしようして、人が触る可能性のあるコードでは
例外を送出しないとか言うのか?

馬鹿避けと例外安全を勘違いしまくってるだろ。

663 :デフォルトの名無しさん:04/08/04 18:45
あんまプロ、プロ言わんほうがいいな…

664 :デフォルトの名無しさん:04/08/04 18:45
>>659
そうだそうだ。563様は偉大なんだ。例外処理についての素晴らしい独自理論をお持ちなんだ。
その理論は門外不出なのに、私たちのためにちょっとだけ教えてくださったんだ。

例外設計を知らないわけじゃないんだぞ。

665 :デフォルトの名無しさん:04/08/04 18:46
>>661
マ板見ると良く分かるよな

666 :デフォルトの名無しさん:04/08/04 18:47
>>563 はマ板のあちこちに現れては、
バカな主張を行う人なのでスルーした方が吉です。

特徴
・言葉遣いが汚い。いきなり他人を「お前」よばわりする
・自分の主張を補強する事実は一切ださない
・抽象的な主張の論拠として、さらに抽象的な主張を持ち出す

頭が悪いだけで、悪意はなさそうなんだけど・・・・

667 :デフォルトの名無しさん:04/08/04 18:47
>>659
技術を共有する気の無い奴は二度と来ないでくれ。
馬鹿対策は実世界で個人的にやってくれ。

668 :デフォルトの名無しさん:04/08/04 18:48
>>662
>それとも、まさか再利用される可能性の無いアプリケーション固有の
>コードでのみ例外をしようして、人が触る可能性のあるコードでは
>例外を送出しないとか言うのか?

最善だと思うね。一切のオタク色を排除すればそうなる。


669 :デフォルトの名無しさん:04/08/04 18:48
流れはやいなー

670 :デフォルトの名無しさん:04/08/04 18:49
煽りがちと気持ち悪いくらい度が過ぎてるので、563の方がまともに見えてきたな

671 :デフォルトの名無しさん:04/08/04 18:49
盛り上がっているところ恐縮ですが、ifstream が例外を投げないという仕様は皆さんから見て自然なんですか?

672 :デフォルトの名無しさん:04/08/04 18:49
>>666 よく見てるな・・・

673 :デフォルトの名無しさん:04/08/04 18:51
C++が廃れた理由が良く分かるよ

674 :デフォルトの名無しさん:04/08/04 18:51
>>671
例外処理のあるまともな言語は全て投げてる。

675 :デフォルトの名無しさん:04/08/04 18:51
>>668
他人にも分かる言葉を使って欲しい。

676 :デフォルトの名無しさん:04/08/04 18:53
これはひどい・・・

677 :デフォルトの名無しさん:04/08/04 18:53
>>563はともかくとして、アレコレの API のエラー検出は結局戻り値チェックでやってるので、
API 含有率が高いプログラム書いてるときは例外使いたくなくなることもあるな。

でも「MFC (の CFile) がタコだから例外はダメ」って程度しか論拠を示されないんじゃ、
あまり納得いく論議ではないなぁ・・・MFC みたいにバカが使うライブラリは、例外とか
テンプレートとか使うべきじゃないっていうことなら同意できるけど。

678 :デフォルトの名無しさん:04/08/04 18:53
666=672

679 :デフォルトの名無しさん:04/08/04 18:55
STLはバカは使わないのか

680 :デフォルトの名無しさん:04/08/04 18:55
例外を投げないライブラリに例外を投げるラッパを書くのは手間だけで済むが、例外を投げるライブラリのパフォーマンス上のペナルティは回復しようが無い。
よって例外を投げないほうがまだマシ。

681 :デフォルトの名無しさん:04/08/04 18:55
>>678
そんな地味な自演を指摘されても(笑

682 :デフォルトの名無しさん:04/08/04 18:55
>>680
例外は滅多に起きないから例外って言うんですよ。

683 :デフォルトの名無しさん:04/08/04 18:56
>>680
Cとかアセンブラでも使ったら?
C++が廃れた理由が良く分かるよ。

684 :デフォルトの名無しさん:04/08/04 18:58
>>680みたいな事言う香具師に限って線形アルゴリズム乱用したりするんだよね。

685 :デフォルトの名無しさん:04/08/04 18:58
>>680
>例外を投げるライブラリのパフォーマンス上のペナルティ

それホント?
本当だとしても、例外がパフォーマンスに影響するような設計が悪いんじゃないの?

686 :デフォルトの名無しさん:04/08/04 18:59
>>680

80,20の法則って知ってる?


687 :デフォルトの名無しさん:04/08/04 18:59
内心basic_stringの例外クラスout_of_rangeとかウザイと思ってるヤシ、手挙げろ。
素晴しいとか思ってるのはC++ヲタだけじゃねーの?

688 :デフォルトの名無しさん:04/08/04 19:00
>>682
めったに投げなくても、投げられる可能性があるなら
とりあえず受けておくべきなのが例外ですよ。
で、受けるコードでもペナルティが発生するんです。

689 :デフォルトの名無しさん:04/08/04 19:00
>>680は完全に正しい。
C++で最高のパフォーマンスを引き出すコードを記述する場合には。

そして>>680は完全に間違い。
C++でパフォーマンスよりも生産性を重視した開発を行う場合には。

C++は特にいろんな前提条件があるんだから断定はできないだろ。
例外がいやならstd使うななってこった。少なくともその自由は与えられているはずだ。

690 :デフォルトの名無しさん:04/08/04 19:01
>>687
拾わなきゃいいんでない。拾わなきゃどのみち落ちるんだし。

691 :デフォルトの名無しさん:04/08/04 19:01
>>687
atなんか使わないから、しらん。

692 :デフォルトの名無しさん:04/08/04 19:02
>>688
それと、戻り値で返されたエラーをifで処理するのと、どっちがパフォーマンスに優れていると思っているのだ?

693 :デフォルトの名無しさん:04/08/04 19:03
>>692
そりゃifだよ。

694 :デフォルトの名無しさん:04/08/04 19:03
アメリカのForum回った後に、ここ来るとがっかりするな

695 :563:04/08/04 19:04
>>689
>例外がいやならstd使うななってこった。少なくともその自由は与えられているはずだ。

その自由さえ制限してしまうのが、クラスの例外スロー。
クラスの例外スローがお前らに何を与えてくれたというのだ?
不便な束縛だけだろう?目を覚ませよ、いい加減。

696 :デフォルトの名無しさん:04/08/04 19:04
>>695
例外が嫌なら例外吐くクラス使うなよ

697 :デフォルトの名無しさん:04/08/04 19:04
>>691
今調べたら、append等でもout_of_range投げるんだね。知らなかった。
確かにこれはちょっと余計かな。

698 :デフォルトの名無しさん:04/08/04 19:05
>>695
>その自由さえ制限してしまうのが、
して無いだろ。std使うなといっている。cstdio使っとけ。

699 :デフォルトの名無しさん:04/08/04 19:05
>>695
695の言ってる「クラスの例外スロー」の意味がわからないのは私だけ?

700 :デフォルトの名無しさん:04/08/04 19:06
>>695はC時代からのプロでもう年だから
どうしてもtry,catch構文が覚えられないだけなんだ。
そっとしておいてやれ。

701 :デフォルトの名無しさん:04/08/04 19:08
>>699
695 =563語の「クラス」ってのは、たぶんクラスライブラリのことを意味しているんだと思う。
ハードディスクのことを「ハード」っていう人、稀にいるみたいだし。

702 :デフォルトの名無しさん:04/08/04 19:08
>>563は過去に例外をcatchし忘れて
クリティカルなアプリが落ちてトラウマになっている。

703 :デフォルトの名無しさん:04/08/04 19:08
>>690
そりゃそうだけど、落ちるほどのことか?
個人的には、なにもせずに戻してもいいと思うね、この程度なら。
ま、派生クラスでオーバーライドすりゃいいんだけどさ。

704 :デフォルトの名無しさん:04/08/04 19:10
>>699
コンストラクタが投げる例外のことじゃないかと憶測

705 :デフォルトの名無しさん:04/08/04 19:10
まあ他人も使うクラスなら「例外吐くなら例外仕様くらい書けよ」というなら
同意だが、「例外吐くなよ」はどうかな。

706 :593:04/08/04 19:11
>>702
まあな。テスト段階での話だけどな。
苦い目にあったことのない日曜PGには、漏れの堅牢な哲学なぞわからんだろ。

707 :デフォルトの名無しさん:04/08/04 19:11
>>704
コンストラクタが例外吐かなかったら
構築に失敗した時どうするのだろう…
ああ、またGetLastErrorか(w

708 :デフォルトの名無しさん:04/08/04 19:12
>>593
具体例を提示できないならいい加減消えな

709 :デフォルトの名無しさん:04/08/04 19:13
例外の言語仕様は
Java>>>>>>>>>C++

710 :デフォルトの名無しさん:04/08/04 19:13
>>708
何の具体例?

711 :デフォルトの名無しさん:04/08/04 19:14
593はtry,catchも忘れるようなアフォ

712 :デフォルトの名無しさん:04/08/04 19:16
>>706
藻前は>>593じゃなくて>>563だろ。
自分の番号まで間違えるくらいだから
try,catchも忘れるんだな(w

713 :デフォルトの名無しさん:04/08/04 19:17
つーか>>563が無知なのは分かったから、
いい加減消えてくれないかな。

714 :593=706:04/08/04 19:17
名前は>>593じゃなくて、>>563

>>707
コンストラクタに色んなことをやらすのは、アフォ。
常識っしょ。

715 :デフォルトの名無しさん:04/08/04 19:18
以上プロ==バカの典型的な例でした。

716 :デフォルトの名無しさん:04/08/04 19:18
本日のNGワード:593
以上

717 :デフォルトの名無しさん:04/08/04 19:18
>>707
例外を吐くような処理はコンストラクタじゃなくて初期化用メンバ関数でやれ、とか書いてたのはCマガだっけか(w

718 :デフォルトの名無しさん:04/08/04 19:20
以下ExceptionalC++さえ呼んでない香具師は
例外に関する発言禁止。

719 :デフォルトの名無しさん:04/08/04 19:21
んじゃまずお前が呼んできてくれ

720 :563:04/08/04 19:21
>>712
>try,catchも忘れるんだな(w

漏れがtry,catchを実装しても、投げてくるブツが違ったらどうしようもない。
catch(...)でどうにかなるほど甘くない環境での話だ。

721 :デフォルトの名無しさん:04/08/04 19:22
>>720
>catch(...)でどうにかなるほど甘くない環境
すでにC++ではありませんね。スレ違いです。

722 :デフォルトの名無しさん:04/08/04 19:23
>>714
オブジェクトにいちいち初期化完了ステータスとかを持たせるのか?


723 :デフォルトの名無しさん:04/08/04 19:24
Init呼ばないとオブジェクトが動かないんじゃないの?(w

724 :デフォルトの名無しさん:04/08/04 19:24
つーか、catch(...)したらどうせ再throwするんだからcatch(...)で済む状況ってあるのか?

725 :デフォルトの名無しさん:04/08/04 19:25
720は戻り値チェックでも間違った比較をしまくってそうだな。

726 :デフォルトの名無しさん:04/08/04 19:27
main(){
 try {
  〜
 }
 catch(...) {
  〜
 }
}

回復可能か不能かは別として、とりあえずデバッグ時に
漏れたのキャッチするようにしておけば、キャッチ漏れには
すぐ気づくんじゃないか?

727 :デフォルトの名無しさん:04/08/04 19:27
catch(const std::exception&)でいいんじゃないの?
例外でintとかstring投げるのは>>563くらいだろ(w

728 :デフォルトの名無しさん:04/08/04 19:27
例外が出来た経緯とか、正しい答えがある風なエラそうなこと言っていた割には
誰一人とて納得させてないんだよな。

729 :デフォルトの名無しさん:04/08/04 19:29
>>563に釣られすぎ

730 :デフォルトの名無しさん:04/08/04 19:29
納得させてないんじゃなくて
頑なに納得しないんだよ。

731 :563:04/08/04 19:30
>>726
そこからが長かったりする。
進捗報告に1行で記述する項目であっても労力は雲泥の差だ。

732 :デフォルトの名無しさん:04/08/04 19:33
>>720
それはドキュメントの質が悪いんじゃない?
例えば CFile は CFileException 投げるって書かれてて、それはその通りなんだけど、
CSocketFile のドキュメントには何も書かれてないくせに、
でもコイツは CInvalidArgException 投げる、とか。

733 :デフォルトの名無しさん:04/08/04 19:33
>>731
>>727

734 :563:04/08/04 19:33
>>722
つまりステータスを持つなと?
iostream系はアフォと?

>>723
状況によっては正しい。
再利用のない、単純クラスしか使ったことがない>>723には理解できんだろうけどな。

735 :デフォルトの名無しさん:04/08/04 19:36
ここまで頑固だとそのうちクビになりそうだな

736 :デフォルトの名無しさん:04/08/04 19:37
>>734
初期化ステータスなんか持たせないで、NULLで十分じゃないか。
Initが悪なんて誰も言ってない。お前が常にInitを使うといってるだけだ。

コンストラクタでオブジェクトを構築しないみたいだからな。

737 :563:04/08/04 19:39
今日はこのスレ、とりわけレベルが低かった。
実用性無視の学者肌の輩が多かったせいか。

無知を相手にしててそこそこ楽しかった、ノシ

738 :デフォルトの名無しさん:04/08/04 19:39
以上典型的バカでした。

739 :デフォルトの名無しさん:04/08/04 19:40
170レス位釣れたな。良かったな。>>563

740 :デフォルトの名無しさん:04/08/04 19:42
>>736
そこまで具体的な変数管理を想定できるなら、
まずインスタンス利用時にエラーチェックして
クラス外部でスローなりなんなりした方が利用者負担がなくてイイと思う。
なんでわざわざコンストラクタからスローするのかと小一時間(ry

741 :デフォルトの名無しさん:04/08/04 19:42
だよねぇ。
CFile 使って例外取りこぼして障害発生なんて恥ずかしぃ・・・
そんなの発見するのに
>そこからが長かったりする。
だって。

中国人使ったほうがマシだな。

742 :デフォルトの名無しさん:04/08/04 19:42
http://diary5.cgiboy.com/2/i_love_u/
この日記って書いてることやばくね?通報されたりしないのかな?
画像とかも無断で使用しすぎだし・・・


743 :デフォルトの名無しさん:04/08/04 19:44
コンストラクタから例外なげれば
構築済みの(基底クラスやイニシャライザの)デストラクタが全部自動で
走るから楽だよ。

744 :740:04/08/04 19:47
>>741
誰に対する同意?
自分は例外クラス否定派だけど(w

いい中国人使った事あるの?
基本的にダメダメだと思うが。

745 :デフォルトの名無しさん:04/08/04 19:50
>>744
同じダメなら人件費安いほうがいいってことだと思う。
でも 563 はダメなりに頑張って最後には動くもの作るんだろうから、
まぁ仕事放り投げちゃう中国人よりは使える場面が多いかもね。

746 :デフォルトの名無しさん:04/08/04 19:51
>>743
コンストラクタから例外投げなかった場合でも
構築済みのデストラクタが全部自動で走ると思うが・・・。
どういう優位性を主張しているのかわからない。

747 :デフォルトの名無しさん:04/08/04 19:54
同じことをするんだから
フラグを用意する手間が省けませんか?
deleteもいらないし。

748 :デフォルトの名無しさん:04/08/04 19:55
中国人に一目置くとは、程度が知れてる(ry
読解力もなさげだし(w、>>741

749 :デフォルトの名無しさん:04/08/04 19:58
お前ら良く中国人と一緒に仕事なんてできるな。
内心では無茶苦茶憎まれてるよ。
たぶん意図的に致命的なバグ山ほど仕込まれてるよ。
プロジェクトが崩壊する前に早くクビにした方がいい。

750 :デフォルトの名無しさん:04/08/04 19:58
サッカー見てたらますます怖くなったよ<中国人

751 :デフォルトの名無しさん:04/08/04 20:00
>>747
>deleteもいらないし。

構築成功した場合に使うdeleteは、使えないという特殊な前提ですね・・・。

752 :デフォルトの名無しさん:04/08/04 20:02
?使えないって?
構築されたら使えばよいだけの話では…

753 :デフォルトの名無しさん:04/08/04 20:03
>>743
Initで例外を投げても同じ事

754 :743:04/08/04 20:05
Init も使いますよ。初期化処理を派生クラスで
カスタマイズしたいときなど。コンストラクタでは
仮想関数呼び出せないので。

755 :デフォルトの名無しさん:04/08/04 20:06
>>752
obj* p=new obj();
p->init();
delete obj;

obj* p;
try { p-new obj(); } catch(const exception&) {}
delete obj;
とかやろうとしてるんだろう

756 :743:04/08/04 20:07
× 仮想関数呼び出せないので
○ 派生クラスの仮想関数を呼び出せないので

757 :デフォルトの名無しさん:04/08/04 20:07
delete p;だな

758 :743:04/08/04 20:08
>>755
その場合は
Obj* p = NULL;
としておくだけでいいのでは?

759 :デフォルトの名無しさん:04/08/04 20:12
つーかスマートポインタ使えよ

760 :デフォルトの名無しさん:04/08/04 20:13
deleteなんて持ち出したアホがその台詞言うなよ

761 :743:04/08/04 20:14
まあアホでも何でもいいですけど。
言うほど面倒くさくもないんじゃないですかね。

762 :デフォルトの名無しさん:04/08/04 20:21
いつまでつまらん例外の話題でひっぱるんだろう…

763 :デフォルトの名無しさん:04/08/04 20:22
もっとましなネタが出るまで

764 :デフォルトの名無しさん:04/08/04 20:33
auto_ptrって役に立つのですか?

765 :デフォルトの名無しさん:04/08/04 20:35
わざわざscoped_ptr使うくらいならauto_ptrで済ませりゃ良い

766 :デフォルトの名無しさん:04/08/04 20:43
>>563の発言は過激だが、ある意味当たってる希ガス。

767 :デフォルトの名無しさん:04/08/04 20:51
そして、具体的なことは何も言わないのもいつもどおり

768 :デフォルトの名無しさん:04/08/04 21:04
>>767
具体的も何も、他人の作ったクラスを使ってみりゃいい。
その他人の作った仕様の奴隷になった気分を味わえる。
具体例をクレクレ言うのは実戦経験が浅いだけかと。

769 :デフォルトの名無しさん:04/08/04 21:05


770 :デフォルトの名無しさん:04/08/04 21:07
>>768
あのー・・・
もしかして「俺ライブラリ」みたいなの作ったりするタイプの人ですか?

771 :デフォルトの名無しさん:04/08/04 21:08
STLもboostも他人が作ったもんだがバリバリ使っておる。
便利である。

772 :デフォルトの名無しさん:04/08/04 21:18
>>770
普通作るでしょ。ライブラリと呼ぶかどうかは別として。
コピペ用の汎用ソースとか。
これなしに、何が蓄積されていくわけ?
で、突き詰めてくと要らないものも判ってくる。

773 :デフォルトの名無しさん:04/08/04 21:24
まだ続けますか

774 :デフォルトの名無しさん:04/08/04 21:25
>>768
だから、あんたは実戦経験が豊富なんだろ?
実戦経験足りない俺に具体例を提示してくれよ。
どうしてのらりくらりと核心から逃げるんだ?

他人のクラス使ってもその結論が出せないんだけど、
それは実戦経験が足りないからなんだろ?
実戦経験が足りないのにまた人様のクラス使っても同じことだって。

563以外の人間のほとんどが実戦経験たりなくて、
563だけが正しい結論を出しているなんてとても状況信じがたいだろう。
普通は少数派が間違っているものだ。
そうではないと言い張るなら、563自身の結論とやらを語って聞かせるべきでないのか?


775 :デフォルトの名無しさん:04/08/04 21:26
>>773
Doom3の割れ厨が不愉快だから、このスレで気分転換してた。
正直すまんかった。今は反省している。

776 :デフォルトの名無しさん:04/08/04 21:29
他人が作ったライブラリを使うと奴隷になったような気分になるという、
そういう性分なんじゃないの? 適正の問題になってくるかと。

777 :デフォルトの名無しさん:04/08/04 21:30
実践を語るなら、正しい方法とやらは多くの人間に認知されている手段であるはずだけど、
そこに触れないって事は、やっぱり一人で完結してる趣味グラマなんだろな。

778 :デフォルトの名無しさん:04/08/04 21:33
他人が作ったOSのAPIごときに振り回されて奴隷になったような気分にはならんのだろうか。

779 :デフォルトの名無しさん:04/08/04 21:42
>>777
わかってる人間はわざわざこんなくだらない話題に参加してない

780 :デフォルトの名無しさん:04/08/04 21:43
>>772
そういった「俺ライブラリ」が無駄に再生産されないで済むように、
標準ライブラリやら boost やら MFC やら ATL やら WTL があるわけで・・・

>>778
こういう人は I/O ポート直叩きですよ。んで「このチップの仕様腐ってる。
はぁ?割り込み?オーバーヘッドありすぎ。ポーリングで十分」とか言ふの。

781 :デフォルトの名無しさん:04/08/04 21:52
>>778
他人が作ったA○tiveDirect○ryに振り回されて奴隷になったような気分でつ。

782 :768:04/08/04 21:53
>>778
なるよ。もちろん。
MFC、ATL、WTL、boostだけで十分にウンザリ。
これに加えて独自クラスで独自の例外スローされたらたまらんよ。

783 :デフォルトの名無しさん:04/08/04 21:54
>>782
なんでこの仕事してんの?

784 :デフォルトの名無しさん:04/08/04 21:55
そのうち「他人の作った言語仕様に振り回されて〜」でC++を卒業すると。
とっとと出てってくて。

785 :768:04/08/04 22:00
自分と次元の異なる存在に振り回されるのは仕方ないでしょ。法人とか団体とか。
で、他のPGの半端な設計を喜んで受け入れるわけ、藻前ら?

786 :デフォルトの名無しさん:04/08/04 22:12
>>785
あるモノは使う。もはや一から自分で作っていて、期日通りにリリースできる
状況にはない。

いやほんとに、勘弁して下さいよ。最近の開発大規模化は……。

787 :デフォルトの名無しさん:04/08/04 22:17
まぁよく出来たライブラリ使う分には感動するが糞なライブラリ使ってると殺すって気になるな。
MFCとかCOMとか。同僚のしょぼい設計は却下
STLとかは感動した

788 :デフォルトの名無しさん:04/08/04 22:20
設計が腐ったライブラリは例外投げようが投げまいが腐ってることに変わりはないだろ。

789 :デフォルトの名無しさん:04/08/04 22:21
>MFCとかCOMとか
どちらも、かの会社のだな

790 :デフォルトの名無しさん:04/08/04 22:23
むしかえすようだが、500あたりで話してた奴は例外を基本としてる関数書き換えれば問題解決じゃないの?

791 :デフォルトの名無しさん:04/08/04 22:24
漏れなら設計方針に多少何アリでも、機能をそこそこちゃんと提供していて
そこそこ枯れてれば、なんでもありがたく使っちゃうよ。

そーいう意味では MS の Win32API と称される肥大化を続ける dll 群とか
COM 関連コンポーネントなんか最高。
WebBrowser、XMLパーサ/DOM、文字コード推定/変換、etc。

792 :デフォルトの名無しさん:04/08/04 22:37
>文字コード推定/変換
これの名前おせーて

793 :デフォルトの名無しさん:04/08/04 22:45
> そこそこ枯れてれば
真にプロなら、これ重要だって知ってるよな。

794 :デフォルトの名無しさん:04/08/04 22:47
>>790
それは、自分のプログラムのせいでPCが落ちたときに、
Windowsが不安定じゃなくなればいいとか言うのと同じだ。

795 :デフォルトの名無しさん:04/08/04 22:57
>>655
例外は投げないということか。
ライブラリユーザ(ひいてはアプリユーザ)にどこが悪いのか知らせることを
放棄しちゃうんだね。
xpathっぽいもの作って例外クラスに格納するとか答えてくれるかと
思ったんだがな。


796 :デフォルトの名無しさん:04/08/04 22:58
プロとか関係なしに、枯れてる方がいいに決まってる

797 :デフォルトの名無しさん:04/08/04 23:05
枯れてることを望むのがプロ

798 :デフォルトの名無しさん:04/08/04 23:06
いやいやいやいや、アマだって枯れてるのを望みますって!

799 :デフォルトの名無しさん:04/08/04 23:08
>>789
だから糞って言っただけだろ。

COMなんて、あの時代であれ以上の言語非依存バイナリ互換フレームワーク
なんて存在しないし、糞とか言うもんじゃねーもん。
OLEとかのCOMで実装されたライブラリに糞なものはあったかもしれないけどな。

800 :デフォルトの名無しさん:04/08/04 23:13
789だが、なんでそんな勢いで突っかかられるのか分からん。

801 :デフォルトの名無しさん:04/08/04 23:29
>>800
明確な理由なく貶すからだろ。てかM$信者なんだろ・・・

802 :デフォルトの名無しさん:04/08/04 23:35
んな程度でファビョんなよ。

803 :デフォルトの名無しさん:04/08/04 23:40
MS信者なんているのか?
アンチ・アンチMSなら良くみるが。

804 :デフォルトの名無しさん:04/08/04 23:41
要するに他人が作ったのは、その癖を理解して手足のように使いこなせるようになるまでに時間が必要ってことだろ。
その価値があるかどうかは別問題として。

805 :デフォルトの名無しさん:04/08/04 23:42
そんなに他人の作ったもの毛嫌いするなら、使う事を考慮するなっつの。
標準ライブラリとOSのツールキットしか触るなよ、タコ。 

806 :デフォルトの名無しさん:04/08/04 23:45
何の話してたんだっけ

807 :デフォルトの名無しさん:04/08/04 23:53
プリンに醤油をかけると何味になるか?じゃなかったっけ?

808 :デフォルトの名無しさん:04/08/04 23:59
えと、いちご味のばななだろ。

809 :デフォルトの名無しさん:04/08/04 23:59
アボガドに醤油をかけるとトロのアジがするとか?

810 :デフォルトの名無しさん:04/08/05 00:03
アボガドにトロをかけるとアボガドロのアジがするとか?


811 :デフォルトの名無しさん:04/08/05 00:06
>>808
プリンに醤油をかけるとバナナになるのか??

812 :デフォルトの名無しさん:04/08/05 00:11
落ちる気配がなさそうにないのでそろそろ寝まつ。

813 :デフォルトの名無しさん:04/08/05 00:22
そんな時には例外スロー

814 :デフォルトの名無しさん:04/08/05 00:22
>>551
std::ifstream ifs(filename);
ifs.exceptions(std::badbit|std::failbit);

これでオープン失敗してれば例外が飛びます。
さらに、以降 ifs に対する操作で何か失敗すれば即例外が飛びます。
ただしデストラクタにクローズを任せた場合、クローズの失敗で例外は飛びません。

ただ、型はすべて std::ios::failure ですし、 what() の内容は
今まで試した処理系での結果を見るに期待できないので、
的確なエラーメッセージを要する場面ではこれだけで済ませるわけにはいかないでしょう。
それでも、テストプログラムなどで失敗後のプログラム継続を防止したいだけなら重宝します。

願わくば、各iostream実装は、もっと what() に情報を詰めて欲しいです。
strerror(errno) とか、VC++なら FormatMessage() の結果とか、
catchしたタイミングで errno や GetLastError() に実際の原因が入っている保証が無いので、
自前でやったとしても不安が残ります。

815 :デフォルトの名無しさん:04/08/05 00:27
そういえば、例外発生中のデストラクタで例外を発生させることが出来ないわけですが、
例外発生中かどうかを判断する関数とかってありますか?

816 :デフォルトの名無しさん:04/08/05 00:45
>>815
std::uncaught_exception()
ただし、以下のリンク先を理解せずに使うことは許しません。
http://www.gotw.ca/gotw/047.htm

817 :デフォルトの名無しさん:04/08/05 00:48
つーか、例外中かどうか判断するのは別にいいけど
デストラクタで例外投げるのは禁じ手だったような。

818 :デフォルトの名無しさん:04/08/05 01:02
C++例外について批判的なみなさんは、↓から始まるコラムを読まれることをお勧めします。
http://www.microsoft.com/japan/msdn/library/ja/jpdndeepc/htm/deep051099.asp

第 1 部〜第 17 部までの間に筆者自身の意見が揺れているのが面白いですが、
そのせいで部分的に読むと大変な誤解をする可能性もある危険な文書です。
是非通して読んでみてください。

819 :デフォルトの名無しさん:04/08/05 01:14
uncaught_exception();

820 :デフォルトの名無しさん:04/08/05 04:02
クラス例外スローマンセー厨は大人しくなったな。
クラス例外は使いこなすのに結構骨が折れる。
というより、実用的に作られてないと使う人がかなり悲惨。

821 :デフォルトの名無しさん:04/08/05 04:29
逆のロートルもおとなしくなったな

822 :デフォルトの名無しさん:04/08/05 06:52
カレーにウンコをかけると、ウンコ味のカレーになる

823 :デフォルトの名無しさん:04/08/05 07:03
>>820
クラス例外って言葉はブーム?
クラス例外に醤油かけると何味だっけ?

824 :デフォルトの名無しさん:04/08/05 09:55
>>817
いや、例外発生中じゃなければいいわけで、815の言ってることは正しいんだけど、無理だと思うよ。
だからデストラクタで例外投げるなって言われてるわけだし。

825 :デフォルトの名無しさん:04/08/05 10:20
class C {
T *p1, p2;
public:
C() : p1(new T), p2(new T) {}
~C() { delete p1; delete p2; }
};

p2(new T) が例外を出したら p1はメモリリークする?
もしそうならnewで初期化するのはやってはいけない?

826 :825:04/08/05 10:37
>>818に書いてあったわ。

827 :デフォルトの名無しさん:04/08/05 10:42
>>825
する。

そのためにfunction-tryブロック(って名前でいいんだっけ?)があるけど、多くの処理系で未対応。
解決法としては、
・初期化子じゃなくて代入文を使う(ダサいけど)
・生ポインタをメンバに持つんじゃなくて、std::auto_ptrなどにする
などがいいんじゃないでしょうか。

828 :デフォルトの名無しさん:04/08/05 10:42
うーん。
スレの性質上、例外処理の挙動について語り合うのは価値のあることだけど、
その事と実用とはまた別のものだな。
昨日は、混同する馬鹿が暴れてたみたいだな。乙

829 :デフォルトの名無しさん:04/08/05 10:44
>>825
あと、細かいけど、

> T *p1, p2;

T *p1, *p2;
だよね?

830 :デフォルトの名無しさん:04/08/05 10:52
うん

831 :デフォルトの名無しさん:04/08/05 11:52
今日は静かだなぁ。

832 :デフォルトの名無しさん:04/08/05 11:58
嵐の前の

833 :デフォルトの名無しさん:04/08/05 12:10
V6

834 :デフォルトの名無しさん:04/08/05 12:30
アボ「カ」ド

835 :デフォルトの名無しさん:04/08/05 13:04
アボガド の検索結果 約 56,800 件中 1 - 50 件目 (0.33 秒)
アボカド の検索結果 約 53,800 件中 1 - 50 件目 (0.19 秒)

836 :デフォルトの名無しさん:04/08/05 13:34
カドルト

837 :デフォルトの名無しさん:04/08/05 13:38
\モウ/    \ね/  \ アボカド /  \ 馬 /  \ 鹿 /  \ カト /
                                    ∩   ∩
                                    | つ  ⊂|
    ∩;;;∩                      ∧ノ~       ! ,'っ _c,!
  (Y;;;;;;;;;;ヽノ)               ヽ      ミ| ・  \    ⊂/  ・  \
   i;;;;;;;;;;゚;;;゚ヽ           γ⌒^ヽ    ミ|   ... '_)   | __,,▼    ∫
/;;;;;;\;;;;'⌒)          /::::::::::::::ヽ   ミ| (,,゚Д゚)    |・ (,,゚Д゚)   (,,゚Д゚)
 )|;;;;;;;;(,,゚Д゚)    (⌒)(⌒)  /.:::::::::(,,゚Д゚)    | (ノ  |)     | (ノ  |)  ⊂三つ: つ ババンバ
ι|;;;;;;;つ ;;;/つ   ( ・Å・)  i::::::(ノDole|)   |  馬 |      |・・ .鹿 |      ||||||||   バン
  ヽ..;;;;;;;;/  γ⌒ ( ゚Д゚))  ゙、:::::::::::::ノ    人.._,,,,ノ     ι・,,__,ノ     |  |     バン
    U"U  乂_) UU      U"U       U"U       U"U      U"U :y=-( ゚д゚)・∵;; バーン

838 :デフォルトの名無しさん:04/08/05 14:27
アボカド 【avocado】

クスノキ科の常緑高木。中米原産。果実は黒緑色または緑色の
洋梨形または楕円形で,中に大きな種子が 1 個ある。果肉は
黄緑色のチーズ状で,脂肪・タンパク質を含み,生食される。
ワニナシ。
〔アボガドとするのは正しくない〕



839 :デフォルトの名無しさん:04/08/05 14:30
ドナルド

840 :デフォルトの名無しさん:04/08/05 18:03
class C{};
struct S{ S( ... ); };
sizeof( S( C() ) );

とすると、 C() が 関数値 C、引数 void の関数とみなされ、S() の C++ スタイルのキャストとみなされてしまいます。
S のコンストラクタの引数に C を渡すように認識させたいのですが、どうすれば良いでしょうか?

841 :デフォルトの名無しさん:04/08/05 18:14
>>840
sizeof (S((C())));
または
sizeof (S(C::C()));

842 :デフォルトの名無しさん:04/08/05 18:20
主旨から外れるが
sizeofなら型名だけでいいのではないか。

843 :デフォルトの名無しさん:04/08/05 18:26
実はテンプレートで複雑なコンパイルタイム演算が発行されるとか。

844 :デフォルトの名無しさん:04/08/05 18:34
>>840
sizeof S(C())

845 :デフォルトの名無しさん:04/08/05 18:39
>>844
うお!
なんかちょっと感動

846 :デフォルトの名無しさん:04/08/05 18:40
>>844
sizeof(SCO)に見える

847 :デフォルトの名無しさん:04/08/05 19:03
なんだかこのスレッドの方が問題を解決してくれそうな予感がします。
1ヶ月位経ちますが、InternetExplorerのボタンを押したり、URLを押したりすると
エラーが出てこの様な英文が表示されるのです・・・。

Microsoft Visual C++ Runtime Library
Buffer overrun detected!

A buffer overrun has been detected which has corrupted
the program's internal state.The program cannot safely
continue execution and must now be termineted.

です・・。この相談を他のサイト等で2回投稿したのですが、
スルーされるばかりで・・・。誰にも分らない程ヤバイのかと思っていました・・。
OSはWindows Meです。
分かる方いましたら解決法を教えてください。お願いいたします。

848 :デフォルトの名無しさん:04/08/05 19:06
再インスコ

849 :847:04/08/05 19:10
度々すみません。
英文の最後の単語は

×・・・・termineted
○・・・・terminated

でした。

850 :デフォルトの名無しさん:04/08/05 19:12
再インスコ

851 :デフォルトの名無しさん:04/08/05 19:12
だから再インスコしろつってんだろ
スレ違いな上下らなぇことでスレ消費すんなボケ

852 :デフォルトの名無しさん:04/08/05 19:14
再インスコってなんですか・・・
初心者で分からないです・・・すみません。

853 :デフォルトの名無しさん:04/08/05 19:16
あのぅ、C++相談室ってどこですか?
なんか間違えちゃったみたいで…

854 :デフォルトの名無しさん:04/08/05 19:26
>>847
http://pc5.2ch.net/win/ ここは行ってみた?

855 :847:04/08/05 19:36
>>854
レスありがとうございます。
行ってはみたのですが、レスはしてないです・・。
私はスレ違いの事を書いてしまっているのですか?
すみませんでした。 英文の中に「C++」と書いてあったので・・・・
ご迷惑おかけしました。

856 :デフォルトの名無しさん:04/08/05 20:04
>>847
それって普通、キミのプログラムがどっか頓珍漢なメモリ領域に書き込んでぶっ壊しているってことだよ。
例えば、128バイトしかヒープメモリーを確保していないバッファに256バイト書き込んでいるとか。
対処法は、キミのプログラムのバグを取るしかない。

857 :デフォルトの名無しさん:04/08/05 20:06
人生をシャットダウンすれば無問題

858 :デフォルトの名無しさん:04/08/05 20:15
>>856
「キミのプログラム」なんか存在しないんだと思う

859 :デフォルトの名無しさん:04/08/05 20:20
とりあえず常駐プログラム全部切ってから、IEを操作してみては。
VC++で作った、バグの残ったアプリを一月前にインスコしたって
ことなんではなかろうか。どっちにしてもC++の話題ではないな・・・。

860 :デフォルトの名無しさん:04/08/05 23:38
「C++のクラス = 構造体」
ってことでOKですか?

861 :デフォルトの名無しさん:04/08/05 23:39
???
じゃあクラスと構造体が二個ある意味って何よ

862 :デフォルトの名無しさん:04/08/05 23:40
>>861
Cとの互換性のため

863 :デフォルトの名無しさん:04/08/05 23:41
むしろC++の構造体=クラスの劣化版
じゃないの?

864 :デフォルトの名無しさん:04/08/05 23:45
劣化してないよ。

865 :デフォルトの名無しさん:04/08/05 23:48
structにclassの機能を付与したのは
例によって付与しないデメリットが思いつかないという
思い付きによって決められた糞仕様なんだよ。

866 :デフォルトの名無しさん:04/08/05 23:54
>>865
そうか。思いつきだったのか。別にCのstructの機能そのままでも
良かったような気もしたりしてたんだよな。
デフォルトのアクセス制限が違うだけなんだもん。

867 :デフォルトの名無しさん:04/08/05 23:55
ファンクタを簡単に書くためだろ

868 :デフォルトの名無しさん:04/08/06 00:00
つーか、classがデフォルトprivateなのもあんま意味ないよな。

869 :デフォルトの名無しさん:04/08/06 00:01
カプセル化しないバカを減らすためだろ

870 :デフォルトの名無しさん:04/08/06 00:03
>>867
それだ!

871 :デフォルトの名無しさん:04/08/06 00:03
interfaceもそうだけどあとからstructの性質を利用しただけだろ

872 :デフォルトの名無しさん:04/08/06 02:00
すいません、
空のフォルダを削除するにはどうしたらいいのでしょうか?
googleで検索してもなかなか見つからず、
やっとサンプルコードが見つかったと思ったら、ないヘッダがインクルードしてあって
結局分かりませんでした。

873 :デフォルトの名無しさん:04/08/06 02:01
標準C++にはありません

874 :デフォルトの名無しさん:04/08/06 02:03
ファイルシステムの操作は,環境依存。
自分の環境スレ逝け。

875 :872:04/08/06 02:06
>>874
環境ということは・・・
えーと・・・
BCC使ってるのでBCCスレということですね。

分かりました。
BCCスレで聞いてきます。

876 :デフォルトの名無しさん:04/08/06 02:10
天然

877 :デフォルトの名無しさん:04/08/06 03:30
removeで消えるんじゃねーの?
BCCはしらんけど

878 :デフォルトの名無しさん:04/08/06 08:02
消えるかもしれないが、消えないかもしれない。

879 :デフォルトの名無しさん:04/08/06 11:35
>>878
くだらん

880 :デフォルトの名無しさん:04/08/06 11:43
DOSのコマンド呼び出しちゃえば?
rdだっけ。

881 :デフォルトの名無しさん:04/08/06 12:31
class A
{
 int d;
 A() : d(0) {}
};
はできるけど

class B
{
 char s[16];
 B() :s(0) {}
};
はできないよね。
コンストラクタで配列を初期化したい時はどうすればいいの?

882 :デフォルトの名無しさん:04/08/06 12:32
newしろ

883 :デフォルトの名無しさん:04/08/06 12:33
newすると0フィルされるの?

884 :デフォルトの名無しさん:04/08/06 12:34
>>881
残念ながら、できない。
C++の仕様の穴と言われております。

でも、配列なんて滅多に使わないしなぁ。

885 :デフォルトの名無しさん:04/08/06 12:35
>>881
つーか暮らす定義の中に書かなけりゃいい

886 :デフォルトの名無しさん:04/08/06 12:37
std::memset(s, 0, sizeof(s));
ただ0のバイナリイメージが0じゃない環境では
うまくいかない希ガス。なので漏れは for で回してる。

887 :デフォルトの名無しさん:04/08/06 12:39
std::fill使えばいいやん

888 :886:04/08/06 12:42
Σ(゚Д゚)…!!

889 :デフォルトの名無しさん:04/08/06 12:48
>>886-887
それは初期化じゃなくて代入


890 :デフォルトの名無しさん:04/08/06 12:50
では std::vector ということで

891 :デフォルトの名無しさん:04/08/06 12:52
char[16]にMD5とか格納したい時にわざわざ
vector作るの?

892 :デフォルトの名無しさん:04/08/06 12:53
char なら std::string で。だめ?

893 :デフォルトの名無しさん:04/08/06 12:54
std::stringってバイナリ格納してもいいの?

894 :デフォルトの名無しさん:04/08/06 12:54
char[16]よりはvectorがいい

895 :デフォルトの名無しさん:04/08/06 12:56
腹くくって素直にstd::fill()しる

896 :デフォルトの名無しさん:04/08/06 12:56
>>893
いいよ。

正直char s[16]は突っ込むところじゃないと思う。

897 :デフォルトの名無しさん:04/08/06 12:57
標準関数使ってる人はなに作ってるの?

898 :デフォルトの名無しさん:04/08/06 13:08
for( int j = 0; j < 1000; j++ ){
try{
throw j;
}
catch(int z){
}
100回目で落ちます。なぜ?


899 :デフォルトの名無しさん:04/08/06 13:10
環境書けよ。
あと普通のクラスthrowした場合は?

900 :デフォルトの名無しさん:04/08/06 13:15
>>881
char []の0 fillなら初期化に頼らずに、
コンストラクタ本体での代入で十分じゃないですか?

901 :デフォルトの名無しさん:04/08/06 13:19
>>900
0でいいなら、なにもしなくても0じゃなかったっけ?

902 :デフォルトの名無しさん:04/08/06 13:21
>>901
まともなOOPLならその通り

903 :デフォルトの名無しさん:04/08/06 13:34
>>898
中括弧の数が合わないが

904 :デフォルトの名無しさん:04/08/06 13:40
時々あるが、質問者の「バイナリ」の意味がわからんな。

905 :898:04/08/06 13:47
失礼しました。
for( int j = 0; j < 1000; j++ ){
 try{
  throw j;
  TXOwl::Raise(""); // どちらか
 }
  catch(...){
 }
}
BorlandC++5.02J
WindowsXP
です。
どちらでも101回目で落ちます。なぜ?
よろしくお願いします。

906 :デフォルトの名無しさん:04/08/06 14:07
>>905
「落ちる」と言ってもいろいろあるんだけど。
具体的に。

907 :デフォルトの名無しさん:04/08/06 14:09
>>905
コンパイラ最新のにしてみたら。
あとTXOwl::Raiseが悪さしてるとはないんだよね。

908 :デフォルトの名無しさん:04/08/06 14:12
今年の夏もひとり。
自分のために夏休みは使うかな。

909 :デフォルトの名無しさん:04/08/06 14:12

誤爆してスマソ


910 :898:04/08/06 14:56
>>906
ライブラリの中っぽい
0x77E33887 の pop si
でデバッガが止まります。スタックのエラーですかね?

>>907
throw 1; でも throw ""; でも同じ結果です。
コンパイラの更新ですか。ふぅ。


911 :デフォルトの名無しさん:04/08/06 20:24
配列が100しか用意してないから
初期化しないといけない

912 :デフォルトの名無しさん:04/08/07 09:30


913 :デフォルトの名無しさん:04/08/07 17:50
VC.NET 2003 で
int f() throw( int ){ ... }
ってやると
warning C4290: C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。
と出るのですが、これはどういう意味なのでしょうか?

914 :デフォルトの名無しさん:04/08/07 17:50
こんぱいらオプションに何か付けないとでるよ

915 :デフォルトの名無しさん:04/08/07 18:02
例外の指定は throw() 以外はサポートしてないということじゃない?

916 :デフォルトの名無しさん:04/08/07 18:14
warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow).

indicateが「表示する」に訳されて怪しい日本語を醸し出している模様。

917 :デフォルトの名無しさん:04/08/07 18:23
文句があるなら 2005 買えや貧民どもが! by ゲイツ
ってことか

918 :デフォルトの名無しさん:04/08/07 19:34
>>913
こんな糞訳が許されていいのか?! (w
勝手に文を二つに分けてるし。except toくらい訳せよ。

919 :デフォルトの名無しさん:04/08/07 19:50
警告 C4290: C++例外指定は関数が __declspec(nothrow) ではないと示すことを除いて無視されます。

これでいいかな?

920 :デフォルトの名無しさん:04/08/07 19:54
でも 2005 で直る保証はどこにもないのか_| ̄|○

921 :デフォルトの名無しさん:04/08/07 19:55
わけたほうがわかりやすいじゃねーか

922 :デフォルトの名無しさん:04/08/07 20:19
>>919
示す場合を除いて

>>915の表現が分かりやすいがな。

923 :デフォルトの名無しさん:04/08/07 20:21
「テンプレートパラメタを減少できませんでした」よりはまし。

924 :デフォルトの名無しさん:04/08/07 20:45
>>922
原文が "to indicate a function is __declspec(nothrow)" ならそれで納得いくんだが。

925 :デフォルトの名無しさん:04/08/07 20:55
>>924
いや、>>922は、
__declspec(nothrow) ではないと示す場合を除いて
のつもりです。

926 :デフォルトの名無しさん:04/08/07 20:55
__declspec(nothrow) ではないことを示す場合を除いて
か…


927 :デフォルトの名無しさん:04/08/07 22:04
そもそも
__declspec(nothrow)
自体がわかりにくい

928 :デフォルトの名無しさん:04/08/07 22:21
nothrow
でない
を除いて

だもんな…
さらに訳は間違ってる…

929 :デフォルトの名無しさん:04/08/08 14:20
唐突ですがポインタを直接やり取りする場合と比べて
ポインタへの参照をやり取りするメリットってどんなものがありますか?

930 :デフォルトの名無しさん:04/08/08 14:28
>>929
いくつかの違いがあるが、どれもメリットにもデメリットにもなり得る。
自分で判断すべき。

931 :デフォルトの名無しさん:04/08/08 14:57
>>930
レスどうもです。
どこぞのサイトにポインタ渡しをする奴なんてとんでもない
みたいな表現がしてあったので
何が何でも参照で受け渡しするべきなのかと思ってました。
例えば、

void func(int*& rp);

int * p;
func(p);
は無論OKで
int a[10];
func(a);
はエラーになるので
func((int *&)a);
とやるとコンパイルは通るけど希望の動作はしてくれません。
これがただのポインタだったら簡単にいくので
今のところデメリットしか浮かばないです。

例えばどんな場合にメリットになりますか?


932 :デフォルトの名無しさん:04/08/08 15:10
それとこれとは別だ

933 :デフォルトの名無しさん:04/08/08 15:15
>>929
例えばある関数にポインタを渡して、その内容を変更してもらいたいとき、
ポインタへのポインタだと

func(&p);

として呼び出さなければならないし、呼び出し先では

void func(int** p)
{
 *p = hoge;
}

と書かなければならないが、ポインタのリファレンスなら

func(p);

呼び出し先では

void func(int*& p)
{
p = hoge;
}

とすっきりした感じになるだろう。欠点はこの裏返しでポインタの
リファレンスと宣言した事を覚えておかないと呼び出し先でポインタの
内容を変えられたりして「およよ」と思う事がある事とか。そんな所かな。

934 :デフォルトの名無しさん:04/08/08 15:16
>>931
整数をそのまま渡すか参照で渡すかというのと同じような違いですよ。

935 :デフォルトの名無しさん:04/08/08 15:20
>>931
そのサイトどこですか?
たぶんあなたが曲解してるだけです。

936 :デフォルトの名無しさん:04/08/08 15:30
>>933
丁寧なレスありがとうございます。
よく分かりました。

>>934
なるほど、つまりはそういうことなんですね。
納得しました。

>>935
以前ググっている最中にチラ見したサイトなんで
URLは失念してしまったのですが、
ポインタ渡しは不要だ、ぐらいの勢いだったと思います。
私の読み方が浅かったのかも知れません。
それと知人からポインタは推奨されないし
いっさい使わずに組めるし、そうしたほうが良いらしい
という話を聞いたもので。
でもその知人は初心者でいきなりC#を勉強中だったようで
今思うとC++の話ではなかったのだと思います。


937 :デフォルトの名無しさん:04/08/08 16:03
>>936
ものごとの理由を考えずに題目を信じるようなプログラマは要らない。

938 :デフォルトの名無しさん:04/08/08 16:05
あなたに必要とされたい訳ではないからご安心をw

939 :デフォルトの名無しさん:04/08/08 16:07
>>938 自分で>>937の言うようなプログラマだと自覚してるのか?

940 :デフォルトの名無しさん:04/08/08 16:11
NULL が渡る可能性があるなら参照はムリだし、整数を参照で渡すとオーバーヘッドで逆に遅くなる

>>938
氏ね

941 :デフォルトの名無しさん:04/08/08 16:15
参照渡しって不要だろ?
ポインタ渡しでポインタ書き換えちゃうアフォを避けるための機能でしかない。


942 :デフォルトの名無しさん:04/08/08 16:30
ポインタ渡ししてポインタを書き換えても何も問題は無いわけだが

943 :デフォルトの名無しさん:04/08/08 16:32
>>941
禿同。
あと p->func() とか *p とか書けないほど無精な香具師のための機能だね。

944 :デフォルトの名無しさん:04/08/08 16:33
>>937
一応理由を考えた上なんですけど
もしや自分では考えが及ばないサムシングがあるのかなぁって
思ったんですが>933と>934でそうではなかったんだ、と
使用目的に関してよく納得しました。
皆さんどうもありがとうございました。


945 :デフォルトの名無しさん:04/08/08 16:34
値渡しと参照渡し
ポインタ渡しと参照渡し
2つの対比をごっちゃにしてはいけない。

946 :デフォルトの名無しさん:04/08/08 16:37
>>944
理由を考えた上で「何が何でも参照で受け渡しするべき」なんて思うようでは意味が無い。

947 :デフォルトの名無しさん:04/08/08 16:41
>>941
演算子多重定義には必須。

948 :デフォルトの名無しさん:04/08/08 16:43
参照渡しが無いと演算子オーバーロードやコピーコンストラクタ、
catchの構文が不恰好になる。
値渡しとconst参照渡しで高性能な方を選べる。
参照の利点はそのくらいかな。
個人的には非const参照は嫌い。

949 :デフォルトの名無しさん:04/08/08 16:54
非const参照は、戻り値などに使う

950 :デフォルトの名無しさん:04/08/08 16:56
戻り値に参照ってそんなに使うか?
operator= くらいしかあんま思いつかん

951 :デフォルトの名無しさん:04/08/08 17:11
istream/ostream周りでは非const参照が大活躍してるな。

952 :デフォルトの名無しさん:04/08/08 17:14
operator []

953 :デフォルトの名無しさん:04/08/08 18:14
#defineで下のようなことをやりたいのですが、これはコンパイルエラーになります。

#define AAA() #define BBB 128
AAA() // #define BBB 128 に置き換わるようにしたい

上記のようなことは不可能なのでしょうか?

954 :デフォルトの名無しさん:04/08/08 18:17
>>953
不可能。#includeを使えば似たような事は出来る。

955 :デフォルトの名無しさん:04/08/08 20:09
>>943
> 禿同。
> あと p->func() とか *p とか書けないほど無精な香具師のための機能だね。
void foo(const std::string& s);

foo("hoge");
で呼びたくないのか..


956 :デフォルトの名無しさん:04/08/08 20:45
このスレで解かったことは、CからC++に移った人は、参照とか例外とかが使えないということ。
必要性より有用性の問題であるのに、なぜか、Cと同じ流儀でこうやればいい、となってしまう。

957 :デフォルトの名無しさん:04/08/08 20:49
いやいやこのスレだけ見て語られてもねぇ ^ ^ ;

958 :デフォルトの名無しさん:04/08/08 20:51
ダメなやつは何をやってもダメなんだよ!

959 :デフォルトの名無しさん:04/08/08 20:53
gotoを使ったエラー処理の必要が無くなるから例外処理は積極的に使うよ。
ただ、参照は不慣れなこともあって自分から積極的に使ってはいない。

960 :デフォルトの名無しさん:04/08/08 20:55
* が入りまくってると見にくいしな


961 :デフォルトの名無しさん:04/08/08 21:21
コンパイラファイアウォールイディオムって何ですか?

962 :デフォルトの名無しさん:04/08/08 21:25
>>961
Exceptional C++買え。自分への投資を惜しむな。

963 :デフォルトの名無しさん:04/08/08 21:26
>>958
お前がその典型的な例だな。

964 :デフォルトの名無しさん:04/08/08 21:34
>>961
Google先生に聞いてみれば十分。本なんか要らない。

965 :デフォルトの名無しさん:04/08/08 21:46
C++の設計の仕方でMFCのような
メンバー関数の中を書くだけでアプリケーションが出来るのは
どうやって作れば出来ますか?

966 :デフォルトの名無しさん:04/08/08 21:47
>>962
投資惜しまないけどC++の知識って他の言語に乗り換えた瞬間死滅しそうだな。

967 :デフォルトの名無しさん:04/08/08 21:47
>>964
でもCOMは本が無いと正直なところきついね

968 :デフォルトの名無しさん:04/08/08 22:20
pimplイディオムでそれらしききものが見つかったのですが、これはコンパイラファイアウォールイディオムと同じものでしょうか?

969 :デフォルトの名無しさん:04/08/08 22:38
そうだよ。

970 :デフォルトの名無しさん:04/08/08 22:56
ありがとうございます

実は Exceptional C++ の P96 を読んでて分からなくて聞いてみたんですが、
この本の第四章に詳しく書いてあるんですね _| ̄|○

灯台もと暗しでした

971 :デフォルトの名無しさん:04/08/08 23:06
>>964
この貧乏人めが!

972 :デフォルトの名無しさん:04/08/08 23:36
>964
ぐーぐる先生に頼ってると聞いた事あると意味わからない人になりますよ

973 :デフォルトの名無しさん:04/08/08 23:50
>>972の書き込みの意味がわからないが、恐らく自己紹介をしてるんだろう。

974 :972:04/08/09 00:05
スマン自分で見てもよくわからん...
言葉だけ知ってても意味分からない人になるって意味をいいたかったんだよ

975 :デフォルトの名無しさん:04/08/09 00:19
×言葉だけ知ってても意味分からない人になるって意味を〜
○言葉だけ知ってても意味を知らない人間になるって事を〜

976 :デフォルトの名無しさん:04/08/09 02:09
>>959
関数内で完結するならやっぱりgoto使うな、オレの場合は。

977 :デフォルトの名無しさん:04/08/09 03:40
gotoって関数内({}内)だけで有効だから、
うまく使えばすごく便利で処理も見やすくなる。


978 :デフォルトの名無しさん:04/08/09 04:44
>>977
gotoを好んで使うようになると、ズルズルとスコープ拡大(行数増加)する傾向がある。
結果として、ローカル変数の管理が難しくなる。

979 :デフォルトの名無しさん:04/08/09 05:20
管理しなきゃいけないほどローカル変数がたくさんあるならそうだろうな(w

980 :デフォルトの名無しさん:04/08/09 07:27
>>977
throw-catchを使ってみては?
>>953
プリプロセッサでさまざまなことやるならboost::preprocessorを
ミニ言語となっているぐらい強力。
日本語訳のもあるけどSequences関連の高階マクロとかが乗ってないのでリファレンスは本家で見た方がいいかな。



981 :デフォルトの名無しさん:04/08/09 08:40
>>980
バカじゃねーのw
gotoを使わないことを目標にしてどうするw
絶対gotoを使ってはだめだとか思ってる思考停止バカは他人と接するな

982 :デフォルトの名無しさん:04/08/09 08:51
>>981
> gotoを使わないことを目標にしてどうするw
誰もそんなことは言ってないですねw
興奮しすぎて、脳内の仮想敵と実在の名無しの区別がつかなくなったんですか?

もうちょっと落ち着いて下さい。ただでさえ頭わるいんだからw

983 :デフォルトの名無しさん:04/08/09 08:55
(・∀・)ニヤニヤ

984 :デフォルトの名無しさん:04/08/09 08:56
グウの音も出なくなったら
とりあえずニヤニヤ

985 :983:04/08/09 08:59
>>984
ごめんなさい。私は第三者です。
ちょっかい出してすいませんでした。

986 :デフォルトの名無しさん:04/08/09 09:01
センスの欠片も無いその場しのぎの反応。
ダメだこりゃ( ´,_ゝ`)

987 :981:04/08/09 09:03
  ヘ( `Д)ノ  モーコネーヨ ウワァァァン!!
≡ ( ┐ノ
:。;  /

988 :デフォルトの名無しさん:04/08/09 09:05
実行効率が悪い

989 :デフォルトの名無しさん:04/08/09 09:09
例外でやることに何の意味がある?

990 :デフォルトの名無しさん:04/08/09 09:21
C++らしくなる

991 :デフォルトの名無しさん:04/08/09 09:26
gotoは使っていないきれいなソースですと主張できる

992 :デフォルトの名無しさん:04/08/09 09:56
実行速度が重要な場合は例外を避けることもある。

993 :デフォルトの名無しさん:04/08/09 09:58
で、C++だからといって、例外を使わないコードを拒否することは思考停止。
C++はそういった設計も許容する懐の深い言語だ。

994 :デフォルトの名無しさん:04/08/09 09:59
>>993
懐が深いというか、なんでもありというか、節操がないというか。
でも、好きです。

995 :デフォルトの名無しさん:04/08/09 10:01
懐が深すぎると思うこともしばしばあるけどな・・・

996 :デフォルトの名無しさん:04/08/09 10:38
記念カキコ v(^-^*)

997 :デフォルトの名無しさん:04/08/09 10:40


998 :デフォルトの名無しさん:04/08/09 10:40
C++は時代遅れ

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

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

>>1000
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。



1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

207 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)