1 :
v(^・^)v :
04/07/19 04:46 C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは
>>2-10 あたり
2 :
v(^・^)v :04/07/19 04:48
3 :
v(^・^)v :04/07/19 04:49
4 :
v(^・^)v :04/07/19 04:51
5 :
v(^・^)v :04/07/19 04:52
6 :
v(^・^)v :04/07/19 04:53
8 :
v(^・^)v :04/07/19 05:13
9 :
v(^・^)v :04/07/19 05:14
10 :
v(^・^)v :04/07/19 05:15
連続投稿規制に引っかかってむしゃくしゃしていた. スレが立てられるなら何でも良かった. 今はあらかじめ串を用意しておくべきだったと反省している.
14 :
デフォルトの名無しさん :04/07/19 11:08
v(^・^)v が復活したな。酸素〜
STLつかうと一気に実行ファイルサイズが10倍に?!
17 :
デフォルトの名無しさん :04/07/19 22:02
つまんね 実測すりゃ済むことで 人に聞く必要性は完璧にゼロ
>>17 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
( ・_・)?
>>17 もー。
打ち合わせ通りにやってよね。
正しくは
>
>>16 > 環境によるだろ。
> 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
> ランタイムを使用するようにして使っているが、例えばstd::vectorを
> 使っても使わない時と比べ10Kほどしか増えない。
(;´Д`)
STL信者が我慢できなくなったようだなw
>>20 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
もういいってw 何回やれば気が済むんだ?
むしろこれもテンプレの一部だろ
実は今日は火曜日だったりするわけ。
C1010(ry
>>28 #include "stdafx.h"
あと死ね。
テンプレ扱いならテンプレ扱いで、気合入れてやってくれよ。 死ぬほど面倒くさそうにやられると、見てるこっちも疲れてくる(^_^;
次スレから気合入れてやるってことで
class CMyClass { public: static const int nState = 0; }; これだとコンパイルが通るんですが intをdoubleに変えるとエラーになるのは何故ですか?
>>32 どこかでCMyClass::nStateをintだとおもってつかってるからでしょう。
C++の仕様 ちと古いコンパイラはその書き方もダメだった
昔は整数型定数しか初期化できなかった
え?今は浮動小数点数もいけるのか?
いけません。
主人が帰ってきますわ。
ああ、そんなこと、やめてください。
パソリンカット
41 :
デフォルトの名無しさん :04/07/21 00:25
L."DANCHI",R
>>42 auto_ptr_ref はついに消えてくれそうだな。前から怪しいと思ってはいたんだ。
怪しさ大爆発! というよりは、むしろ不気味な存在。
45 :
デフォルトの名無しさん :04/07/22 12:43
VC.netについて相談させてください。 実行exeにアイコンを登録したいのですがわかりません。 ご教授お願いします。
47 :
デフォルトの名無しさん :04/07/22 13:12
すれ違いって>>1の C++に関する質問には入らないの?
>>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; } これってどうよ?
不問
int main(int argc, char* argv[]) { try { throw int(); } catch(int) { } return 0; } これだけのプログラムなのですが 例外処理 (初回) は hoge.exe (KERNEL32.DLL) にあります: 0xE06D7363: Microsoft C++ Exception。 とデバッガのアウトプットに出るのです。 前は出てなかったような気がするんですが throwを使うと必ず出るものなんですか?
書き忘れました。 VC++6.0 SP5 Win2kです。
機種依存の話は受け付けてません
55 :
デフォルトの名無しさん :04/07/23 19:53
warning C4530: C++ 例外処理を使っていますが、アンワインド セマンティクス は有効にはなりません。-GX を指定してください。
VC++7.1のコード補完は軽いけどテンプレートとかでうまく動かない。 C++Builder6のコード補完は重いけどテンプレートでも使える。 まともなコード補完してくれて軽いIDEはいつでるんだろうか…
マシン買い換えろ
>>55 警告は何も出ずビルドできてます。(リビルドしても変わらず)
/GX オプションも付いていることを確認しています。
試しにGXを外してみたら
>>56 の警告が出ました。
スレ違いとのことなので移動します。
ありがとうございました。
VCのIntellisenceは、なんか初回発動時にハードディスクからガガガガガって音が聞こえてきてちょっと怖い。
62 :
デフォルトの名無しさん :04/07/24 01:44
multisetから重複している要素のみを抽出したいのですが、 どうすればよいでしょうか?
自己解決しました。 adjacent_findでできました
おまんこぺろぺろ
>>63 template<typename T>
void unique(std::multiset<T>& x);
実装貼り付けきぼんぬ。
>>63 adjacent_find は等値判定に基づくアルゴリズムなので、
multisetに対する操作としてはまずいかも。
重複要素の削除かと勘違いした。ごめん。
もう一度
>>62 を読み直したら、どんな動作がさせたかったのかわからなくなった。
ということで、やっぱり実装貼り付けきぼんぬ。
>>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;
}
>>68 欲を言うと,重複要素のカウントはメンバ関数のcountじゃなくて,
自前でイテレータを動かして重複要素を数え上げたほうが速いかも知れないということが1点と,
resultがhogeMultiSetと同じ順序を使っているなら
result(*it++);よりもresult.insert(result.end(), *it++);の方が推奨されるってことが1点.
非常に細かい話で申し訳ない.
後は66さんの言うように等値と等価の違いに注意するぐらいですかね.
More Exceptional C++の和訳は出る予定あるのかな? もしかしてExceptional C++があんまり売れなかったとか?
71 :
デフォルトの名無しさん :04/07/24 10:32
STLportのhashコンテナで比較関数にgreater<>を使ったんですが 降順に正しくソートされません。 MSのSTLだと比較関数のデフォルトにless<>がセットされているのですが STLportだと、_EqualKeyとしてequal_to<>になっているのも気になります。 もしかしてhashコンテナにソートを求めるのが間違っているのでしょうか?
間違ってる
クラスって自分自身で自分自身をdeleteすることはできないのですか? あるメンバ関数の処理を終えたら、自分自身でデストラクターを呼んで 開放したいのですが…やってもいいのですか?
一応できるよ。 でもdeleteした後に自分自身にアクセスしちゃ駄目だよ。
delete this; // suicide
メールチェッカーを作ってるんですけど 参考になるページ教えて下さいませんか? 全然見通しがたたなくって
>>73 そのクラスのオブジェクトをスタック上に作ることはないのか?
>78 当然privateデストラクタでガードだな。
そこですかさず #define private public ですよ
そこで間髪いれず #undef private ですよ
つーか、自殺オブジェクト作った場合も結局はdelete前に、自分を参照しているオブジェクトに通知する必要があるわけだが。
84 :
デフォルトの名無しさん :04/07/24 23:11
一つのクラスを *.h と *.cpp の 2 ファイルに分けて、 実装は原則として *.cpp ファイルに書いてるんですが、 inline const String getName(void) const { return _name; }; みたいな inline 関数とか短いのとかは *.h ファイルに書くこともあります。 でも、なんかこういうのって気持ち悪いと感じるんですよ、性格的に。 関数によってファイルが違ったら統一性に欠けるじゃないですか。 プログラミングってのは美しくないとね。 だから月曜日からは実装は全部 *.cpp ファイルに書け!という 決まりを制定しようとたったいま酒をあおりながら思ったんですが、 別に問題ないですよね? なにかご意見頂ければ幸いです。
>>84 個人で開発するぶんには無問題
ただ、気持ち悪いとかいう主観でそんなことする人間が職場にいたら多分殴ると思う
86 :
デフォルトの名無しさん :04/07/24 23:19
>>84 インラインの実体は *.inl に書いといて *.h から #include するとか・・・
全部.hにかけばいいとおもうが。
88 :
デフォルトの名無しさん :04/07/24 23:20
>>85 ソースの体裁って主観以外の何だ?
肝心なのは空気読むことだろ
テンプレートってヘッダーファイルにしか書けない環境もあるんじゃなかったっけ?
>>85 殴られやしないから無問題☆
>>86 なぜにわざわざ?
>>87 そんなのかっこわるいし!
>>89 テンプレートの場合は *Inter.h と *Impl.h に分けてます。
んじゃあまあ、結論としては全然おっけーってことで。
ご回答ありがとうございました!
92 :
デフォルトの名無しさん :04/07/25 00:07
>>91 86だが、理由は84が述べているから説明していない
まあ酔っ払いの相手なんてこんなもんかw
>>92 あーもう、そういうことを聞きたかったのに!
いまネットで調べてみたら
inline 関数はヘッダファイルに書くんじゃん!
*.cpp に書いたら問題大ありじゃん!
もっと早く教えてよ!
だいたい「決まりを制定」とか大きな口叩いたけど、
現行ソースいじってるのは漏れ一人だし、まだ製品レベルでもなくて
C++入門したての新人だから、そんなこと知らなくても当然なの!
もう寝ます。おやすみなさい。
#前スレ 518-609 だけど今度は追放しないでね(はぁと
素でキモイ…
97 :
デフォルトの名無しさん :04/07/25 09:24
まあMSは*.inlだよね、俺もそうしてるよ。
>>94 同意
ついでに酒飲んでりゃ何でも許されると思ってる人種はくたばれ
99 :
デフォルトの名無しさん :04/07/25 11:48
>>98 「何でも」とはずいぶん拡大解釈したものだな
誰かそんなに許されないことでもしでかしたのか?
真面目くさった勤務を終えた後でくだけた話をするなというなら2ch自体いらないと思うが
無職な人にはここが聖域だったりするわけかw
読解力のない香具師がいるな
102 :
デフォルトの名無しさん :04/07/25 13:51
C++でJavaのinstanceofに相当するものはありませんか? よろしくお願いします。
dynamic_cast を本当に使わなきゃならん時なんてあんまりないと思うが
どうもありがとう
Javaでinstanceofを使いたくなるような時
悲しいとき〜
>>109 C++ 版の union がほしいとき (boost::any とか)
スクリプト言語とデータをやりとりするとき。スクリプト側に C++ 並の型システムを
実装するのは骨なので、スクリプト側には総称的なハンドル型を渡しておいて、
そこから C++ コードが呼ばれたときに dynamic_cast で検証して使う。
>>111 そこの結論はinstanceof使わない方法だろ。
114 :
デフォルトの名無しさん :04/07/25 15:50
多重継承しているときなんかで汚いコードだとは思うがおまえはだれって聞きたくなるときがある。
abstract factoryで一群の公開インターフェイスで返したオブジェクト群が 互いに内部用インターフェイスで通信したいときに dynamic_castで引っ張りだしたりすることはあるな。
116 :
デフォルトの名無しさん :04/07/25 17:04
つーか、virtual 使いまくって dynamic_cast だけ毛嫌いする論理的な議論ってどんなんだ?
>>116 dynamic_castのコストは継承ツリーの大きさが大きいほど大きくなる。
virtual関数コールは定数オーダー。
同列に扱うほうがおかしい。
ディレクトリツリーをコンポジットパターンで操作するとき、必要にならないか?
>>118 ディレクトリかどうかの判定はC++言語じゃなくてOSなりに任せるべきだろ。
かみ合って無いやり取りが続いてるな
>>118 葉も幹もすべて同じ仮想関数を持てばdynamic_castは必要にならない。
が、そうすることが最適解とも思えない。
BorlandC++compilerを使ってコンパイルしたんですが exeファイルが見つかりません。 作成された↑はどこに保存されるんでしょうか? 初歩的なことですみません;
>116 RTTIの必要性
double dispatchとか。
>>123 情報が足りない。
コンパイラのexeなのか、
自分でコンパイルしたモノのexeなのか、
他のexeなのか。
何のexeだ?
dynamic_castはきれいな設計をしたら防げるんじゃないかと思うのが7,8割じゃないかと思うんですが... これは自分に言い聞かせ。 double dispatchにはつかわね。
コンソールに文字を左寄せで出力したいのですが その際に、10文字とか決めて出力したいです。 cout << name << data << endl; とかなっている時に、nameのサイズ決めないと後ろがずれてしまうので… setwだと右寄せになってしまって、できなかったです。 Cではprintfの%-dとかやってたんですが、C++ではどう書けばいいのでしょうか? 初歩的ですいませんが、ご教授お願いします。
C++でもprintf()使えるよ。
>>128 > dynamic_castはきれいな設計をしたら防げるんじゃないかと思うのが7,8割じゃないかと思うんですが...
dynamic_cast を使った方がきれいな設計になることもある。
むやみに dynamic_cast 使うのはやめた方が良いが、
むやにみ dynamic_cast 禁止するのもやめとけ。
>>130 返答ありがとうございます。
この場合はprintfとかを使うしかないのかな…
>>123 は「コンパイルした」とは書いてるが「リンクした」とは書いてないところが気になるが。
まさかとは思うが、デスクトップに自分で作ったbcc32.exeのショートカットをダブルクリックしてるとか。 (藁
あと、そのショートカットにソースをドロップして「コンパイルした」とか...。
いや、冗談じゃなくて、本当にいたんだよ、こーゆーアフォが。
>131 禁止はしないんだけれど、なんか引っかかるんですよね。 dynamic_cast使うと結局もしこれだったらって言うコードになるから。
boost::formatとか
cout.setf(ios::left)とstd::left、どちらもちゃんとできました。 boostについては、使ったことがないので、いずれ勉強します。 ライブラリダウンロードしたりしなくてはいけないようなので。 皆さん、親切にありがとうございました。
boost っていつになったら組み込まれるんだろう
よくわからず環境変数を設定してadministrator>bcc32を実行したため その下のディレクトリに保存されてました。お騒がせしてすみません、、 アドバイスありがとうございました〜
142 :
デフォルトの名無しさん :04/07/26 06:38
子クラスを引数としたメンバ関数内から 子クラスを親クラスに代入するのって class Hoge2::Hoge1; Hoge2::HogeHoge(Hoge1 *hoge){ this->… = hoge->…; … } って感じで力技でやるしかないんですか? this = hoge; って感じでやりたいんですが。
>>142 Hoge1::operator=(Hoge1 const&) が正しく定義されてるなら、
*(Hoge1*)this = hoge;
で良いんじゃない?
>>142 Hoge2::HogeHoge(Hoge1 *hoge){
Hoge1::operator =(*hoge);
}
145 :
デフォルトの名無しさん :04/07/26 08:16
>>144 (*hoge);
この括弧は関数呼び出しの括弧になるの?
>>145 Hoge1::operator=(Hoge1 const&) が正しく定義されてるなら
Hoge2::HogeHoge(Hoge1 *hoge){
*(Hoge1*)this = *hoge;
}
じゃないかな?
っていうかHogeHoge自体不要
そう
>142-147 そんなoperator書いている後輩がいたら有無を言わさず消去する人 ノシ
お前らなんか間違ってないか? >子クラスを親クラスに代入する んだから、 *this = *hoge; で十分だろ。
>>148 お前の存在が有無を言わさず消されるといいな
delete 150
155 :
デフォルトの名無しさん :04/07/27 00:39
>>149 (Hoge1)*this = *hoge;
*(Hoge1)this
158 :
デフォルトの名無しさん :04/07/29 10:45
ああ
なんですか?
160 :
デフォルトの名無しさん :04/07/29 12:02
ネタない?
162 :
デフォルトの名無しさん :04/07/29 12:04
privateとprotectedの違いってなんだっけ
class A { protected: int a; private: int b; } class B : public A { void Hoge() { a = 0; //OK b = 0; //エラー } }
なんかこのスレも門下金柑だな
>>162 ごめん君には基礎は教えられない。君に理解できるとは思えないから。
void Unko(Poko** p) { *p = new Poko(); } void Unko(Poko* p) { p = new Poko(); } int main() { Poko* p; Unko(p); Unko(&p); } どう使い分ければいいのですか?
#include <iostream> int main() { Poko* p = 0; Unko(p); std::cout << p << '\n'; Unko(&p); std::cout << p << std::endl; }
>>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 反復子が必要
C++しらないけどconst渡したとか?
begin()とend()渡しただけなので普通のiteratorだと思うのですが。
>>171 まずくないはず。
g++で通ったし。
コンパイラとバージョンは?
>>172 それは問題なし
>>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;
}
BCB6です。 Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
>>175 警告 W8091 tewst.cpp 19: template の _InputIter 引数('for_each' に渡される)は
output 反復子:input 反復子が必要(関数 main() )
との事です。
>>177 なぬぅ!? 私のはg++ 3.3.4なんだけど,この警告は何なの?
因みに実行は問題ないんですよね?
tewstはファイル作る時にtestとタイプミスしただけです。
setのiteratorをoutputと申告するようなstlは捨てちまえ。 ところでBCCの警告はテンプレート引数名に反応してるのか? 親切だな。
あー、俺もBCB使ってて、以前から「なんだろこれ?」と思ってた。 問題が起こってるようには見えないんで、無視してるけど・・・。
反復子って単語知らなかった… どこのコンパイラか知らんが,iteratorまで翻訳するなよ(><
BCC5.6.4のSTLはSTLport4.5.3だよ。BCCが悪いのかSTLportのバージョンが古い のが悪いのかわからんが、時々おかしな警告は出るね。(KT変数がどうのこうのとか)。 しかしSTLportなかなか新しいの出ないね。gcc3.4.0への対応に手間取っているら しい。かなり変更点があったからね。
std名前空間のなりすましとコンパイラ提供のiostreamを混在させたときに破綻してたのは解決したんだろうか?
187 :
デフォルトの名無しさん :04/07/29 23:59
警告 (藁8091
イテレータ イタレータ どっち使いますか?
190 :
デフォルトの名無しさん :04/07/30 00:26
-藁
-w付けろよデコ助野郎!!
痛レータ
板前の源さん
void型のポインタを宣言して そこに動的に確保したクラスのポインタを収納して 必要なときに、dynamic_castか何かでキャストして取り出してそうさすることは可能ですか? さまざまなクラスのポインターを一様に収納できる入れ物を作りたいのです。 void *ptr; class1 *hoge; hoge = new class1(); ptr = hoge; class1 *test; test = dynamic_cast<class1*>(ptr); test->〜 test->〜 これは可能ですか?
>>196 5分もかからないのに、なぜやってみないのですか?
>>196 reinterpret_cast でならできるよ。
どうやって型を覚えておくのかはしらないけどね。
なんでアップキャスト使わないの?
>>198 static_cast でも大丈夫だと思う。
どうやって型を(ry
型の覚え方は簡単です。 実はこの間に仲介するクラスがあって。 publicメンバーで int型とvoid*型が宣言されています。 intが1であったら class1で型キャストする intが2であったら class2で型キャスト intが3であったら… という風にしようとおもっています。
>>203 「可能かどうか?」と聞かれれば「可能」だが、
絶 対 に 設 計 を 見 直 し た 方 が い い !
そうですか… しかしメインのタスクシステムがあってそのタスクシステムから 他の機能モジュールへ実行命令を発行させようとおもったらこの形がいいかな とおもって… こういう設計は、バグの要因になるでしょうか???
>196 なにするかによるが、たぶん設計間違ってる
実はタスクシステムはスレッドが回っています。 そしてList型をprivateメンバーに持っていて。 そのList型に class Ctask{ public: int TaskType; void *ptr; } こう言ったtaskクラスが順に格納できるようになっています。 インターフェイスからCtaskに適切な情報を入力して。 このタスクシステムのListに放り込んでやったら。 タスクシステムが順にListを呼んでいって、TaskTypeに適切なクラスにptrをキャストして 実行すると…というふうなシステムを考えました…
CCtask多重継承しときゃいいやん。
>>209 boostはしりません…(TT
STLで同じようなものはないでしょうか?
>>211 えっとどういうことでしょうか?
もっと詳しく教えてくれれば幸いです。おながいしますm(_ _)m
>>196 >さまざまなクラス
とやらの基底クラスを作れ。void*の代わりにその基底クラスへのポインタを持て。
全部の昨日モジュールクラスがこれから派生する。 class CCtask{ virtual public void Execute(){}=0; } 見たいな感じで。 単一継承でもいいけど
class AbstractTask { public: virtual void Process() = 0; }; class TaskA : public AbstractTask { //いろいろ } class SugoiTask : public AbstractTask { //いろいろ } class ShoboiTask : public AbstractTask { //いろいろ } std::list<AbstractTask*> taskList; これじゃあ駄目なの?
それか呼び出し自体をファンクターにしてそれを保持しておくとか
>>216 そのとおりです…
機能モジュールは何か共通のクラスから派生しているわけではないです…
だから多重継承したらいいやん。
機能モジュール変更できないならファンクター使うべし
>>217 なるほど、この方法なら僕のけったいな設計よりはるかにスマートですね。
ちょっとコードを書いてみます。
>>221 ファンクターってのは…なんでしょう…ぐぐってきます
変更できるのかよ…
機能モジュールはいくらでも変更可能ですw
まだまだコーディング段階なので…
いわれてみれば
>>217 さんの言うようなシステムでまとまりますね!
まだまだ経験が足りないようです。
みんなありがとう!
こーどーも電話っ相談室ー
また一人ヤバすぎる設計をする馬鹿を救う事が出来た
ある意味、そのような機能を実装するのにリフレクションもどきを使おうとする196に才能の片鱗を見たが
>>227 猪突猛進中が多いなか、素直な奴で良かった。
おまえは伸びるかもしれない。周りにいい奴がいればな。
が、こいつは多態も知らずに……いや、なんでもない。がんばれよ。
>おまえは伸びるかもしれない。周りにいい奴がいればな。 周りには誰もいない(TT…(学生なもので
学生が無人島からアクセス
>196 始めてどのぐらい?
関数の中の引数と関数の中の変数の名前が同じ場合名前を変えないでやるにはどうしたらいいですか?
COM の IUnknown は、相当イカス仕組みだと思う。 とくに QueryInterface はナイスアイデア
>>236 変えないでやる方法があるはずです
おしえてください
クラスの中のメンバー変数とメンバー関数の引数の名前が同じだからです これを変えてしまうとシステムを初めから構築しなければなりません
それなら this してください
>239 だったらはじめから作り直したらどうですか?
thisとはどのようにしてつかったらよろしいのでしょうか?
ググって下さい無能
かしこまりましたグッグてみることにいたします
りファクタリング使えボケ
りファクタリングとはどのようにつかったらよろしいのでしょうか?
ググれよ...
C++のまともなりファクタリングツール内の?
ない
this->aがメンバー変数になるのはわかりましたが メンバー変数ではなくてメンバー関数の中で変数を定義した変数と引数の名前が同じ場合は どうやればいいですか?
>250 無理だっつーの。 そもそもコンパイルも出来ないんだから、素直に書き換えろ。
>250 聞いてる間に書き換えられませんか?
たまたま宣言した変数がバッティングしただけで何でシステム全部書き直す必要が出てくるんだ?
高度にカプセル化してあるので書き換えするとバグが出る可能性が高そうです
いっそのことクラス名からメソッド、メンバ、一時変数全部同じ名前にしたら?
>253 システム全部が同じメソッドに入っている
可能 ついでにnamespaceも一緒にしとけ でそれが出来たらなにがしたいんでしょう?
259 :
デフォルトの名無しさん :04/07/30 19:40
「関数の引数の名前」って・・・。とんでもなアホなのか。
C++ようのりファクタリングツール作ったら売れるかな?
>高度にカプセル化してあるので書き換えするとバグが出る可能性が高そうです あきらかに、いい加減なカプセル化がしてある例だろう。
264 :
デフォルトの名無しさん :04/07/30 20:56
プログラミングのことで質問があります。 ある関数z=f(x,y)を数値計算し、各(x,y)ごとにzをプロットしたい のですが、どのようなプログラムを組めばよいでしょうか? プログラミングで絵を描かせるというよりは、出力されたファイルを 他のソフトで開いてその分布を表示させる、という形にしたいのです。 特に、連続的な(x,y)をどのように離散化させて出力するか お聞きしたいです。 Excelでも出来るかもしれませんが、どうしてもプログラミングで 行いたいのです。 できれば、C++をもちいておしえていただければ幸いです。 すみませんが、よろしくおねがいします!
無粋な人だ
>264 なにを聞きたいのでせう? 範囲広すぎてたまらん
>>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;
}
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"こんなかんじです。おねがいします。
>>270 sprintf
他には非標準だけどitoaとか
>>270 int i0 (123);
boost::lexical_cast <string> (i0).c_str ();
ありがとうございます。 標準ライブラリの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 にいきなり書き込むな
>>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); } にしてみろ。
>273、>276 おまえも、おまえもC++禁止。C#でも使っててくれ..
あんなコード核奴は許さん
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; }
ネタならねたといってくれ...
C++止めろとは言わんが、初心者スレに移動してくれ。
何でポインタ理解出来てないんだよ
284 :
デフォルトの名無しさん :04/07/31 08:22
× stdio.h ○ cstdio
そこつっこむところちゃう
>>274 sprintfもstdio.hの中にプロトタイプがある。
こう…?やっぱり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; }
ここは C++ スレですよ? ostringstream oss; oss << a;
どうでもいいけど、ostringstreamって長いよな、名前が。
>>288 math.h→cmath
log→std::log
fabs→std::fabs
それからiostreamをインクルードしてるのになんでsprintf()とかprintf()なの?
インクルードするならcstdioだろが。当分C++スレに来ないでくれないか。
>>290 長けりゃtypedefすればいい。
>>291 fabs→std::abs
の方が良くないか?
あと、言葉遣いは丁寧にな。
関係ないが std::assert() と書いて悩んだことがあるのは、俺だけ?
assert()って使ったことない
実行時エラーチェックなんてダサすぎ。 全てコンパイルタイムに検出、これがC++。
へー。C++って凄いんだね。これならCppUnitなんていらないね。
質問させてもらいます・・ ゲーム画面に文字を表示したときに文字の背景が白なんですが、 この背景を変える方法はありませんでしょうか ググってみたりいろいろ調べたんですがまったく見つからず困ってるところです・・
C++にゲーム画面に文字を表示する機能や 背景を変える方法はありません。 コンソールに文字を出力する機能ならありますが。
全部コンパイルタイムなんてムリ
>>299 >ゲーム画面に文字を表示したときに文字の背景が白なんですが・・・
とっても面白そうなゲームですね。なんというゲームですか。
ゲームの名前を教えてください。
それがわからないと、答えられません。
すいません、WIN32APIての使ってウインドウ作ってまして、 sprintf関数とTextOut関数で表示させてるんですが こういうのになるとスレ違いなんでしょうか?
>>304 ど、どうも・・失礼しました(´・ω・`)
メンバ関数をqsortの第四引数に渡したい場合どうしたら良いのでしょうか?
MURI
緩衝コードを書く
緩衝コードとは何でしょう? 例えばこんなのですが? class C; static C* g_ptr = NULL; class C { public: void f(){} C(){ g_ptr = this; } }; void f() { return g_ptr->f(); } でもグローバル変数使うのが嫌でつ
std::sort は使えんのか?
メンバ関数ポインタは関数ポインタよりでかいからqsortに渡すのはムリだな
>>309 一口にメンバ関数といっても
比較対象を lhs と rhs としたときに
lhs.compare(rhs) と someobj.compare(lhs, rhs) のどっちの形だ?
前者の場合であれば、compare(lhs, rhs) の形の非メンバ関数でラップしてやるだけ。
後者の場合、静的オブジェクト使いたくないのなら std::sort 使った方がいいだろう。
315 :
デフォルトの名無しさん :04/08/01 00:16
ポインタに大小なんてあるんか?
64bitOSならポインタは8バイトだろ。 32bitOSならポインタは4バイトだ。
317 :
デフォルトの名無しさん :04/08/01 00:23
>>312 リップマンの本にだって書いてあるぞ
それ以前に実験くらいしてるのかよ
>>316 おまいの言ってることは残念ながら滅茶苦茶だが、それはおいといて、
315のような質問に、そういったニュアンスの答えをしたくなるわな。
(316の言ってることは正しくないが、316がどういうことを言いたかったかはわかるということ)
さて、それをふまえると
>>311 に対しては、やはり ハァ? というリアクションしかでねぇだろう?
>>311 > メンバ関数ポインタは関数ポインタよりでかいから
単純に型が違って変換できないだけなのに、
実装依存の理由を持ち出すのは感心できない。
321 :
デフォルトの名無しさん :04/08/01 00:34
どなたか教えてください。 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を使ってます。
見づらくてすいません・・・タブは消えてしまうみたいですね。 // 確保する 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; } 長文ですいません。
>>321-322 ・std::vector 使ったほうがよくない?
・new3Dの第1引数は何?
・delete3Dの第1引数が参照になってるのは何故?
>>324 >delete3Dの第1引数が参照
これはたぶんdelete3D内でp = 0; なんてやるつもりなんだろうけど。
>>321 new3D内のoperator new[]やXのデフォルトコンストラクタが例外を投げると、
それまでにoperator new[]によって確保成功したメモリがリークします。
あと、new3Dとdelete3Dとで、同じテンプレート仮引数名に対する型が違うのは良くないので、
template <class X> void delete3D(X*** p, int x1, int x2); としたほうがいいでしょう。
324につられてレス番まちがえた。正しくは
>>322 宛て。
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; }
>>329 コンパイル通らないソース貼ってどうするよ。
それ以外にも、基本的にダメ。
すべての new で例外が発生することを考慮しないといけない。もう少しシミュレーションを密にせよ。
Xのデフォルトコンストラクタでの例外を考慮すると、catch(...)が必要。
あと、巻き戻し処理が終わったら throw; で受け取った例外を外にそのまま伝えるべし。
・・・と、まぁ真面目に例外処理を行うためには必要な知識も多く、コーディングも面倒だから、
おとなしく std::vector 使っとけってこった。
>>330 あれ?僕のだとコンパイル通るのですが・・・
とりあえず、力不足でした・・・。
やっぱりvectorで作ってみることにしますね。
アドバイスありがとうございました。
>>331 ほんとうに通ったのか?
少なくとも、pのスコープがtryの中なので、catchの中とreturnの時点では使えないはず。
333 :
デフォルトの名無しさん :04/08/02 00:16
>Xのデフォルトコンストラクタでの例外を考慮すると、catch(...)が必要。 例外指定による >あと、巻き戻し処理が終わったら throw; で受け取った例外を外にそのまま伝えるべし。 ミッションによる >必要な知識も多く、 こんな程度で多いと言う人の基準が謎(精一杯の好意的表現) >コーディングも面倒だから、 だったら std::vector なんか使うより C++ から撤退すべき んで、 >基本的にダメ プ
>>332 pというグローバル変数があるのでしょう。
何一つ論破出来てないんですが
釣りは放置しろ
337 :
デフォルトの名無しさん :04/08/02 08:21
absやfabsfを使い分けるのが面倒なのですが 勝手にうまくやってくれる関数はありませんか?
>>337 VC++ならabsはオーバーロードされている。
340 :
デフォルトの名無しさん :04/08/02 11:31
C++ のファイル入出力やロケールは、かなり奥が深いのに、 Web上にドキュメントがほとんどない。 日本語で書かれたオススメの本または、web サイトがあれば教えてください。 ちなみに今知りたいのは、basic_filebuf のカスタマイズについてです。
テキストファイルの中に指定の文字があったら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; }
>>341 -1のあたり。
つーか質問する前にちゃんと動くか位試せよ。
>>342 いえもちろん動かした上です
環境はVC6です
そこ以外は問題ないのでしょうか
-1でちゃんと動くの?
ちゃんと動くね。 わざわざstringを使う必要ない気がするが。
普通はstring::nposと書く。
てぬいて書く分にはいいんでないの? その分他の仕事したほうがいい!
>>344 >>346-347 初めて見た例が-1だったため、ずっとこれでやってました_| ̄|○
>>345 やっぱり普通に>>で文字列取って、strcmpとかの方が良いのでしょうか?
早速、書き直します
皆さんレスありがとうございました
いや自分で比較ルーチン作るかでなければ今のでいいんじゃない? −1でいいのかは知らん.
magicnumberの使用
>>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 );
よく見るコードだから、取り立てて言うまでもないけどさ…
ほんとだな。ファイルでかかったらメモリ食い尽くすし。
どこでこんなのをよく見るんだ・・・
perlとかならよく見る。
358 :
デフォルトの名無しさん :04/08/02 22:29
ifstreamで全て読み込み終わってEOFとなるとseekgによって ファイルポインタを動かすことができなくなるという仕様らしいのですが 再び先頭から読み込みたい場合はもう一度、ファイルを閉じて開いて というようなことをするしかないのでしょうか もっと上手い方法をご存知の方がいらっしゃいましたらよろしくお願い致します
clearすればええやん。
>358 そこらへんのapiの動作に依存するのやで全部かいてますが 自分でバッファも確保しうまくやる
>>341 禁則やWordWrapの問題があるんでない?
2行以上にまたがった比較もしないといけないケースはないの?
362 :
デフォルトの名無しさん :04/08/03 00:03
>>355 最近のOSならば、vector::reserve で 20MB くらいの確保なら余裕だし。
それに、std::distance でサイズ調べて、あまりに大きかったら分割すればOKっしょ。
いや明らかに糞だよ?
プゲラ
366 :
デフォルトの名無しさん :04/08/03 02:52
std::listってどんなときに使うの? std::dequeでよくね? つーか、ぶっちゃけいらないんだけど・・・
初心者には必要ないよ
vectorやlistってハンガリー記法だとどんな接頭語になるの?
クラスに接頭語はつけないだろ アルファベットが足りなくなる
>std::distance でサイズ調べて オイオイ、めちゃくちゃ時間かかるぞ
>>368 俺はvectorとstringは例外的にvc, strを付けているけどそれ以外のクラスに接頭語は付けていない。
つかハンガリアンスレ行け。
>368 うちの会社で駆逐したハンガリアン派がまだいたか
ダサイかダサくないかの問題ではない
ハンガリアン使わなくなったけど、いまだにポインタにはpを付ける。
変数名が短い時代は終わった。ポインタは接尾辞にPtrだろう。
>>379 >変数名が短い時代は終わった。
だったら接尾辞にPointerじゃないの?
ただのなんかのカウンタのローカルポインタなら
localTemporaryCountPointer
>>380 コード補完が無い環境とか1行に表示できる文字数が少ない環境にとっては嫌がらせに近いな。
localTemporaryCounterInHogehogePointerToSignedInt32bits
localTemporaryCounterInHogehogePointerToSignedInt32bitsButShouldBeScoped_ptrAtBoostLibrary
変数名を考えるだけで一日が終わりそうだ
>>381 最初spとか付けようと思ったけど
そんなことやってるとハンガリアンに戻りそうだったので
何も付けないことにしてる。
pとか言ってる時点でハンガリアンケテーイ
>>382 それが狙いなんだよ。
糞エディタ捨ててIDEを使えと教育してやってるの。
ポインタにp付けるのは,C++以前,K&Rの頃からあると思うが… ハンガリアンだと,lpとかじゃないの?
>>389 lpはポインタにfar/nearの区別があった頃の名残で、比較的新しいAPIはpに変わってきている。
ハンガリアンマンセーな奴とアンチってどこにでも見かけるんだけど、実際プロの現場ではどうなのよ?
もちろん両方いるよ。 ただハンガリアン使わないほうが賃金が高いという傾向にあるという統計データが出てるよ。 もちろん表記を使うかどうかで差が出るわけではなく 賃金の低いC/C++のロートルプログラマが好んで使うというカラクリ。
あやしいー
C++限定だけど、 非ハンガリアンはハンガリアンのことをアホだと思っているけど、 ハンガリアンは非ハンガリアンのことを「なんでこんな便利なのに使わないんだろう」程度に思っている。 私は非ハンガリアン。 Cでハンガリアンなのは構わないけどね。
なんで C++ 限定なの?
OOP だろ
C++使ってると、ポインタ/スマートポインタにpは付けるな。 アンチハンガリアンが過ぎるあまり、型情報を含んだ接頭語自体を 必要以上に毛嫌いしすぎてる気がする。 gotoみたいに、分からなくてもとりあえず排除しとけばいいってモンでもないのに。
C++だと継承とか多態性とか。 抽象クラスの変数に実装クラスのインスタンスを割り当てる時とか。 ハンガリアンじゃ困らないか? intとかのプリミティブな型はどっちでもいい。 変数へのアクセスって自クラスからか、ローカルか、friend関数・クラスからしかありえないと 思うんで(グローバル使ってるのは論外)。 そんなものは、どう付けようと宣言がすぐそばにあるはず。 IDE使わなくても何型かすぐわかるだろ? ただ、名称は意味のあるものにしてほしいけど。
メンバ変数を区別するかどうか これが悩む
ハンガリアンてなに?
オレ、goto使ってるけどな。
多重ループ抜ける goto とか上から下のみの goto な許せる
>>399 どちらでもいいと思う。
ローカル変数とメンバ変数の区別だけなら
メンバ変数の前にthis->をつける
メンバ変数の最後にアンダーバーや最初にm_
など。
>>400 M$の一プログラマが決めた変数の命名規約。ハンガリー出身だったからハンガリアン規約と呼ばれる。
当初M$は推奨していたが、今は非推奨。
>>401 C言語でエラー処理を一カ所にまとめて記述するのに用いるのはそう悪いことではないという人もいる。
C++だと悪。
というか、ネタ?
マジレスごめん。
>>399 ローカルじゃないのは、ほぼ間違いなくメンバだろうし
ローカルとメンバの区別さえできれば良い気がするんだけどなぁ。
でも世のサンプルはm_とかついてるの多いよね。
おいらローカル変数は小文字のみでnum_applesみたいに
メンバ変数はnumApplesって感じにしてるけど、良いのやら悪いのやら
403さんとかぶった DirectXのMSによるサンプルは、 C++だけどエラー処理にgoto使いまくってるねぇ
エラー処理といっても、そのエラーが頻繁に起こりうる場合は 例外は使いづらい。
エラーってどうしておこるの?
仮引数やローカル変数とメンバの区別はthis->でいいけど コンストラクタと初期化リストの場合は区別できないから悩む。 メンバにm_とかケツアンダースコアとかつけたくないけど、 仮引数の名前にそれをつけるのも気が引けるしな。
人間が無能だからさ
だからといってgoto文を使っていい理由にはならない。 if else で何とかするか、設計を見直してみる。 以前みた一番酷いgotoは、forの2重ループの中のif文の中に飛び込むやつ。 外部からきた完成品なもんで修正することもできず、そのまま利用。Cだったけどね。
>>408 じゃあ
>>404 さんみたいに小文字と大文字でとかどうだろ。
むずかしいね、そこんところは。
自分ひとりでやるのならa b c d e f g h i j k l m で十分と思う
if else で何とかして見難くなるくらいだったら、 オレは喜んでgoto使うな。っていうか使ってる。 関数の最下行のreturn(...);に飛ばすときだけだけど。
素直にメンバ変数にm_付けてて何の不自由も感じないよ。
>>410 うへぇ〜。。。。。
CPU時間が厳しい場所で例外も関数呼び出しもイヤな状況下でgoto使うのはそれほどイヤじゃないけど。
ループの中に入るなんて。。。。
>>414 戻値のチェックをするときは一箇所にまとめたほうが楽だからね。
いろんなところで return があると見にくい
tryのthrowでchatchしてリターンさせれば?
>>410 > forの2重ループの中のif文の中に飛び込むやつ
それは論外ですね。掟破りでしょう。
それ作った香具師は逝って吉ですw
>>417 戻り値のチェックは普通、外側でやるもんじゃないの?
ハンガリアン、gotoスレ逝け。 この低賃金どもが。
>>421 そうとは限らないす。
戻値によってreturnする前の内部あと処理を分けたいときなど。
とにかく、処理の流れの中で、必ずここを通るってのがあると、 デバッグとかしやすいかな。
>>422 もしかして、forループ内にgotoで飛び込んじゃう人でしょ。
恥ずかしいからって切れなさんな。
428 :
デフォルトの名無しさん :04/08/03 18:18
標準C/C++ ライブラリで、ファイルサイズを求める関数・メソッドはありますか?
あと、ついでに、ファイルのコピーと、ファイルの削除を行う関数もありましたら教えてください。
ない
remvoveってあったような。
removeね
>>429 ファイルコピーをする関数は標準ライブラリ関数だけで当然作れる。
ファイルの内容だけならな
俺たちは、ファイルのコピーすら、OS の力を借りないと出来ないのか…!
ハードディスク会社が独自のAPIを開発してくれればいいんだよ
よー考えたら全部仮想化の賜だな
439 :
デフォルトの名無しさん :04/08/03 19:50
C++.NETなら標準でできるよ
C++って非力だな。 N88BASIC以下じゃん。
そりゃそうさ、いちいちコンパイルしなきゃな上 GOTO使えば怒られる始末だからな
BASIC の単細胞ぶりが羨ましいぜ
AUTO 10
444 :
デフォルトの名無しさん :04/08/03 21:28
初歩的な質問で申し訳ありませんが, クラス内にprivateで配列を宣言したとき, その配列の値をもらうためにはクラスに十分な大きさの ポインタなどを渡して,クラス内の関数でポインタに値をコピーするしか方法は 無いのでしょうか? それともprivateで宣言した配列のポインタを取得してクラス外で操作しても 問題無いのでしょうか? 前者だと,配列の大きさによっては処理に時間がかかってしまいます. 後者だとprivateで宣言した意味が無いような気がします.
>それともprivateで宣言した配列のポインタを取得してクラス外で操作しても >問題無いのでしょうか? 問 題 な い わ け な い だ ろ ! !
>>444 後者。こんなこともやれる。
class Hoge {
char Buf[255];
public:
char *GetBuf() {return Buf;}
};
std::stringのc_strなんかのようにconstポインタを返すこともある。
>>444 constなポインタなりイテレータを返せばいいやん。
「その配列の値をもらう」って、「クラスの中から外へ」と「クラスの外から中へ」とで曖昧じゃないか? 答えてる人たちはどっちだと思って話してるの?
>>449 同じことだろ。
publicなポインタ取得メソッドを用意して万人にさらけだすのは問題だが
自メソッド内で他クラスにポインタ渡して操作してもらう分には無問題(であることもある)
class Unko{ char buf[100]; public: char getAt(int i) const{ return buf[i]; } void setAt(int i,char ch){ buf[i]=ch; } };
private メンバのハンドルを const もつけずに返そうとしてるんだったら、今後の身の振り方を考えた方がよい
>>450 >Bufがprivateである意味は?
あとで
class Hoge {
char* Buf;
public:
Hoge() { Buf = new char[max_buffer_size] };
char *GetBuf() {return Buf;}
};
とか変更しやすいようにじゃない? sizeof とかされたくないジャン。
>>453 例えば 2次元の画像データのバッファを抽象化した Bitmap クラスなんかでは、
const じゃないポインタを返すのも十分ありだと思うけど。
しかしレベル低いな
クラス外で作った配列をクラス内の配列に一気に持って来たいならコピーするべきだし、
それがメモリ容量、スループット上問題になるなら
>>452 みたいにちまちまクラス内部
の配列に直接書くなり、もっと効率のよい関数を作るなりするべき。
さらに、それらが現実にそぐわないなら・・・・
classで宣言するからよくない。structで宣言してこれはちょっと便利な 関数つきの構造体ですよと言い張る。
privateなのにメンバ関数もなしにいつの間にか値が変わってる… そんなことなら最初からpublicにしてくれyo!
>>444 です.
レスありがとうございます,とりあえず後者でも問題無いと言うことでよいのでしょうか?
(少し理解しきれてない模様です...)
あと,ちょっと疑問に思ったのですが,
>>451 で
>publicなポインタ取得メソッドを用意して万人にさらけだすのは問題だが
つまり
class Hoge {
char Buf[255];
public:
void *GetBuf(char *buf) { buf = Buf;}
};
このようなのはダメってことで良いのでしょうか?
微妙に間違えてました. public: void GetBuf(char *buf) { buf = Buf;} です.
>>462 strcpy( buf, Buf );
じゃダメなのか?
>>462 は引数の値を変えただけ。
外部には何の影響も与えないけど。
あああ,何か基本的なことを間違えていたようです.
それで,話を勝手にふくらませてprivateがうんぬんとか考えていたようです.
>>461 みたいなことをやっていました,orz
とりあえずプログラムは動きましたが,
頭は夏休みらしいので逝ってきます...
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; } } こうしたのですが、もっとスマートな書き方ないでしょうか?
gotoって好きだなぁ。
>>468 なんか目眩がするコードだな
例外が出た時点でオーバーヘッドなんて言葉はでないと思うんだが
例外処理は例外に使いなされ…
>>468 func_throws_exceptions()が投げる例外オブジェクトに
counterの値を記録すればすむんじゃ?
↑そういう問題じゃないんだな。
>>470 が正しい。
自演乙
>>470 throwが重いのではなく、try/catchが重いから困ってるんですよ。
20万ファイル位あるディレクトリでファイルの情報を取得する処理なんですが、
スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。
ループの中にtry/catchを入れると遅くなるのを回避したいのです。
>>468 これって例外オブジェクト開放されんの?
>例外処理は例外に使いなされ… の意味がいまいちわかんないのですが、 もしかして func_throws_exceptions のところで、 自分で if (hogehoge) throw exception; とかやってると思ってます? 472さんとかが理解してるような書き込みしてますが、 よければその辺ちょっと教えてもらえないでしょうか。
>>474 > スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。
本気か?例外を通常処理の分岐に使ってる時点で駄目
煽りじゃないぞ
例外というのは例外的な処理を行うためのシステムなので、多用して重いと文句つけるのはアレだ。 ということでしょ。めったに起きない珍しい事態になんで効率を云々するんだと
>>477 アクセス権が無いのも例外でない
ファイルが存在しないのも例外でない
何らかの障害によって開けないのも例外でない
例外って突き詰めてしまえば条件分岐なわけで
その言い分だと例外を使う事自体あってはならない事にならない?
駄目だここアフォしかいない
>>487 めったに起きない珍しい事態になんで効率を云々するんだと
それは関係ないと思います、実際に例外が発生しなくても
ループ内に try/catch が紛れ込んでいるだけで重くなるから悩んでるんです。
例外が発生したときだけ重くなるのなら、何も問題はありません。
tryで囲んだ時点で入り口と出口でコードが生成されるので重くなって当たり前。 でもIOの方が重いだろ多分。
とりあえず例外あんま吐かないならこう書き直せ。
>>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;
}
}
速度を求めるなら別の手段を考えるのは当然。
この場合ファイルの有無をチェックして、func_throws_exceptionsがフラグ返すだけでいいしな。
そもそも例外処理なんてのが作られた経緯を考えれば、
>>479 みたいなアフォな意見はでないんだがなぁ。
>>484 おいおい、それじゃ例外が出たあとの処理が468の意図と違うだろ。
まぁ例外が出た時点で諦めろって感じだがな。
おっとすまん、読み違えてた。読みづらいなぁと言い訳。
485はnewが例外を投げるのすら許せないんだろうな。 たとえば.NETのFileStreamクラスとかでも例外投げてるんだし、 クラス製作者の分析センスに依存するというだけの問題だろう。 アフォとか読みづらいとか、人を貶す言葉しか出てないけど いわゆる見下し厨というやつなのだろうか。
まあ、現実的な解は、 try内にforを置いて、 for内で、例外が発生しそうか、ある程度チェックして、 そうならcontinue、そうじゃなくて例外が発生しちゃったら、 異常事態扱いであぼーんってな感じじゃないかと。
例外で悩んでいると言う質問があれば、とりあえず 例外を分岐に使うなと煽るのはテンプレみたいなもんだ。
しかしム板見てると自分がいかにレベル低いかが分かるよ・・・ 大学のプログラムなんて研究用だからCでアルゴリズムばっかりだし、趣味でやってると細かいこと気にしないから上達しないし。 どうにかスキルアップしたいもんだ。
すごいスレが進んでるね、意外に支持派が多いのにびっくり
>>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()
>20万ファイル位あるディレクトリでファイルの情報を取得する処理なんですが、 >スキップするためにファイルオープン時の例外をつかまえないとならないので・・・。 statとかの例外投げないの直接呼べば?
例外ってださいな
470が横着せずに、493のレスを470の時点でしていれば荒れなかったなw
スタックオ(ry
今回の例とは違うだろけどロガーなんかの場合はエラーが 出たらそれを通知して続行するべきで処理を中断するわけにはいかないだろ。
どう見ても問題は func_throws_exceptionsでoperationsのコンボの仕様だろ?
#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; }
void func_throws_exception(){} void operation(int){}
$ g++ -O3 main.cpp sub.cpp && ./a.exe try_in_loop : 20.329 try_outof_loop: 21.04
gccならtryのオーバーヘッドはほとんど除去できている模様。
>>468 が実測無しで「try {} catch() {} のオーバーヘッドの所為で」と言っている可能性もある。
>>504 あれ?もしかして、なんか処理間違ってる?
>>506 gccならって時点で本題から外れてるじゃん。
try,catchのプロローグコードとエピローグコードが重い事を前提に議論してるんだし。
あ、カウンタが進んでないな。 goto の前に ++counter; を入れないと処理が違う。
>>508 重い処理系での計測結果きぼん。
Borland C++ 5.6.4(BCB6) bcc32 -O2 try_in_loop : 31.55 try_outof_loop: 14.62
少なくともC++では、例外に関しては実行速度は全く考慮されていないからなあ。
VC++7.1 cl -O2 try_in_loop : 0 try_outof_loop: 0 やっぱVC++の最適化は格が違うね
>>513 別ファイルに分けても消されるのか?すげえな。
sub.cpp を以下に変更して追試してみてほしい。
volatile int n;
void func_throws_exception(){++n;}
void operation(int){n=0;}
>>514 それじゃ throw() と解釈されるかもしれないから、
void func_throws_exception(){++n;if(n<0)throw n;}
くらい入れといたほうがいいかも。
>>514 try_in_loop : 0.43
try_outof_loop: 0.441
catch(std::exception const&) だから、throw std::exception() にしないといけないな。
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; } } }
>>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 への答えとしてはこれが適切と思う。
521 :
デフォルトの名無しさん :04/08/04 11:57
std::nth_element(vec.begin(), vec.begin(), vec.end(), HogeComparator()); 最も条件に適合する要素を先頭に持ってくるコードですが、 これより良い方法はありますか? あったら教えて下さい。
何かを勘違いしちゃってるな
とりあえず std::partial_sort(vec.begin(), vec.begin(), vec.end(), HogeComparator()); よりはnth_elementの方が速いと思うのですが。 先頭に来て欲しい要素が1個なので結果は同じですよね?
>>523 定義だと、nth番目を境に[first,nth)のどの要素も[nth,last)より小さくなるように並び替えるってことなので、
vec.begin(), vec.begin() はダメでしょう(特定の実装でどうなってるかは知りません)。
サイズが1以上かどうかを確かめた上で、
std::nth_element(vec.begin(), vec.begin()+1, vec.end(), HogeComparator());
の方が良いと思う。
あ、ごめん。ダメじゃないかも。
>>489 まじかよ。
MFCのCFileでファイルクラスの例外スローに苦しめられた経験があるもんで、
.NETでも例外スローするってのは正直ひくね。
ファイル操作のような、アプリ依存の分岐処理が必須になる分野に
例外機構が向いているかどうか疑問だ。
>>405 gotoもそうだし、ダウンキャストしまくりでびびったよ
ゲームだからいいのかね
C++の落とし穴とは、普通はどういう物を指しますか? オブジェクトコピーによってデストラクタが二度呼び出されたり、 ポインタ位置破壊を行ってしまうような事を指すんでしょうか?
>>521 std::swap(*std::max_element(vec.begin(), vec.end(), HogeComparator()), vec.front());
ではどう?
>>526 へぇ。
私の場合、標準の fstream 関係がデフォルトでは例外を投げないことの方が気持ち悪いです。
ファイル関連こそ、例外を使った方が楽だと思うんだけど。
>>527 ゲームとか関係ないかと…
単にスタイルの問題?
>527 やる着なかったんだよ.
>>532 ゲーム > 速度重視 > 実行時型チェックなんかしてられるか(ノ `Д´)ノ ミ _I___I_
じゃない?
>>531 釣り?
自分のエラー処理(任意)とクラス例外処理(強制)で2度手間。
ファイルの例外を楽と思うヤシの気が知れんね。経験浅いの?
関数内で定義→関数内で宣言、でした。
>>534 でも dynamic_cast は…
ひょっとしたら、HDR がどうとか、そういうアルゴリズムを他の事に
気が紛らわされることなく理解してもらためにやってるのかも…
>>535 > 戻り値として生成したオブジェクトの複製を返して終了します
複製を返しているので
>【自動変数をポイントして,それを関数の戻り値にする】
には当たりません.該当するのは以下のような場合です.
Kitty *getKitty(char *str) {
Kitty *obj (new Kitty ());
obj->str = str;
return obj;
}
>>539 ボケけてた.該当するのは,
Kitty *getKitty(char *str) {
Kitty obj Kitty ())
obj.str = str;
return &obj;
}
です.
>>530 つーか元祖ハンガリアン勤務先なので ドゾー( ´∀`)つ
>>535 int func()
{
int a = 1;
return a;
}
と同じこと。
戻り値として返されるのは関数内の自動変数をコピーしたもの。
ローカルの参照やポインタを返すなってことさ
>>535 C-Magazineが間違っているだけ。
何度もすんません.540は - Kitty obj Kitty ()) + Kitty obj; に訂正致します.
どうでもいいけど
>>535 のリンク先
while(NULL != thePtr){
ってやってる。宗教健在かぁ。
害の無い宗教は放置。
解説ありがとうございます。return時に指定された変数(や定数)を スタックにコピーした上でretするということなのでしょうか。 何にしてもC・C++に関係なく自分が勘違いしていたようです。 -S出力したりしてもう少し勉強しようと思います。
>>547 その通り。
変数・定数の頭文字を大文字にされた日にゃ、困るけど。
>>536 うーん。経験浅いのかも。計算系が主だし。
自分のエラー処理とクラスの例外処理を「まとめて」扱えるから楽かなと思って。
今は、
std::ifstream ifs(filename);
if (!ifs)
throw Hoge();
とかやってる。そうすると catch を一カ所にまとめてかけて楽だし。
ヘボい?どうやるのがかっこいいのかな?
>>551 自分の投げたいときだけ投げるわけじゃねーだろ、ライブラリの例外クラス。
お前の書いたサンプルは、任意使用の例外処理だろが。
経験が浅いだけでなく、日本語も不自由なのか?
>>552 >>551 は強制処理の例外をstd::ifstreamが投げないから仕方無く任意処理の例外を書いてるんじゃないのか?
任意処理->任意使用
>>553 自分でthrowしている時点で、論点が違うでしょ。
今問題にしているのは、クラス内部から勝手にthrowするファイルクラスの利便性について。
>>552 ごめん。日本語が不自由なのは認めるけど、言いたいのは
>>553 がフォローしてくれた通り。
「クラス内部から勝手に」ってのが、よくわからないけど……。
普通、例外ってメソッドから勝手に投げられてくるものじゃないの?
おまいらー。はなしがかみあってないぞー。
>>556 とりあえず、メソッドから直接投げられると困ることがあるってことに気付けよ。
計算系って、大学か?
どうせ、exit()乱用するアフォプログラム書いてんだろ?
>メソッドから直接投げられると困る std::bad_alloc投げない化石コンパイラでも使ってて下さい
>>556 え?すみません。全然わからなくなってしまいました。
「メソッドから直接投げられると困ることがある」ことに、どうしても気づけません。
私の主張(というほどじゃないけど)「メソッドから直接例外を投げてくれないと面倒くさい。」です。
556さんじゃなくても構いませんので、556さんがどういうことを言いたいのか解説してもらえませんか?
日本語不自由ですみません……orz
>>561 すみません。556は自分でした。558さんですね。
例外処理に関して知った風なこと言ってるヤシ、 「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。 完全に自己満足の世界といっていい。 他人に使われることを想定してクラスを作ったら、 クラス内部からスローするような仕様は下の下だということに気付けるはずだ。
>>563 俺も、こいつが何を言いたいのかさっぱりわからん。
newを使うな、ってことを言いたいのか?
C++ で new を使わないのはある意味尊敬するなw
>>563 主張は分かったから、良かったら根拠を挙げて紅か?
関数から例外を投げないほうがいいと言っている人は ライブラリは戻り値でエラーかどうかを毎回返したほうが良い と言っているのですか?
newどころかSTL全般が駄目なのでは。
何のためのC++なんだろうな(w
>>563 心から同意
誰か意地になってるやつがいるだけの気がする
実際は作るときより、使うとき困るんだがな
昔の人は偉いよね。例外なんかなくてもちゃんと作ってたんだから。 今同じことしようとするとめんどくさくて仕方ない。
つーかクラス内部ってどこだよ。
>>563 はきっと大域newオーバーロードしてあるし、
STLは全部自分で書いてる。
いくらなんでも一気にこれだけレスが憑くのはありえないな…
563 == 571 ? どっちでもいいから 早 く 具 体 例 を 挙 げ ろ
発生したエラーが致命的かどうか判断するのは、 クラス利用者であってクラス作成者ではない。 クラスに例外処理を実装して得意気になる馬鹿はPGをやめた方がいい。
>>577 是非C++標準委員会のSTL策定したメンバーの方々のメールでも送りつけて下さい
564から自演の嵐
例外投げられても、それが致命的じゃないなら catchして処理して正常系に戻ればいいのではないのか?
>>563 はtry,catch構文の書き方が分からない
>>577 別に致命的じゃなくても例外投げて良いと思うぞ。
要は、処理を続行できない事態が発生した時に投げれば良い。
致命的かどうか判断するのは
>>577 の言うように利用者だから、
tryの位置やcatchの内容にそれを反映させる。
自演もうざいが、煽りもうざい。 議論に参加しない奴は黙ってろ。
588 :
デフォルトの名無しさん :04/08/04 17:43
低レベルすぎるのでageときますね
589 :
デフォルトの名無しさん :04/08/04 17:44
>>563 さんがどうやってエラーを返してるのか知りたいです。
やっぱ返り値は全部intかenumですか?
それともエラーの時はNULLとか返してGetLastError機構を用意するのですか?
>>576 とりあえず、MFCのCFileやCInternetSessionなどを使ってプログラムを組め。
CException系例外クラスをキャッチするプログラムだ。
サンプルを示したところで、それはちゃんと動くし動作確認されたものだ。
それでは煩雑さを説明したことにならない。わかるだろ?
MS様の作った仕様を逐一追いかける意味で、自力でサンプルプログラムを組め。
いかにクラスの例外スロー機構が煩わしいかが実体験できる。
どう煩わしくなったかは教えてくれないのね。
>>591 気づいてしまったね。うまくやられたっぽいよね。
>>563 さんは自分でクラス書いた事無いんですか?
>>584 >tryの位置やcatchの内容にそれを反映させる。
多くの場合、スコープがcatchに移動していて、エラーの原因となったデータは消滅している。
エラー番号が判る程度では、役不足だった経験はあるだろ?
例外禁止だとRAIIが達成できないな。 無効状態のオブジェクトを作りたくないときどーすんだ?
599 :
デフォルトの名無しさん :04/08/04 17:54
>>563 ==597さん
例外ならエラー番号以上の事が分かりますよ。
このスレは以後
>>597 の役不足につっこむスレとなります
603 :
デフォルトの名無しさん :04/08/04 17:58
>>563 は結局何が言いたいのか分からないのですが。
結局tryとかcatch書くのが面倒なだけなんですか?
>>597 消滅させるかどうか選ぶのはtry/catchを書いたプログラマ自身じゃないか?
投げられた例外について多くを知りたければ
呼び出しの深いところで(throwに近いところで)catchすればいい。
例外はエラー以外には使うな、という考えでもないんだよな。 主張がよくわかんね。
>>597 そのために例外クラスを作るんじゃないの?
自作クラスでは、全部 exception とか投げてるから
そーいうことで困るんだとおもうよ。
>>605 std::exception
と、563のまねをしてみるテスト。
609 :
デフォルトの名無しさん :04/08/04 18:00
>>563 は例外クラスを定義しているライブラリは使いません。
IndyとかMFCとかSTLとかboostとか。
例外が駄目だということなのですが、 どうするのが良いスタイルなのかを示してくれたほうが嬉しいです。 自分が提供するライブラリクラスで例外使用を禁じられた場合 1. 関数からintやenumの戻り値を返す。 2. エラー情報格納部を用意してGetLastErrorのようなことをする。 のような解決を試みると思います。 1や2のようにしているのか、それとももっと良い方法なのか 示していただけ無いでしょうか。
>>605 サンプルも何も、
例外クラス定義してエラー番号以上の情報を入れるだけなんですけど…
>>604 信者の詭弁ですよ。
×呼び出しの深いところで(throwに近いところで)catchすればいい。
○呼び出しの深いところで(throwに近いところで)catchしなければならない。
613 :
デフォルトの名無しさん :04/08/04 18:03
もういいんじゃない。
>>563 は例外クラスが分かってないでFAで。
スレの無駄。
>>604 恐らくライブラリ関数内で作られたようなオブジェクトの情報を
取得できないことを指摘しているのだと思う。
ライブラリ作成者側が気を使ってくれるなら、
例外クラスの中にその情報を入れてくれるんだけどね。
>ライブラリ関数内で作られたようなオブジェクトの情報を取得 良く意味分からないんですけど、例外じゃくて戻り値ベースだと それが分かるんですか? そもそもライブラリ関数内で作られたようなオブジェクトの情報を取得するのは カプセル化と相反していませんか?
619 :
デフォルトの名無しさん :04/08/04 18:08
>>563 のようなバカにエラー処理を強制させる意味でも例外を使うべきだ。
>>563 は戻り値ベースだったら戻り値なんてチェックしないだろう。間違いない。
もっとも
>>563 のようなヴァカは全部tryで囲んでcatch(...){}で終わりだろうけど。
>>615 いや、俺も例外推奨派なので、戻り値ベースだとできるとか
そういう意味の発言はしていないよ。
>>614 にもそうは書いてないよね。
必要な情報を入れてくれていない「例外を投げる側の不備」が
あることもあるよねって話。
ライブラリ関数内で一時的に生成されて
関数内で一生を終えるような情報を例外クラスに入れて投げるのって
カプセル化に反するの?別にメンバ変数の内容を公開するわけじゃないよ。
>>619 逆だな。
戻り値を厳密にチェックしてエラー時の処理を細かく制御したい場合、強制スローは迷惑。
>>621 なるほど。じゃぁ何かするたびにif文でその処理が成功したかどうかを
逐一チェックしろと言われているのですね。了解。
>>620 いまいち何が言いたいのか分かりませんが、
ライブラリ作成者側はエラーの詳細を伝えるべきではありますが、
内部で使うオブジェクトの詳細を与えるべきだとは思えません。
本来利用者側かでは知る必要がない、
内部で使うローカルオブジェクトの実装の詳細を知る必要が出てくるので。
>>624 オブジェクトの詳細じゃなくて、エラーや例外の詳細だと思う。
>>622 (゚Д゚)ハァ?
例外クラスは一種類だけではありませんし、
例外クラスの中にも情報を入れる事が出来るのですよ。
アンチを相手にするのは時間の無駄だろ。 アホを啓蒙してやりたいって事なら話は別だが。
628 :
デフォルトの名無しさん :04/08/04 18:21
つーかさ、何で話がすり変わってるの?
MFCが吐くCFileのExceptionクラスとやらは詳しい情報吐いてくれないのかも知れないけど、
自分で例外クラス作ればいくらでも詳しい情報書けるぜ。
それなのに自分でクラス書く時に例外吐くなとはどういう事よ?
>>563 出てこいよコラ
ぶっちゃけ、このスレには何人いるんだろうか。
とりあえず初めの
>>563 はもういない気がする。
己の無知に気づいて。
>>623 逐一チェックしろ。
いざ、エラー発生位置などのダンプ情報が欲しくなった時、
手に負えないのが、クラスの例外スロー。
そんな事より人に使わせるクラスに 例外仕様も書かない輩が嫌いだ。
>>563 は正しいでしょ。
マジで馬鹿だよ、クラスから例外吐くヤシ。
>>631 エラー発生位置を例外クラスに詰める事も出来るし、
そもそもデバッガってご存じ?
議論云々の前に例外を知らなすぎる
>>628 信者の詭弁ですよ。
×自分で例外クラス作ればいくらでも詳しい情報書けるぜ。
○自分で例外クラス作らないと詳しい情報書けないぜ。
>>624 こんな例を出すのが適当かどうかわから無いけど例を出す。
ある仕様のXMLファイルのストリームを受け取って、
必要な情報を返すようなライブラリ関数があったとしよう。
(ライブラリの実装としてはそのXML情報をDOMとして取り出して処理しているとする)
DOMツリー構築後、処理途中で与えられたXMLが仕様と合っていない
不備があったとして、どこが不備なのか返すために
Nodeオブジェクトを例外クラスに格納して返したいと思わない?
Nodeオブジェクトがあればどこが仕様に合っていなかったのか
すぐわかると思うけど。
これが無いと、ユーザにXMLのどこが間違っているか示してあげることも
できないんじゃないかな。
>>637 そもそもstd::exceptionを直接吐く事の方が少ないと思うのですが、
詭弁ですか?そうですか。
>>634 は、クラス使用者に強要される制限が理解できていない。
>>634 は、デバッガが動く環境でしか開発したことがない。
>>638 そもそもそのライブラリを使うのに
Nodeオブジェクトの実装を知っている必要がある
(メソッドにNodeを渡したりメソッドからNodeが帰ってきたりする)
のであればそれは構わないのでは無いかと。
例外を使う/使わないは純粋に記述量にしか影響しない。 多くの場合、戻り値主義で完璧にやろうとすると複雑さが許容範囲を越える。
>>618 ファイルのエラーはシーンチェンジと同列ってことですか
.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 に無効な値が含まれています。
>>640 >クラス使用者に強要される制限
で、それは何?
>>645 そもそも.NETは純粋なC++では動きません。ManagedC++。
>>647 無知なお前らにまともなクラスライブラリの仕様を教えてやったんだよ。
>>641 ライブラリ使用者側が知っている情報レベルのものなら
例外クラスに入れても良いという考え方だということか。納得できる。
じゃぁ、もしライブラリ使用者側がNodeオブジェクトについて
知らない場合、君ならどうやって例外情報を構築するのか示して欲しい。
俺としてはそれができるならそうしたいのだし。
やっぱ、夏休みでノンプロが多いな・・・。
一応いっとくけど、漏れは例外処理そのものは肯定する。
特に、エンドPGが
>>551 のサンプルのように自分で自作クラスをスローするのは賛成だ。
糞なのはクラスの例外throw。支持する馬鹿、氏ね、マジで。
何かさあ
>>563 の頭の中には何か意見があるんだろうけどさあ、
それを書いてくれないとこっちは分からないんだよね。
漏れは例外は嫌いだしか伝わってこないんだもん。
実生活でも話すの苦手なのかな?
>>646 try節を書く必要がある、という制約 (プゲ
>>647 例外を適用するコンテキストは言語には依存しないだろう。
563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25 例外処理に関して知った風なこと言ってるヤシ、 「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。 完全に自己満足の世界といっていい。 他人に使われることを想定してクラスを作ったら、 クラス内部からスローするような仕様は下の下だということに気付けるはずだ。 563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25 例外処理に関して知った風なこと言ってるヤシ、 「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。 完全に自己満足の世界といっていい。 他人に使われることを想定してクラスを作ったら、 クラス内部からスローするような仕様は下の下だということに気付けるはずだ。 563 名前:デフォルトの名無しさん[sage] 投稿日:04/08/04 17:25 例外処理に関して知った風なこと言ってるヤシ、 「自分で作った」例外を投げるクラスぐらいしか使ってないだろ。 完全に自己満足の世界といっていい。 他人に使われることを想定してクラスを作ったら、 クラス内部からスローするような仕様は下の下だということに気付けるはずだ。
>>563 >他人に使われることを想定してクラスを作ったら、
>クラス内部からスローするような仕様は下の下だということに気付けるはずだ。
この部分はどう説明なさるのですか?
>>652 一応PGを飯の種にしてるから、核心の部分はぼかさせてもらう。
例外が嫌いなのは悪い事じゃないと思う。
むしろ、C++の固有機能を必死に使おうとする馬鹿の方が困る。
エレガントに見えて追跡不能である場合が多い。
>>659 >他人に使われることを想定してクラスを作ったら、
>クラス内部からスローするような仕様は下の下だということに気付けるはずだ。
どうしてクラス内部からスローするような仕様は下の下なんですか?
あなたの
>>563 の発言からして核心はそこだと思うのですが。
661 :
デフォルトの名無しさん :04/08/04 18:45
核心を伝えよう。 この業界ではプロ==バカ
>>651 お前やっぱりアホだろ。
自分で例外を投げても、そのコードを利用するクライアントから見たら、
クラス内で勝手に例外が発生してるんだよ。
現在のスコープより上位に投げないと言うのなら goto で十分だ。
それとも、まさか再利用される可能性の無いアプリケーション固有の
コードでのみ例外をしようして、人が触る可能性のあるコードでは
例外を送出しないとか言うのか?
馬鹿避けと例外安全を勘違いしまくってるだろ。
あんまプロ、プロ言わんほうがいいな…
>>659 そうだそうだ。563様は偉大なんだ。例外処理についての素晴らしい独自理論をお持ちなんだ。
その理論は門外不出なのに、私たちのためにちょっとだけ教えてくださったんだ。
例外設計を知らないわけじゃないんだぞ。
>>563 はマ板のあちこちに現れては、
バカな主張を行う人なのでスルーした方が吉です。
特徴
・言葉遣いが汚い。いきなり他人を「お前」よばわりする
・自分の主張を補強する事実は一切ださない
・抽象的な主張の論拠として、さらに抽象的な主張を持ち出す
頭が悪いだけで、悪意はなさそうなんだけど・・・・
>>659 技術を共有する気の無い奴は二度と来ないでくれ。
馬鹿対策は実世界で個人的にやってくれ。
>>662 >それとも、まさか再利用される可能性の無いアプリケーション固有の
>コードでのみ例外をしようして、人が触る可能性のあるコードでは
>例外を送出しないとか言うのか?
最善だと思うね。一切のオタク色を排除すればそうなる。
流れはやいなー
煽りがちと気持ち悪いくらい度が過ぎてるので、563の方がまともに見えてきたな
盛り上がっているところ恐縮ですが、ifstream が例外を投げないという仕様は皆さんから見て自然なんですか?
C++が廃れた理由が良く分かるよ
>>671 例外処理のあるまともな言語は全て投げてる。
これはひどい・・・
>>563 はともかくとして、アレコレの API のエラー検出は結局戻り値チェックでやってるので、
API 含有率が高いプログラム書いてるときは例外使いたくなくなることもあるな。
でも「MFC (の CFile) がタコだから例外はダメ」って程度しか論拠を示されないんじゃ、
あまり納得いく論議ではないなぁ・・・MFC みたいにバカが使うライブラリは、例外とか
テンプレートとか使うべきじゃないっていうことなら同意できるけど。
666=672
STLはバカは使わないのか
例外を投げないライブラリに例外を投げるラッパを書くのは手間だけで済むが、例外を投げるライブラリのパフォーマンス上のペナルティは回復しようが無い。 よって例外を投げないほうがまだマシ。
>>680 例外は滅多に起きないから例外って言うんですよ。
>>680 Cとかアセンブラでも使ったら?
C++が廃れた理由が良く分かるよ。
>>680 みたいな事言う香具師に限って線形アルゴリズム乱用したりするんだよね。
>>680 >例外を投げるライブラリのパフォーマンス上のペナルティ
それホント?
本当だとしても、例外がパフォーマンスに影響するような設計が悪いんじゃないの?
686 :
デフォルトの名無しさん :04/08/04 18:59
内心basic_stringの例外クラスout_of_rangeとかウザイと思ってるヤシ、手挙げろ。 素晴しいとか思ってるのはC++ヲタだけじゃねーの?
>>682 めったに投げなくても、投げられる可能性があるなら
とりあえず受けておくべきなのが例外ですよ。
で、受けるコードでもペナルティが発生するんです。
>>680 は完全に正しい。
C++で最高のパフォーマンスを引き出すコードを記述する場合には。
そして
>>680 は完全に間違い。
C++でパフォーマンスよりも生産性を重視した開発を行う場合には。
C++は特にいろんな前提条件があるんだから断定はできないだろ。
例外がいやならstd使うななってこった。少なくともその自由は与えられているはずだ。
>>687 拾わなきゃいいんでない。拾わなきゃどのみち落ちるんだし。
>>688 それと、戻り値で返されたエラーをifで処理するのと、どっちがパフォーマンスに優れていると思っているのだ?
アメリカのForum回った後に、ここ来るとがっかりするな
>>689 >例外がいやならstd使うななってこった。少なくともその自由は与えられているはずだ。
その自由さえ制限してしまうのが、クラスの例外スロー。
クラスの例外スローがお前らに何を与えてくれたというのだ?
不便な束縛だけだろう?目を覚ませよ、いい加減。
>>691 今調べたら、append等でもout_of_range投げるんだね。知らなかった。
確かにこれはちょっと余計かな。
>>695 >その自由さえ制限してしまうのが、
して無いだろ。std使うなといっている。cstdio使っとけ。
>>695 695の言ってる「クラスの例外スロー」の意味がわからないのは私だけ?
>>695 はC時代からのプロでもう年だから
どうしてもtry,catch構文が覚えられないだけなんだ。
そっとしておいてやれ。
>>699 695 =563語の「クラス」ってのは、たぶんクラスライブラリのことを意味しているんだと思う。
ハードディスクのことを「ハード」っていう人、稀にいるみたいだし。
>>563 は過去に例外をcatchし忘れて
クリティカルなアプリが落ちてトラウマになっている。
>>690 そりゃそうだけど、落ちるほどのことか?
個人的には、なにもせずに戻してもいいと思うね、この程度なら。
ま、派生クラスでオーバーライドすりゃいいんだけどさ。
>>699 コンストラクタが投げる例外のことじゃないかと憶測
まあ他人も使うクラスなら「例外吐くなら例外仕様くらい書けよ」というなら 同意だが、「例外吐くなよ」はどうかな。
>>702 まあな。テスト段階での話だけどな。
苦い目にあったことのない日曜PGには、漏れの堅牢な哲学なぞわからんだろ。
>>704 コンストラクタが例外吐かなかったら
構築に失敗した時どうするのだろう…
ああ、またGetLastErrorか(w
>>593 具体例を提示できないならいい加減消えな
例外の言語仕様は Java>>>>>>>>>C++
593はtry,catchも忘れるようなアフォ
つーか
>>563 が無知なのは分かったから、
いい加減消えてくれないかな。
以上プロ==バカの典型的な例でした。
本日のNGワード:593 以上
>>707 例外を吐くような処理はコンストラクタじゃなくて初期化用メンバ関数でやれ、とか書いてたのはCマガだっけか(w
以下ExceptionalC++さえ呼んでない香具師は 例外に関する発言禁止。
んじゃまずお前が呼んできてくれ
>>712 >try,catchも忘れるんだな(w
漏れがtry,catchを実装しても、投げてくるブツが違ったらどうしようもない。
catch(...)でどうにかなるほど甘くない環境での話だ。
>>720 >catch(...)でどうにかなるほど甘くない環境
すでにC++ではありませんね。スレ違いです。
>>714 オブジェクトにいちいち初期化完了ステータスとかを持たせるのか?
Init呼ばないとオブジェクトが動かないんじゃないの?(w
つーか、catch(...)したらどうせ再throwするんだからcatch(...)で済む状況ってあるのか?
720は戻り値チェックでも間違った比較をしまくってそうだな。
main(){ try { 〜 } catch(...) { 〜 } } 回復可能か不能かは別として、とりあえずデバッグ時に 漏れたのキャッチするようにしておけば、キャッチ漏れには すぐ気づくんじゃないか?
catch(const std::exception&)でいいんじゃないの?
例外でintとかstring投げるのは
>>563 くらいだろ(w
例外が出来た経緯とか、正しい答えがある風なエラそうなこと言っていた割には 誰一人とて納得させてないんだよな。
納得させてないんじゃなくて 頑なに納得しないんだよ。
>>726 そこからが長かったりする。
進捗報告に1行で記述する項目であっても労力は雲泥の差だ。
>>720 それはドキュメントの質が悪いんじゃない?
例えば CFile は CFileException 投げるって書かれてて、それはその通りなんだけど、
CSocketFile のドキュメントには何も書かれてないくせに、
でもコイツは CInvalidArgException 投げる、とか。
>>722 つまりステータスを持つなと?
iostream系はアフォと?
>>723 状況によっては正しい。
再利用のない、単純クラスしか使ったことがない
>>723 には理解できんだろうけどな。
ここまで頑固だとそのうちクビになりそうだな
>>734 初期化ステータスなんか持たせないで、NULLで十分じゃないか。
Initが悪なんて誰も言ってない。お前が常にInitを使うといってるだけだ。
コンストラクタでオブジェクトを構築しないみたいだからな。
今日はこのスレ、とりわけレベルが低かった。 実用性無視の学者肌の輩が多かったせいか。 無知を相手にしててそこそこ楽しかった、ノシ
以上典型的バカでした。
>>736 そこまで具体的な変数管理を想定できるなら、
まずインスタンス利用時にエラーチェックして
クラス外部でスローなりなんなりした方が利用者負担がなくてイイと思う。
なんでわざわざコンストラクタからスローするのかと小一時間(ry
だよねぇ。 CFile 使って例外取りこぼして障害発生なんて恥ずかしぃ・・・ そんなの発見するのに >そこからが長かったりする。 だって。 中国人使ったほうがマシだな。
742 :
デフォルトの名無しさん :04/08/04 19:42
コンストラクタから例外なげれば 構築済みの(基底クラスやイニシャライザの)デストラクタが全部自動で 走るから楽だよ。
>>741 誰に対する同意?
自分は例外クラス否定派だけど(w
いい中国人使った事あるの?
基本的にダメダメだと思うが。
>>744 同じダメなら人件費安いほうがいいってことだと思う。
でも 563 はダメなりに頑張って最後には動くもの作るんだろうから、
まぁ仕事放り投げちゃう中国人よりは使える場面が多いかもね。
>>743 コンストラクタから例外投げなかった場合でも
構築済みのデストラクタが全部自動で走ると思うが・・・。
どういう優位性を主張しているのかわからない。
同じことをするんだから フラグを用意する手間が省けませんか? deleteもいらないし。
中国人に一目置くとは、程度が知れてる(ry
読解力もなさげだし(w、
>>741 。
749 :
デフォルトの名無しさん :04/08/04 19:58
お前ら良く中国人と一緒に仕事なんてできるな。 内心では無茶苦茶憎まれてるよ。 たぶん意図的に致命的なバグ山ほど仕込まれてるよ。 プロジェクトが崩壊する前に早くクビにした方がいい。
サッカー見てたらますます怖くなったよ<中国人
>>747 >deleteもいらないし。
構築成功した場合に使うdeleteは、使えないという特殊な前提ですね・・・。
?使えないって? 構築されたら使えばよいだけの話では…
Init も使いますよ。初期化処理を派生クラスで カスタマイズしたいときなど。コンストラクタでは 仮想関数呼び出せないので。
>>752 obj* p=new obj();
p->init();
delete obj;
を
obj* p;
try { p-new obj(); } catch(const exception&) {}
delete obj;
とかやろうとしてるんだろう
× 仮想関数呼び出せないので ○ 派生クラスの仮想関数を呼び出せないので
delete p;だな
>>755 その場合は
Obj* p = NULL;
としておくだけでいいのでは?
つーかスマートポインタ使えよ
deleteなんて持ち出したアホがその台詞言うなよ
まあアホでも何でもいいですけど。 言うほど面倒くさくもないんじゃないですかね。
いつまでつまらん例外の話題でひっぱるんだろう…
もっとましなネタが出るまで
auto_ptrって役に立つのですか?
わざわざscoped_ptr使うくらいならauto_ptrで済ませりゃ良い
>>563 の発言は過激だが、ある意味当たってる希ガス。
そして、具体的なことは何も言わないのもいつもどおり
>>767 具体的も何も、他人の作ったクラスを使ってみりゃいい。
その他人の作った仕様の奴隷になった気分を味わえる。
具体例をクレクレ言うのは実戦経験が浅いだけかと。
↓
>>768 あのー・・・
もしかして「俺ライブラリ」みたいなの作ったりするタイプの人ですか?
STLもboostも他人が作ったもんだがバリバリ使っておる。 便利である。
>>770 普通作るでしょ。ライブラリと呼ぶかどうかは別として。
コピペ用の汎用ソースとか。
これなしに、何が蓄積されていくわけ?
で、突き詰めてくと要らないものも判ってくる。
まだ続けますか
>>768 だから、あんたは実戦経験が豊富なんだろ?
実戦経験足りない俺に具体例を提示してくれよ。
どうしてのらりくらりと核心から逃げるんだ?
他人のクラス使ってもその結論が出せないんだけど、
それは実戦経験が足りないからなんだろ?
実戦経験が足りないのにまた人様のクラス使っても同じことだって。
563以外の人間のほとんどが実戦経験たりなくて、
563だけが正しい結論を出しているなんてとても状況信じがたいだろう。
普通は少数派が間違っているものだ。
そうではないと言い張るなら、563自身の結論とやらを語って聞かせるべきでないのか?
>>773 Doom3の割れ厨が不愉快だから、このスレで気分転換してた。
正直すまんかった。今は反省している。
他人が作ったライブラリを使うと奴隷になったような気分になるという、 そういう性分なんじゃないの? 適正の問題になってくるかと。
実践を語るなら、正しい方法とやらは多くの人間に認知されている手段であるはずだけど、 そこに触れないって事は、やっぱり一人で完結してる趣味グラマなんだろな。
他人が作ったOSのAPIごときに振り回されて奴隷になったような気分にはならんのだろうか。
>>777 わかってる人間はわざわざこんなくだらない話題に参加してない
>>772 そういった「俺ライブラリ」が無駄に再生産されないで済むように、
標準ライブラリやら boost やら MFC やら ATL やら WTL があるわけで・・・
>>778 こういう人は I/O ポート直叩きですよ。んで「このチップの仕様腐ってる。
はぁ?割り込み?オーバーヘッドありすぎ。ポーリングで十分」とか言ふの。
781 :
デフォルトの名無しさん :04/08/04 21:52
>>778 他人が作ったA○tiveDirect○ryに振り回されて奴隷になったような気分でつ。
>>778 なるよ。もちろん。
MFC、ATL、WTL、boostだけで十分にウンザリ。
これに加えて独自クラスで独自の例外スローされたらたまらんよ。
そのうち「他人の作った言語仕様に振り回されて〜」でC++を卒業すると。 とっとと出てってくて。
自分と次元の異なる存在に振り回されるのは仕方ないでしょ。法人とか団体とか。 で、他のPGの半端な設計を喜んで受け入れるわけ、藻前ら?
>>785 あるモノは使う。もはや一から自分で作っていて、期日通りにリリースできる
状況にはない。
いやほんとに、勘弁して下さいよ。最近の開発大規模化は……。
まぁよく出来たライブラリ使う分には感動するが糞なライブラリ使ってると殺すって気になるな。 MFCとかCOMとか。同僚のしょぼい設計は却下 STLとかは感動した
設計が腐ったライブラリは例外投げようが投げまいが腐ってることに変わりはないだろ。
>MFCとかCOMとか どちらも、かの会社のだな
むしかえすようだが、500あたりで話してた奴は例外を基本としてる関数書き換えれば問題解決じゃないの?
漏れなら設計方針に多少何アリでも、機能をそこそこちゃんと提供していて そこそこ枯れてれば、なんでもありがたく使っちゃうよ。 そーいう意味では MS の Win32API と称される肥大化を続ける dll 群とか COM 関連コンポーネントなんか最高。 WebBrowser、XMLパーサ/DOM、文字コード推定/変換、etc。
>文字コード推定/変換 これの名前おせーて
> そこそこ枯れてれば 真にプロなら、これ重要だって知ってるよな。
>>790 それは、自分のプログラムのせいでPCが落ちたときに、
Windowsが不安定じゃなくなればいいとか言うのと同じだ。
>>655 例外は投げないということか。
ライブラリユーザ(ひいてはアプリユーザ)にどこが悪いのか知らせることを
放棄しちゃうんだね。
xpathっぽいもの作って例外クラスに格納するとか答えてくれるかと
思ったんだがな。
プロとか関係なしに、枯れてる方がいいに決まってる
枯れてることを望むのがプロ
いやいやいやいや、アマだって枯れてるのを望みますって!
>>789 だから糞って言っただけだろ。
COMなんて、あの時代であれ以上の言語非依存バイナリ互換フレームワーク
なんて存在しないし、糞とか言うもんじゃねーもん。
OLEとかのCOMで実装されたライブラリに糞なものはあったかもしれないけどな。
789だが、なんでそんな勢いで突っかかられるのか分からん。
>>800 明確な理由なく貶すからだろ。てかM$信者なんだろ・・・
んな程度でファビョんなよ。
MS信者なんているのか? アンチ・アンチMSなら良くみるが。
要するに他人が作ったのは、その癖を理解して手足のように使いこなせるようになるまでに時間が必要ってことだろ。 その価値があるかどうかは別問題として。
そんなに他人の作ったもの毛嫌いするなら、使う事を考慮するなっつの。 標準ライブラリとOSのツールキットしか触るなよ、タコ。
何の話してたんだっけ
プリンに醤油をかけると何味になるか?じゃなかったっけ?
えと、いちご味のばななだろ。
アボガドに醤油をかけるとトロのアジがするとか?
アボガドにトロをかけるとアボガドロのアジがするとか?
>>808 プリンに醤油をかけるとバナナになるのか??
落ちる気配がなさそうにないのでそろそろ寝まつ。
そんな時には例外スロー
>>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() に実際の原因が入っている保証が無いので、
自前でやったとしても不安が残ります。
そういえば、例外発生中のデストラクタで例外を発生させることが出来ないわけですが、 例外発生中かどうかを判断する関数とかってありますか?
つーか、例外中かどうか判断するのは別にいいけど デストラクタで例外投げるのは禁じ手だったような。
uncaught_exception();
クラス例外スローマンセー厨は大人しくなったな。 クラス例外は使いこなすのに結構骨が折れる。 というより、実用的に作られてないと使う人がかなり悲惨。
逆のロートルもおとなしくなったな
カレーにウンコをかけると、ウンコ味のカレーになる
>>820 クラス例外って言葉はブーム?
クラス例外に醤油かけると何味だっけ?
>>817 いや、例外発生中じゃなければいいわけで、815の言ってることは正しいんだけど、無理だと思うよ。
だからデストラクタで例外投げるなって言われてるわけだし。
class C { T *p1, p2; public: C() : p1(new T), p2(new T) {} ~C() { delete p1; delete p2; } }; p2(new T) が例外を出したら p1はメモリリークする? もしそうならnewで初期化するのはやってはいけない?
>>825 する。
そのためにfunction-tryブロック(って名前でいいんだっけ?)があるけど、多くの処理系で未対応。
解決法としては、
・初期化子じゃなくて代入文を使う(ダサいけど)
・生ポインタをメンバに持つんじゃなくて、std::auto_ptrなどにする
などがいいんじゃないでしょうか。
うーん。 スレの性質上、例外処理の挙動について語り合うのは価値のあることだけど、 その事と実用とはまた別のものだな。 昨日は、混同する馬鹿が暴れてたみたいだな。乙
>>825 あと、細かいけど、
> T *p1, p2;
T *p1, *p2;
だよね?
うん
今日は静かだなぁ。
嵐の前の
V6
アボ「カ」ド
アボガド の検索結果 約 56,800 件中 1 - 50 件目 (0.33 秒) アボカド の検索結果 約 53,800 件中 1 - 50 件目 (0.19 秒)
カドルト
\モウ/ \ね/ \ アボカド / \ 馬 / \ 鹿 / \ カト / ∩ ∩ | つ ⊂| ∩;;;∩ ∧ノ~ ! ,'っ _c,! (Y;;;;;;;;;;ヽノ) ヽ ミ| ・ \ ⊂/ ・ \ i;;;;;;;;;;゚;;;゚ヽ γ⌒^ヽ ミ| ... '_) | __,,▼ ∫ /;;;;;;\;;;;'⌒) /::::::::::::::ヽ ミ| (,,゚Д゚) |・ (,,゚Д゚) (,,゚Д゚) )|;;;;;;;;(,,゚Д゚) (⌒)(⌒) /.:::::::::(,,゚Д゚) | (ノ |) | (ノ |) ⊂三つ: つ ババンバ ι|;;;;;;;つ ;;;/つ ( ・Å・) i::::::(ノDole|) | 馬 | |・・ .鹿 | |||||||| バン ヽ..;;;;;;;;/ γ⌒ ( ゚Д゚)) ゙、:::::::::::::ノ 人.._,,,,ノ ι・,,__,ノ | | バン U"U 乂_) UU U"U U"U U"U U"U :y=-( ゚д゚)・∵;; バーン
アボカド 【avocado】 クスノキ科の常緑高木。中米原産。果実は黒緑色または緑色の 洋梨形または楕円形で,中に大きな種子が 1 個ある。果肉は 黄緑色のチーズ状で,脂肪・タンパク質を含み,生食される。 ワニナシ。 〔アボガドとするのは正しくない〕
ドナルド
840 :
デフォルトの名無しさん :04/08/05 18:03
class C{}; struct S{ S( ... ); }; sizeof( S( C() ) ); とすると、 C() が 関数値 C、引数 void の関数とみなされ、S() の C++ スタイルのキャストとみなされてしまいます。 S のコンストラクタの引数に C を渡すように認識させたいのですが、どうすれば良いでしょうか?
>>840 sizeof (S((C())));
または
sizeof (S(C::C()));
主旨から外れるが sizeofなら型名だけでいいのではないか。
実はテンプレートで複雑なコンパイルタイム演算が発行されるとか。
なんだかこのスレッドの方が問題を解決してくれそうな予感がします。 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です。 分かる方いましたら解決法を教えてください。お願いいたします。
再インスコ
度々すみません。 英文の最後の単語は ×・・・・termineted ○・・・・terminated でした。
再インスコ
だから再インスコしろつってんだろ スレ違いな上下らなぇことでスレ消費すんなボケ
再インスコってなんですか・・・ 初心者で分からないです・・・すみません。
あのぅ、C++相談室ってどこですか? なんか間違えちゃったみたいで…
>>854 レスありがとうございます。
行ってはみたのですが、レスはしてないです・・。
私はスレ違いの事を書いてしまっているのですか?
すみませんでした。 英文の中に「C++」と書いてあったので・・・・
ご迷惑おかけしました。
>>847 それって普通、キミのプログラムがどっか頓珍漢なメモリ領域に書き込んでぶっ壊しているってことだよ。
例えば、128バイトしかヒープメモリーを確保していないバッファに256バイト書き込んでいるとか。
対処法は、キミのプログラムのバグを取るしかない。
人生をシャットダウンすれば無問題
>>856 「キミのプログラム」なんか存在しないんだと思う
とりあえず常駐プログラム全部切ってから、IEを操作してみては。 VC++で作った、バグの残ったアプリを一月前にインスコしたって ことなんではなかろうか。どっちにしてもC++の話題ではないな・・・。
860 :
デフォルトの名無しさん :04/08/05 23:38
「C++のクラス = 構造体」 ってことでOKですか?
??? じゃあクラスと構造体が二個ある意味って何よ
862 :
デフォルトの名無しさん :04/08/05 23:40
むしろC++の構造体=クラスの劣化版 じゃないの?
劣化してないよ。
structにclassの機能を付与したのは 例によって付与しないデメリットが思いつかないという 思い付きによって決められた糞仕様なんだよ。
>>865 そうか。思いつきだったのか。別にCのstructの機能そのままでも
良かったような気もしたりしてたんだよな。
デフォルトのアクセス制限が違うだけなんだもん。
ファンクタを簡単に書くためだろ
つーか、classがデフォルトprivateなのもあんま意味ないよな。
カプセル化しないバカを減らすためだろ
interfaceもそうだけどあとからstructの性質を利用しただけだろ
872 :
デフォルトの名無しさん :04/08/06 02:00
すいません、 空のフォルダを削除するにはどうしたらいいのでしょうか? googleで検索してもなかなか見つからず、 やっとサンプルコードが見つかったと思ったら、ないヘッダがインクルードしてあって 結局分かりませんでした。
標準C++にはありません
ファイルシステムの操作は,環境依存。 自分の環境スレ逝け。
>>874 環境ということは・・・
えーと・・・
BCC使ってるのでBCCスレということですね。
分かりました。
BCCスレで聞いてきます。
天然
877 :
デフォルトの名無しさん :04/08/06 03:30
removeで消えるんじゃねーの? BCCはしらんけど
消えるかもしれないが、消えないかもしれない。
DOSのコマンド呼び出しちゃえば? rdだっけ。
881 :
デフォルトの名無しさん :04/08/06 12:31
class A { int d; A() : d(0) {} }; はできるけど class B { char s[16]; B() :s(0) {} }; はできないよね。 コンストラクタで配列を初期化したい時はどうすればいいの?
newしろ
newすると0フィルされるの?
>>881 残念ながら、できない。
C++の仕様の穴と言われております。
でも、配列なんて滅多に使わないしなぁ。
>>881 つーか暮らす定義の中に書かなけりゃいい
std::memset(s, 0, sizeof(s)); ただ0のバイナリイメージが0じゃない環境では うまくいかない希ガス。なので漏れは for で回してる。
std::fill使えばいいやん
Σ(゚Д゚)…!!
では std::vector ということで
char[16]にMD5とか格納したい時にわざわざ vector作るの?
char なら std::string で。だめ?
std::stringってバイナリ格納してもいいの?
char[16]よりはvectorがいい
腹くくって素直にstd::fill()しる
>>893 いいよ。
正直char s[16]は突っ込むところじゃないと思う。
標準関数使ってる人はなに作ってるの?
898 :
デフォルトの名無しさん :04/08/06 13:08
for( int j = 0; j < 1000; j++ ){ try{ throw j; } catch(int z){ } 100回目で落ちます。なぜ?
環境書けよ。 あと普通のクラスthrowした場合は?
>>881 char []の0 fillなら初期化に頼らずに、
コンストラクタ本体での代入で十分じゃないですか?
>>900 0でいいなら、なにもしなくても0じゃなかったっけ?
時々あるが、質問者の「バイナリ」の意味がわからんな。
失礼しました。 for( int j = 0; j < 1000; j++ ){ try{ throw j; TXOwl::Raise(""); // どちらか } catch(...){ } } BorlandC++5.02J WindowsXP です。 どちらでも101回目で落ちます。なぜ? よろしくお願いします。
>>905 「落ちる」と言ってもいろいろあるんだけど。
具体的に。
>>905 コンパイラ最新のにしてみたら。
あとTXOwl::Raiseが悪さしてるとはないんだよね。
今年の夏もひとり。 自分のために夏休みは使うかな。
↑ 誤爆してスマソ
>>906 ライブラリの中っぽい
0x77E33887 の pop si
でデバッガが止まります。スタックのエラーですかね?
>>907 throw 1; でも throw ""; でも同じ結果です。
コンパイラの更新ですか。ふぅ。
配列が100しか用意してないから 初期化しないといけない