C++相談室 part35
- 251 名前:デフォルトの名無しさん :04/09/07 11:01
- >>249
隠れていて気が付かないだけでは?
- 252 名前:デフォルトの名無しさん :04/09/07 11:04
- istream::readでバイナリデータを読み書きするときにエンディアンを考慮して並べ替えないとだめですよね
これは自前で並べ替えるのが常なんでしょうか?
read( void*, size, ios::big_endian )みたいなのはないのかな?
用意されているのに自分で作るのもなんあので
- 253 名前:デフォルトの名無しさん :04/09/07 11:11
- エンディアンを理解してない質問に
見えるのは気のせい?
- 254 名前:デフォルトの名無しさん :04/09/07 11:14
- >>252
253に同意だが、とりあえず答えてやる。
「ない」
- 255 名前:デフォルトの名無しさん :04/09/07 11:21
- MFCでコーディングしているとどうしてもドキュメントクラスに処理が集中してしまうのだが
どうしたらいいのだろうか。処理の意味的にビュークラスやアプリクラスには入れられない。
こういうものなのだろうか?
- 256 名前:デフォルトの名無しさん :04/09/07 11:28
- >>253,254
家のインテルマシンでリトルエンディアン仕様のファイルを読み込もうとしたのです。
上位桁から順番に並んでるデータを。
バイト列を読み込んでそのままキャストしたらだめなんですよね?
あれ?どういうふうに理解していないと思われたのでしょうか?
>「ない」
どうもです
- 257 名前:デフォルトの名無しさん :04/09/07 11:29
- リトルとビッグが逆でした↑
- 258 名前:252=256=257 :04/09/07 11:33
- ios::big_endian がおかしいということか
ios::endian_irekaete にしときます
- 259 名前:デフォルトの名無しさん :04/09/07 12:16
- あ、もしかして
int a;
short b;
char c;
stream.read(&a,sizeof(a),ios::big_endian);
stream.read(&b,sizeof(b),ios::big_endian);
stream.read(&c,sizeof(c),ios::big_endian);
みたいな使い方をするという意味?
ただ、そのインターフェースはいまいちな気がするなぁ。
(iostream自体がいまいちだという突っ込みは無しの方向で)
read( int & ret, ios::big_endian );
read( short & ret, ios::big_endian );
read( char & ret, ios::big_endian );
の方が自然かと。
いずれにしても無いけど。
- 260 名前:252 :04/09/07 12:26
- >>259
テンプレート使ってそんな感じにしておきました。どうも
- 261 名前:デフォルトの名無しさん :04/09/07 16:52
- 例えば
char型の変数を定義する場合
char* pszABC = new char[10];
char szDEF[10];
とnewをつける場合とつけない場合って
どういう違いがあるのでしょうか?
- 262 名前:デフォルトの名無しさん :04/09/07 16:54
- >>261
解放されるタイミングと型
- 263 名前:デフォルトの名無しさん :04/09/07 16:56
- >>261
下のサイズは常数のみ
- 264 名前:デフォルトの名無しさん :04/09/07 16:57
- >>262
そこらへん、もうちょっと詳しくお願いします。
char* pszABC = new char[10];
と宣言したpszABCは
delete pszABC;
しないとメモリーリークを起こしてしまいますよね?
char szDEF[10];
と宣言したszDEFは、特にメモリー解放しなくてもいいですよね。
なんで?
どちらも、メモリー上にchar型10桁分の領域は確保してはいるんですよね?
- 265 名前:デフォルトの名無しさん :04/09/07 17:01
- >>264
キーワード
スタック ヒープ
- 266 名前:デフォルトの名無しさん :04/09/07 18:24
- 遅レス失礼
>235
>_をprefixにするのは良くないらしいよ。システムが予約してるんだそうな。
これは半分本当で半分間違い.予約されてる名前の規則は実はちょっと複雑.
>まあ、GoFがこれやっちゃってる悪しき例なんだが。
GoFの名前の付け方は規格には違反してないと思います.
- 267 名前:デフォルトの名無しさん :04/09/07 18:36
- それを覚えるのが面倒だから_のプリフィクスを避けるべきなのでは?
- 268 名前:デフォルトの名無しさん :04/09/07 18:47
- >267
ですね.細かいことにこだわりすぎました.失礼.
- 269 名前:デフォルトの名無しさん :04/09/07 19:13
- >>252
炎ディ案が問題になるならバイナリで読み書きすることが間違い。
- 270 名前:デフォルトの名無しさん :04/09/07 19:17
- >>264
キーワードは規格に出てくる言葉にしたほうがいいかも。
自動変数 動的確保
- 271 名前:デフォルトの名無しさん :04/09/07 19:26
- >>235
先頭の_は、非グローバルでその次に大文字がこなければ使っても良い。
__と2連続で_が出てくる名前は使用不可。
- 272 名前:デフォルトの名無しさん :04/09/07 19:38
- >>270
既存のファイルフォーマットでエンディアン指定されたバイナリのフォーマットって沢山あるし・・・
そういうの読みたいときもあるじゃん。
- 273 名前:272 :04/09/07 19:39
- >>269 の間違いでしたゴメンナサイ!!
- 274 名前:デフォルトの名無しさん :04/09/07 22:24
- >>271
なんと、その程度なんだ
使っていこうかなぁ…m_は好かないので
何も付けずにやってたけど、評判悪いし
- 275 名前:デフォルトの名無しさん :04/09/07 22:27
- >>264
char* pszABC = new char[10];と宣言したpszABCはdelete pszABC;
とすると未定義の振る舞い。delete[] pszABC;とせねば何が起きるか
分からない。
- 276 名前:デフォルトの名無しさん :04/09/07 22:28
- 後ろにつければそんな事を知らない人でも自由に使える
前につけるのは混乱を呼ばないか?
- 277 名前:デフォルトの名無しさん :04/09/07 22:37
- >>276
禿に文句いえYO
- 278 名前:デフォルトの名無しさん :04/09/07 22:40
- class A {
int _value; // OK
int _Value; // NG
int other_value; // OK
int other__value; // NG
};
int _value; // NG
int _Value; // NG
こんな感じかな?
- 279 名前:デフォルトの名無しさん :04/09/07 22:46
- 前につけるのはOKかもしれないけど、とりあえず批判の対象となるので、
お勧めしない。
現にExceptional C++ではくそみそに非難されてた。
- 280 名前:デフォルトの名無しさん :04/09/07 22:49
- 糞味噌って程じゃあ…
まあ、漏れも_のprefixには反対だが
- 281 名前:デフォルトの名無しさん :04/09/07 22:54
- 前につけることが禁止されてなければこれほど名前付けで楽できる事は無いのに。
- 282 名前:デフォルトの名無しさん :04/09/07 22:54
- ちなみに、#defineで_valueとかが使われる可能性があるので、クラスのメンバと言えども、OKではないです。
- 283 名前:デフォルトの名無しさん :04/09/07 23:00
- 後ろにつければ?
- 284 名前:デフォルトの名無しさん :04/09/07 23:02
- >>282 この流れでいいかげんなこと言っちゃいけない。
- 285 名前:デフォルトの名無しさん :04/09/07 23:10
- >>282
プリプロセッサ用の予約名は大文字で始まるから問題ないんだよ。
- 286 名前:デフォルトの名無しさん :04/09/07 23:14
- いや、実際に>>282みたいな実装があるらしい。
Exceptional C++に書いてある。
- 287 名前:デフォルトの名無しさん :04/09/07 23:21
- プログラミング言語C++ 116ページより
先頭がアンダースコアになっている名前は、実装や実行時の環境の特別な機能のために
予約されているので、アプリケーションプログラムではそのような名前を定義しないように
するべきである
- 288 名前:デフォルトの名無しさん :04/09/07 23:21
- >>286
うん、だからといってそれはC++でコードを書くときに使ってはいけない理由にならない。
標準以外のマクロや関数を提供してる処理系なんていくらでもあるんだし。
たとえば、VC++でmin/maxというマクロが設定されてるんだけど、
その名前を絶対に使うなってのは無茶ってものだ。
- 289 名前:デフォルトの名無しさん :04/09/07 23:23
- VC++ の min/max って何で inline にしないの?
せめて ifdef __cplusplus で囲って欲しいのだが
- 290 名前:デフォルトの名無しさん :04/09/07 23:24
- 理由の一つにはなるよ。
min/maxだって使わないのがいいだろうね。
- 291 名前:デフォルトの名無しさん :04/09/07 23:31
- アホか
- 292 名前:デフォルトの名無しさん :04/09/07 23:34
- >>287 FDIS 17.4.3.12 より
[Each name that contains a double underscore (__)]
or
[begins with an underscore followed by an upper-case letter]
is reserved implementation for any use
[Each name that begins with an underscore]
is reserved to the implementation for use as a name in the
*global namespace.*
- 293 名前:デフォルトの名無しさん :04/09/07 23:35
- >>290
VCじゃmin/maxつかわないほーがいいだろうけど、他の処理系使うときにまでそんな事言わないだろ。
282みたいな実装の処理系があるからと言って、関係ないところでそれを制限するのは筋違いだ。
- 294 名前:デフォルトの名無しさん :04/09/07 23:41
- >>292
そこは標準*ライブラリ*のページだね。
C++のページには予約語の説明ないのかな?
- 295 名前:デフォルトの名無しさん :04/09/07 23:42
- >>293
でも移植性はなくなる。
筋違いとは思わない。
- 296 名前:デフォルトの名無しさん :04/09/07 23:44
- C++の「言語」で予約してる名前はkeywordsにあるものだけ。
- 297 名前:デフォルトの名無しさん :04/09/07 23:53
- defineなんざundefすればokさ。
- 298 名前:デフォルトの名無しさん :04/09/07 23:55
- そうそう。
boostの中身はundefの嵐さ
- 299 名前:デフォルトの名無しさん :04/09/08 00:01
- 話が複雑で良くわからないのだけど、
・アンダースコアで始まる名前はグローバルのみで予約されている
・プログラミング言語C++は間違い
・それにもかかわらず、#defineで使っている処理系がある
でいいの?
- 300 名前:デフォルトの名無しさん :04/09/08 00:02
- アンダースコア+upper-case letterはどこでも。
- 301 名前:デフォルトの名無しさん :04/09/08 00:04
- つまり要約すると使うなってことだ。
- 302 名前:デフォルトの名無しさん :04/09/08 00:08
- それを普通は思考停止と言う
- 303 名前:デフォルトの名無しさん :04/09/08 00:09
- じゃあ、勝手に思考停止しないで使って批判されててくれ。w
俺は止めないから。
- 304 名前:デフォルトの名無しさん :04/09/08 00:19
- 批判する奴がバカなんだしどうでもええよ。
- 305 名前:デフォルトの名無しさん :04/09/08 00:21
- そう思ってるならお前がバカだ。
- 306 名前:デフォルトの名無しさん :04/09/08 00:23
- そう思ってるならお前がバカだ。そう思ってるならお前がバカだ。
- 307 名前:デフォルトの名無しさん :04/09/08 00:25
- 批判する奴は正当なのを不当だと難癖つけるんだろ?バカじゃん。
- 308 名前:デフォルトの名無しさん :04/09/08 00:26
- この場合、言語規格によって、予約されているされていないはあんまり問題ではないと思うよ。
実際に#defineで使っている処理系がある以上、移植性がなくなるし
面倒に巻き込まれる可能性が出て来るのであれば、避けるべき。
思考停止できるということは、聞こえは悪いが、この場合に限っては利点だよ。
- 309 名前:デフォルトの名無しさん :04/09/08 00:30
- >>307
やっぱお前バカだ。
正当とか関係なく避けたほうがいいことはある。
- 310 名前:デフォルトの名無しさん :04/09/08 00:37
- そう思ってるならお前がバカだ。
- 311 名前:デフォルトの名無しさん :04/09/08 00:42
- プログラミング言語C++に書いてある(間違えてる?)ぐらいだしね。
どの処理系が#defineで使っているかまでは知らないけど、使わない方が
良いことは確かだね。
- 312 名前:デフォルトの名無しさん :04/09/08 00:47
- オレは使ってみるかなぁ、移植なんかしないし
なんか魅力的なんだよな、_メンバ
魅力あるから話題になるんだろうし
- 313 名前:デフォルトの名無しさん :04/09/08 00:51
- お前様方ちょいと質問です。
template<typename _Type> static inline void endian(_Type & val) {
std::reverse(reinterpret_cast<char *>(& val), reinterpret_cast<char *>(& val + 1));
}
って定義があって、構造体のメンバに対して例えば
struct Foo {
double bar;
int baz;
} foo;
endian(foo.bar);
endian(foo.baz);
ってな感じで使ってるコードがあるんですが、endian()の中で一体全体何が起きているのか
教えちゃあ貰えないでしょうかね。
- 314 名前:デフォルトの名無しさん :04/09/08 00:58
- ビッグエンディアンとリトルエンディアンを変換してるだけだろ。
- 315 名前:デフォルトの名無しさん :04/09/08 01:06
- >>308
>#defineで使っている処理系がある以上
そのシンボルだけ避ければ良い話じゃないか?
#defineで使われている可能性を論じるのなら
C++で認識可能なあらゆるシンボルが使えなくなってしまうし。
- 316 名前:313 :04/09/08 01:09
- >>314
いやさ、そいつは判らない訳じゃあないんですが、どんな仕掛けになってるのかって処がよく判らないんでさ。
普通にCで書くならポインタとサイズを渡さないといけないわけで、それを巧いことやっつけてるってぇことは想像つくんですがね。
- 317 名前:デフォルトの名無しさん :04/09/08 01:21
- サイズの変わりに終了位置を渡してるじゃん
- 318 名前:デフォルトの名無しさん :04/09/08 01:30
- >>315
そうやっていちいち避けるのが面倒だから使わないようにするという話だろ。
実際問題、それ以外であまりに迷惑な#defineのされ方はしない。
>>316
val + 1でサイズ分移動するだろ。
- 319 名前:313 :04/09/08 01:40
- >317の話でピンと来たんで調べてみたら、reinterpret_castってぇのはCのキャストと考えてもよさそうだってことですな。
つまりendian()の中身は
reverse((char *) &val, (char *) (&val + 1));
って感じだと。これで終了位置がわたるってぇことは、この場合のtemplateは<>で括らなくてもきちんと型情報が伝わってるってことですかい。
なにやら巧い仕組みですなぁ。
いやほんとにC++は面白いもんですな。てめぇで書くのはちょっとばっかし難儀しそうですがね。
>>314、>>317、>>318
いやぁ、忝い。
- 320 名前:デフォルトの名無しさん :04/09/08 01:44
- ん?別にC++じゃなくたって、何の型のポインタかわかっていれば、
val+1でポインタのアドレスはサイズ分移動するだろ。
templateは<>でくくらなくてもってのは意味不明。
templateで型情報がコンパイル時に伝わってるというのは
ある意味正しいかもしれないが。
- 321 名前:デフォルトの名無しさん :04/09/08 01:47
- ま、この流れを見てもまだアンダースコアから始まる変数名つける奴は、
ぶっちゃけ「揉め事を起こしたい」だけだな。
よっぽどの使用価値を提示できない限りは。
- 322 名前:デフォルトの名無しさん :04/09/08 01:51
- ところで「名前_ 」派の人は構造体のフィールドも
「名前_ 」としますか。
- 323 名前:デフォルトの名無しさん :04/09/08 01:52
- 俺はしない。
- 324 名前:313 :04/09/08 01:55
- >>320
いやほら、vectorなんてぇのは<>で型を括るじゃあないですか。
なんとなくそんなイメージがあったんで、endian(foo.bar)だけで型が判るのかと思ったわけですよ。
- 325 名前:デフォルトの名無しさん :04/09/08 01:58
- >>321
関数名は?
そういやシンボル名といえば、昔 end ってシンボルを定義してハマったことがあるな。
その処理系だと、リンカが end ってシンボル予約してやがって、特定のタイミングで
メモリを壊すプログラムになってしまったという。(後で _end に変わってたけど)
- 326 名前:デフォルトの名無しさん :04/09/08 01:59
- >>324
クラステンプレートは型必須、関数テンプレートは引数から推測可能なら
型は省略できる。
- 327 名前:デフォルトの名無しさん :04/09/08 02:01
- >>324
まあそんな感じ。
コンパイラはendian(foo.bar)が使われているのを見ると、double用のendianが
使われているのがわかるから、double用のendianのコードを生成できる。
これ以上情報要らないだろ?
- 328 名前:デフォルトの名無しさん :04/09/08 02:03
- >>326
おっと合点承知の介。重ね重ね痛み入ります。
- 329 名前:313 :04/09/08 02:06
- おっと、>>327さんもだ。遅れて申し訳ない。
では夜も更けてきたのでこれにて御免。
- 330 名前:デフォルトの名無しさん :04/09/08 02:17
- いずれ廃止する予定の変数などはorz_をprefixに使っている。
- 331 名前:デフォルトの名無しさん :04/09/08 02:21
- 【法則】
廃止する予定の変数・関数はいつまで経っても廃止されない。
- 332 名前:デフォルトの名無しさん :04/09/08 02:35
- はいしどうどう はいどうどう
- 333 名前:デフォルトの名無しさん :04/09/08 02:40
- typedef void (Hoge::*HOGEP)();
const HOGEP[10] = { Hoge::A, Hoge::B, ・・・};
というのを一気に
const void (Hoge::*HOGEP[10])() = { Hoge::A, Hoge::B, ・・・};
としたらvoidからconst voidに変換できないとコンパイラに言われました
で行き当たりばったりにいろいろ試してみると
void (Hoge::*const HOGEP[10])() = { Hoge::A, Hoge::B, ・・・};
でコンパイルが通ったのですが意味的におなじでしょうか?
- 334 名前:デフォルトの名無しさん :04/09/08 02:49
- >>333
おなじです。
(でもたぶん上のコードはコンパイルできない)
- 335 名前:デフォルトの名無しさん :04/09/08 03:01
- >>333
> const void (Hoge::*HOGEP[10])()
HOGEP は
Hoge クラスのメンバ関数へのポインタの配列で、
ポインタが指すメンバ関数の型は引数無し・戻り値 const void 型
(const は戻り値にかかってしまい HOGEP[0], HOGEP[1], ... は const ではない)
> void (Hoge::*const HOGEP[10])() = { Hoge::A, Hoge::B, ・・・};
Hoge クラスのメンバ関数への書き換え不可能なポインタの配列で
ポインタが指すメンバ関数の型は引数無し・戻り値 void 型
typedef で定義してるのと後者は同じ意味になる。前者は全然違う。
C/C++ の型定義は微妙に分かりづらいので、悩んだら素直に typedef
しとくのが吉だよ。
- 336 名前:デフォルトの名無しさん :04/09/08 03:03
- >>334
変数名を書き忘れていました
ただしくは
const HOGEP hogep[10] = { Hoge::A, Hoge::B, ・・・};
でした
レスありがとうございmす
- 337 名前:デフォルトの名無しさん :04/09/08 03:04
- >>335
さらに詳しくありがとうございます
- 338 名前:デフォルトの名無しさん :04/09/08 08:10
- マウスポインターの座標と押されたマウスボタンを検出するにはどうしたらいいのでしょうか
ご教授おねがいします
- 339 名前:デフォルトの名無しさん :04/09/08 08:22
- int get_mouse_button_status(unsigned int* status)
{
/* 環境依存なので好きなコードを */
}
int get_mouse_cursor_position(int* x, int* y);
{
/* 環境依存なのでお望みのコードを */
}
unsigned int status;
get_mouse_button_status(&status);
int x, y;
get_mouse_cursor_position(&x, &y);
- 340 名前:デフォルトの名無しさん :04/09/08 08:47
- >>157に似た質問になるんすけど
operator=も省略の対象になるんでしょうか?
自分は全てのクラスにコピーコンストラクタとoperator=を入れるようにしているので
コピーコンストラクタと違って省略されないようだとパフォーマンスに無駄が出ますよね。
- 341 名前:デフォルトの名無しさん :04/09/08 08:53
- >>340
A a;
a = 1;
素直に考えると、 a = 1 が a.operator=(A(1)) になるわけだけど、
このうちのどこが「省略」できる?無理じゃない?
- 342 名前:340 :04/09/08 09:26
- >>341
operator=の中身は普通に代入のみで
コピーコンストラクタと同様なのですが
コンパイラにそれはわかりませんよね。
やっぱり省略はされないんですね。
struct A
{
int a;
void A( const A& other) : a(other.a){}
A& operator=( const A& other){ a = other.a}
};
また、COMの関係上operator=が必要なクラスがあるのですが
その派生クラスにはoperator=のオーバーライドは必要になるのでしょうか?
struct B : public A
{
B& operator=( const B& other){ return A::operator=( other);} // 必要か?
};
- 343 名前:デフォルトの名無しさん :04/09/08 09:32
- >>342
> また、COMの関係上operator=が必要なクラスがあるのですが
> その派生クラスにはoperator=のオーバーライドは必要になるのでしょうか?
意味はわからないが、コードを見る限り要らない。
代入演算子の宣言が無く、基底クラスと各メンバの代入演算子が有効な場合は
それらを使ってデフォルトの代入演算子が定義される。
- 344 名前:340 :04/09/08 09:50
- >>343
了解しました。
いろいろありがとうございました。
- 345 名前:デフォルトの名無しさん :04/09/08 11:39
- クラス関連の質問なのですが、コンストラクタの宣言に戻り値の型が含まれているとなり、コンパイルをすることができません。
書籍に載っているコードで、正誤表を確かめたのですが正誤表には載っておらず困っています。
使用しているソフトはVC++6.0です。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_32/code.txt
- 346 名前:デフォルトの名無しさん :04/09/08 11:53
- >>345
class Myrectangle1 : public Rectangle
{
public:
Myrectangle1();
} ←セミコロンが抜けてる。Myrectangle2も同様。
- 347 名前:デフォルトの名無しさん :04/09/08 12:35
- >>339
レスありがとうございます
VC++.netなんですがマウスポインターの座標と押されたマウスボタンを検出する
命令にはどんなのがあるんでしょうか?
- 348 名前:デフォルトの名無しさん :04/09/08 12:44
- クラスAのメンバ変数をクラスAでnewしてクラスBにポインタを渡す。
クラスB内でそのポインタをdeleteしても大丈夫なんでしょうか。
- 349 名前:デフォルトの名無しさん :04/09/08 12:48
- >>346
う。。。よくみたら抜けてますね。。。お恥ずかしい。。
ありがとうございました(泣
- 350 名前:デフォルトの名無しさん :04/09/08 12:55
- >>348
その後のクラス A からの間接参照や delete 等がなけりゃだいじょうぶっちゃあだいじょうぶだが
オブジェクト指向の流儀に反するんで一般的にはやらないほうがいい。
A が builder とか B の補助クラスとかなら別だけど。
- 351 名前:デフォルトの名無しさん :04/09/08 13:05
- >>347
Win32API質問箱 Build22
http://pc5.2ch.net/test/read.cgi/tech/1092524669/
↑
こっちで訊いた方がいいよ。ちなみに当該 API は、
現在の状態なら GetCursorPos, GetAsyncKeyState、
現在処理中のウィンドウメッセージが発生した時点の状態なら GetMessagePos, GetKeyState
- 352 名前:デフォルトの名無しさん :04/09/08 13:25
- >>351
レスありがとうございます
GetCursorPos, GetAsyncKeyStateについて調べてみます
- 353 名前:345 :04/09/08 16:59
- http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_33/code.txt
上のコードのメインのfor文でなぜか画面に文字が表示されず困っています。
コンパイルは通るもの、どこが間違っているのか教えていただけないでしょうか。
- 354 名前:デフォルトの名無しさん :04/09/08 17:02
- >>353
forの条件式をよく見ろ。
- 355 名前:345 :04/09/08 17:11
- >>354
気づきました。。
久しくforをつかってなかったのでこんなミスもわからなかった・・orz
スンマセン
- 356 名前:デフォルトの名無しさん :04/09/08 18:07
- >>355
質問には関係ないことだけど、コメントの書き方が良くない。
インデントもおかしいし。const int& にする意図も良く分からない。
- 357 名前:デフォルトの名無しさん :04/09/08 18:11
- int = 64bit
pointer = 32bit
環境でパフォーマンスの問題が出にくいようにするためだろう。
逆のケースの方が多いけど
- 358 名前:新米C++グラマーの独り言 :04/09/08 22:10
- やーまいったまいった。
昨日は動的にメモリを確保しているクラスに
自前 operator= を定義していなかったせいで
プログラムが変なところで止まって6時間悩んだし、
今日は外部から渡されたインスタンスを
リファレンスで保持していたせいで
たまたま生成元のインスタンスが
自分より逝ってしまう状況になった途端
プログラムが止まっちゃって3時間悩みました。
明日は何事もなければいいなぁ。。。
そうだ、今ならまだ _ を prefix から suffix にできる
チャンスかも知れない。来週前半に置き換えよっと。
- 359 名前:デフォルトの名無しさん :04/09/08 23:11
- 正規表現使えばすぐ出来るような気が。
- 360 名前:デフォルトの名無しさん :04/09/09 05:31
- 絶対余計なものまで壊す
- 361 名前:本日の藁 :04/09/09 06:46
- main()
{
int a;
int* b;
int& c = *b;
b = &a;
a = 69;
std::cout << a << std::endl;
std::cout << *b << std::endl;
std::cout << c << std::endl;
}
しばらく考え込んでしまった・・・
- 362 名前:マイク ◆yrBrqfF1Ew :04/09/09 07:40
- mainにintが無い。
- 363 名前:デフォルトの名無しさん :04/09/09 10:56
- 最初の*bは当然不定だし…うーん、笑い所が分からない
- 364 名前:デフォルトの名無しさん :04/09/09 11:31
- 普通のことだと思うんだが…。俺も笑い所が分からない。
- 365 名前:デフォルトの名無しさん :04/09/09 12:18
- 俺も笑いが止まらない。
- 366 名前:デフォルトの名無しさん :04/09/09 13:42
- C++つかうと一気に知力が10倍に?!
- 367 名前:デフォルトの名無しさん :04/09/09 14:17
- void main(void)にしろ
- 368 名前:デフォルトの名無しさん :04/09/09 14:53
- >>366
使い方によるだろ。
俺は拡張子に .c を指定して、極力 class や template を使用しないようにしているが、
例えば inline を使っても使わない時と比べてもほとんど知力は変わらない。
- 369 名前:デフォルトの名無しさん :04/09/09 15:00
- すげえ。オブジェクト指向設計もしないで知力が増えないとかいってるよ。この人。
- 370 名前:デフォルトの名無しさん :04/09/09 15:08
- delete this;
これは何か問題になることがありますか?
- 371 名前:デフォルトの名無しさん :04/09/09 15:10
- クライアントがオブジェクトの削除されたタイミングを把握しづらいだけ
- 372 名前:デフォルトの名無しさん :04/09/09 15:12
- では、放任主義なら問題ありませんね。
どうもありがとうございました。
- 373 名前:デフォルトの名無しさん :04/09/09 15:23
- ローカル変数にしてもいいの?
- 374 名前:デフォルトの名無しさん :04/09/09 15:27
- いいわけない
- 375 名前:デフォルトの名無しさん :04/09/09 15:49
- >>373
ローカル変数ならdelete出来ないと思いますが。
newした後ポインタを保持しないサンプルソースは見たことがあります。
当然delete thisしています。
- 376 名前:デフォルトの名無しさん :04/09/09 15:54
- 質問なんですが、
strdupという関数を使って、
char* a = strdup(name) nameは文字列
と、
char* a = new char[strlen(name) + 1]
strcpy(a, name)は、
同じ働きなんですか?
- 377 名前:デフォルトの名無しさん :04/09/09 16:03
- >>370
知ってるかもしらんけど、デストラクタをprotectedやprivateにすると吉かも。
>>376
非標準な関数だから一概には言えんけど、newじゃなくてmallocでなかろうか。
- 378 名前:デフォルトの名無しさん :04/09/09 16:08
- >>377
そうなんですか〜 mallocっていう関数はまだ使った事がないんですよね。
文字列のコピーは今までnewして、strcpyでやってたもので・・・。
たまたま、今勉強しているところで、strdupっていうのが出てきて、
今まで通りのやり方でも出来るんじゃないか??って疑問に思ったんですよ。
ありがとうございました!
- 379 名前:デフォルトの名無しさん :04/09/09 16:20
- >>377
なるほど、勉強になります。
- 380 名前:デフォルトの名無しさん :04/09/09 16:23
- >>376
ふつうはstrcpyじゃなくてmemcpyを使う。
- 381 名前:デフォルトの名無しさん :04/09/09 16:51
- //テキストの表示
HDC hdc;
LPTSTR lptStr = TEXT("111");
hdc = GetDC(hWnd);
TextOut(hdc , 0 , 0 , lptStr , lstrlen(lptStr));
ReleaseDC(hWnd , hdc);
これだと111が表示されるのですが
変数Aの内容を表示させたい時はどうすればいいのでしょうか?
- 382 名前:デフォルトの名無しさん :04/09/09 16:52
- スレ違い警報
- 383 名前:デフォルトの名無しさん :04/09/09 20:45
- >>381
sprintfと言いたいが_stprintfかwsprintfの方がいいだろうか。
- 384 名前:デフォルトの名無しさん :04/09/09 23:11
- 配列を大きい順に並べ替えたいのですが
どうすればいいですか?
- 385 名前:デフォルトの名無しさん :04/09/09 23:17
- 意味がわからない(というか不明瞭)。
- 386 名前:デフォルトの名無しさん :04/09/09 23:17
- >>384
int array[100];
//hogehoge
std::sort(array, array + 100, std::greater<int>());
- 387 名前:デフォルトの名無しさん :04/09/10 00:19
- 10万近いオブジェクトをnew-deleteしなきゃなのですが、
こういうのってそのままやっちゃって良いんですかねぇ。
フラグメンテーションが気になる、元ゲーム系…。
- 388 名前:デフォルトの名無しさん :04/09/10 00:27
- 実際にやってみて問題があるならプールなり考えればよかろう
- 389 名前:デフォルトの名無しさん :04/09/10 00:28
- >>387
そう思うならプールしろよ。
- 390 名前:デフォルトの名無しさん :04/09/10 00:50
- operator=()を下みたいに呼ぶときに、呼ばれた時点で相手のクラスのデストラクタが呼ばれていてエラーがでるのを
うまく回避するにはどうすればいいですか? operator+()などでは自分自身を変えたくないので自動変数を使っています。
static A cNewA; みたいにすれば出来るには出来ましたが、再起処理の中で使うと収集つかなくなりそうです。
DWORD g_dwIndex=0;
class A{
public:
DWORD m_dwID;
char *m_pcBuff;
A(){ m_pcBuff=new char[1000]; m_dwID=g_dwIndex++; }
A(LPCTSTR pStr){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, pStr); m_dwID=g_dwIndex++; }
void SetString(LPCTSTR pStr){ strcpy(m_pcBuff, pStr); }
~A(){ delete [] m_pcBuff; TRACE("*******(%u)のデストラクタ*******\n", m_dwID); }
void Add(LPCTSTR pStr){ strcat(m_pcBuff, pStr); }
A& operator=(A& cTarget){ //(2)ここで引数内のバッファが消滅されてる
strcpy(m_pcBuff, cTarget.m_pcBuff);
return *this;
}
A& operator+(A& cTarget){
A cNewA(m_pcBuff);
cNewA.Add(cTarget.m_pcBuff);
return cNewA; //(1)ここまでは正常"ABC"+"DEF"→"ABCDEF"@cNewA
}
void Disp(){ TRACE("%s\n", m_pcBuff); };
};
- 391 名前:デフォルトの名無しさん :04/09/10 00:51
- つづき
int main(){
A cA("ABC"), cB("DEF"), cC;
cA.Disp();
cB.Disp();
cC=cA+cB; //ここでエラー
cC.Disp();
}
- 392 名前:デフォルトの名無しさん :04/09/10 00:54
- >>390-391
DWORDとかLPCTSTRみたいなWin32な定数を全部C++標準で表現できる
基本型に直してから出直せ。
- 393 名前:デフォルトの名無しさん :04/09/10 00:55
- なにローカル変数の参照返してんだ
- 394 名前:デフォルトの名無しさん :04/09/10 00:56
- >>392
プッ
- 395 名前:デフォルトの名無しさん :04/09/10 01:02
- >>390
>(2)ここで引数内のバッファが消滅されてる
~~~~~~~~~
まともな日本語が話せるようになってからうpちまちょうね〜坊や( ´,_ゝ`)プッ
- 396 名前:デフォルトの名無しさん :04/09/10 01:09
- あ〜なんか窓達ムカついてきた
- 397 名前:390 :04/09/10 01:13
- あっ、main()でreturn 0;するの忘れてる・・・
>>392
再度長々と書き込むのもあれなんでunsigned longとconst char *に読み替えてください
>>393
出来るのなら左辺側の参照かポインタでも得たいものですが、operator()でそういう手段ありました?
- 398 名前:デフォルトの名無しさん :04/09/10 01:18
- >>397
Effective C++ 23項
「オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう」
A& operator+(A& cTarget)
↓
A operator+(A& cTarget)
この項には君が悩んでいる問題とほとんど同じ内容が書かれている。
- 399 名前:デフォルトの名無しさん :04/09/10 01:20
- もう一個。
Effective C++ 31項
「関数は、ローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先
を返してはならない」
基本中の基本です。>>393さんが実はさらりと答えてくれてるけど。
- 400 名前:デフォルトの名無しさん :04/09/10 01:21
- operator+(const A& cTarget) constじゃないと。
- 401 名前:デフォルトの名無しさん :04/09/10 02:04
- コピーコンストラクタも忘れんなYO!
- 402 名前:デフォルトの名無しさん :04/09/10 02:10
- >>398
>>399
>>400
A operator+(A& cTarget) もやってみて駄目だったのですが、何でだろうと
悩んでいたところひょっとして自分と同じ方の参照を引数としたコンストラクタが
必要なのでは!?と下の行を追加してみました。
//追加したコンストラクタ
A(A& cTarget){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, cTarget.m_pcBuff); }
ビルドして実行してみたところ無事に実行できました。やっとこれで目的のクラスで演算子の
オーバーロードを搭載出来る目処が立ちました。どうもお世話になりました。
あとよくよく考えたらoperator=は戻り値必要ないですね
- 403 名前:デフォルトの名無しさん :04/09/10 02:13
- constを意識しろって
- 404 名前:デフォルトの名無しさん :04/09/10 02:14
- >>401
まさにそれですた orz
- 405 名前:デフォルトの名無しさん :04/09/10 02:23
- >>402
>あとよくよく考えたらoperator=は戻り値必要ないですね
cA = cB = cC; みたいな事をしないならばな。
- 406 名前:デフォルトの名無しさん :04/09/10 02:28
- >>405
それだけではない。度々済まないが
Effective C++ 15項
「operator=を書くときは、*thisへのリファレンスを返そう」
(a = b) = c; のような、実用上意味がなさそうだが文法に違反していない文を
正しく実行できるようにするためだとか。
>>403
そうなんだが一度に言うと混乱しそうだったから。
- 407 名前:390 :04/09/10 03:03
- operator=()は参照返しでいいんですか。それなら戻り値付けた方がいいですね。
const ですが、ずいぶん前にconstをつけようとしていた時期がありましたが
メソッドを呼び出せなくなってそれ以来constを付けるのを控えていたのですが
宣言の末尾に付ければ呼び出せることを今更ながら知ったので、これからはconstを
付けていくことが出来そうです
- 408 名前:デフォルトの名無しさん :04/09/10 03:20
- >>407
じゃなくて〜。const付けたのと付けないのの両方が厳密に言えば必要なのよ。
でも今の質問の流れから行ってそこまで説明する必要はないと思ったわけよ。
それと mutable についてもついでに調べておいてね。
- 409 名前:デフォルトの名無しさん :04/09/10 04:29
- >>407よ、↓ここで修行してこい。
【C++】 const だけでメシが3杯食えちゃうスレ
http://pc5.2ch.net/test/read.cgi/tech/1078193971/
- 410 名前:デフォルトの名無しさん :04/09/10 06:59
- operator=のconstは普通戻り値だけだ。
mutableは関係ない。
- 411 名前:マイク ◆yrBrqfF1Ew :04/09/10 07:20
- >A(A& cTarget){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, cTarget.m_pcBuff); }
boundary-checkはどうした?
- 412 名前:デフォルトの名無しさん :04/09/10 07:41
- >>390
関係ないけど
#define UNICODE
されるとやばいんじゃないか
- 413 名前:381 :04/09/10 09:04
- >>382
>>383
すれ違いみたいなので他で聞いてきます
ありがとうございました
- 414 名前:デフォルトの名無しさん :04/09/10 12:43
- 質問なんですが、自分はwindowsXPで、VC++を使って勉強しているのですが、
DOS画面って言うんだったかな?ビルドしたときの黒い画面なんですが、
漢字を使う事ができず、アルファベットだけしか使えません。
どうにかして使える方法はありませんか?
- 415 名前:デフォルトの名無しさん :04/09/10 12:47
- >>414
[Alt] + [半角/全角] でカナ漢字変換モードになると思うけど。
- 416 名前:デフォルトの名無しさん :04/09/10 14:02
- >>415
ありがとうございました!
そんな方法があったんですね☆
それも簡単に!
- 417 名前:新米C++グラマー今日の疑問 :04/09/10 22:27:46
- class HogeHogeClass {
static Boolean fetchValue(
const HogeInstance & instance,
const String & key,
String & value);
};
とまあこんな関数があるとして、他のクラスからいちいち
HogeHogeClass::fetchValue(instance, key, value);
とクラス名を付けなくても呼び出せるようにするだけの目的で
そのクラスに HogeHogeClass を private 継承させるのは
DQN でしょうか? 他に何かうまい方法がありますか?
- 418 名前:新米C++グラマー今日の疑問 :04/09/10 22:28:49
- あ、ちなみに HogeHogeClass には static 関数しか入ってません。
- 419 名前:デフォルトの名無しさん :04/09/10 22:37:45
- staticメンバ関数しかないならclassにするな阿呆。
- 420 名前:新米C++グラマー今日の疑問 :04/09/10 22:41:25
- >>419
えー、普通の手法だと思ってたんですけど。
C++ではそういうことはしないんですか。。。
ほんじゃあクラスから出して代わりに
独自のnamespaceに入れるってのが
C++流の正しい解法なのでしょうか。
使いたいファイルでは using HogeHoge とすると。
- 421 名前:デフォルトの名無しさん :04/09/10 22:41:59
- >>417
間違いなくDQN。継承じゃなく包含を使え。
>>419
標準にもstaticしかメンバがないstd::numeric_limits<>という
classがあるわけだが。
- 422 名前:デフォルトの名無しさん :04/09/10 22:45:32
- >>421
たぶんstd::numeric_limits<>は引数としてやりとりできるようにclassになっているんだと思う。
- 423 名前:デフォルトの名無しさん :04/09/10 22:45:34
- >>419
char_traits
- 424 名前:デフォルトの名無しさん :04/09/10 22:45:57
- それテンプレートクラスじゃん
- 425 名前:デフォルトの名無しさん :04/09/10 22:50:59
- >>424
テンプレートクラスがクラスでないと言うなら419の主張と符合するが・・・
- 426 名前:デフォルトの名無しさん :04/09/10 22:54:05
- >>422 はぁ?
- 427 名前:デフォルトの名無しさん :04/09/10 22:54:10
- テンプレートクラスじゃなくて、クラステンプレート
- 428 名前:デフォルトの名無しさん :04/09/10 23:02:16
- クラステンプレートの具現
- 429 名前:新米C++グラマー今日の疑問 :04/09/10 23:44:17
- 皆さんご回答ありがとうございます。
>>421
>間違いなくDQN。継承じゃなく包含を使え。
包含っていうのは今回の場合はどういうことを指すのか
よく分からないのですが、
UhiClass {
// コンストラクタ等省略
static fetchValue((
const HogeInstance & instance,
const String & key,
String & value)
{
HogeHogeClass::fetchValue(instance, key, value);
}
};
としろ、ということでしょうか? 勘違いしていたらごめんなさい。
- 430 名前:デフォルトの名無しさん :04/09/10 23:57:28
- >>429
instance.fetchValue(key, val);
ってことじゃね?
- 431 名前:デフォルトの名無しさん :04/09/10 23:58:52
- 基本的なことですが、メモリの解放で
分からないことがあるのでお教えください
int *i,*j;
i=new int[100];
j=i;
delete [] j;
↑この場合はi=new int[100]
で確保したメモリは解放されるのでしょうか?
- 432 名前:デフォルトの名無しさん :04/09/11 00:00:47
- >>431 解放されますよ。
- 433 名前:431 :04/09/11 00:05:30
- >>432
どうもありがとうございます。
もうひとつよろしいでしょうか。
jは確保したメモリの先頭のアドレスだけ指しているのに、
100個連続して確保しているという情報はどこにあるのですか?
- 434 名前:デフォルトの名無しさん :04/09/11 00:06:16
- 確保したメモリの先頭のアドレスの手前
- 435 名前:431 :04/09/11 00:10:06
- >>434
長年の謎が解けました。ありがとうございます。
- 436 名前:デフォルトの名無しさん :04/09/11 00:51:30
- operator new[]やoperator delete[]をオーバーロードして
使ってる好例ってないでしょうか?
今の自分の知識では「触らぬ神に祟りなし」という感じがして使えていないので。
- 437 名前:デフォルトの名無しさん :04/09/11 00:56:46
- >>434-435
おいおい…
- 438 名前:433=431 :04/09/11 01:04:09
- >>437
あれ、違うのですか?
- 439 名前:デフォルトの名無しさん :04/09/11 01:17:41
- >>438
14882:2003(1998でも良いが)のどこにそんな事が書いてある?
- 440 名前:433=431 :04/09/11 01:19:46
- それでは、私が抱いていた疑問の答えはどうなるのでしょうか?
- 441 名前:デフォルトの名無しさん :04/09/11 01:21:22
- >>436
あれは、テンプレートコンテナ開発者のためのデバッグインターフェイスにすぎない。
コンテナを「使う」側の人間が触る必要はない。
- 442 名前:デフォルトの名無しさん :04/09/11 01:22:36
- >>440
知るかヴォケェ、が正解。処理系作る人間でない限り知ったこっちゃないし、そうなら好きにすればいい
- 443 名前:デフォルトの名無しさん :04/09/11 01:36:53
- >>440
確保した順にサイズをスタックへ突っ込んで突っ込んで突っ込みまくる。
- 444 名前:440 :04/09/11 02:42:33
- >>442
分かりました、とりあえずメモリの解放は
暗黙のうちにできてしまうと言うことですね。
>>443
順番に突っ込んで行ったら順不同でメモリ解放するとき
どうなってしまうのでしょうか。
- 445 名前:デフォルトの名無しさん :04/09/11 02:58:53
- 実装に依存する
実装の一例として>>434の様なものもあり
だがそれに依存するコードを書くのはお勧めしない
- 446 名前:440 :04/09/11 03:08:30
- >>445
それではとりあえずイメージとして
>>434のように考えておけば安心できそうなので、
自分の中ではそれで納得してみます。
あくまでイメージなので
それに依存するようなことはしませんが。
- 447 名前:デフォルトの名無しさん :04/09/11 03:23:29
- >>446
ほんの一例だが
#include <iostream>
int main()
{
char* p = new char[100000];
std::cout << *reinterpret_cast<size_t*>(p - sizeof(size_t)) << std::endl;
delete p;
}
BCC5.6.4
100000
VC7.1
1574657
gcc3.4.1(MinGW)
524545
BCC5.6.4は>>446さんのイメージ通りの結果かもしれないが、VCやMinGWでは
どうも他の手段でサイズをストアしているようだ。これだけからは何とも言えないが、
少なくともこの機能に依存したプログラムは移植性がない事だけはわかる。
- 448 名前:デフォルトの名無しさん :04/09/11 03:25:15
- あ、悪い
×delete p;
○delete[] p;
- 449 名前:デフォルトの名無しさん :04/09/11 03:40:59
- そのサイズって実行時にわかる必要なくない?
むしろ、BCCのように実行時にまで値をストアしてる処理系があったことの方が驚き。
- 450 名前:デフォルトの名無しさん :04/09/11 03:48:13
- まぁこのコードの場合は必要無いかもしれん。
- 451 名前:440=446=431 :04/09/11 04:16:13
- int i,*p;
std::cin>>i;
p=new int[i];
のようにしたときは実行時にも
どこかに確保したサイズ情報があることになると思うのですが。
それがどこにあるか分かれば、
メモリ解放するとき半分だけ解放のような
奇妙なことができるわけですか?
- 452 名前:デフォルトの名無しさん :04/09/11 04:32:41
- 早速試す。
#include <iostream>
int main()
{
int i;
std::cin >> i;
char* p = new char[i];
std::cout << *reinterpret_cast<size_t*>(p - sizeof(size_t)) << std::endl;
delete[] p;
}
で、100000を入力。
BCC5.6.4
100000
VC7.1
1574657
gcc3.4.1(MinGW)
524545
結果は変化ありませんですた。
- 453 名前:デフォルトの名無しさん :04/09/11 07:08:25
- std::stringstreamに整数出力すると
どうしても桁区切り文字がでちゃうんだけど
出さないようにするにはどうすればいい?
- 454 名前:デフォルトの名無しさん :04/09/11 08:04:04
- >>453
面白い処理系だな。それともロケールの問題か?
- 455 名前:デフォルトの名無しさん :04/09/11 08:06:59
- std::use_facetでctype_base::punctをマスクするとか。
- 456 名前:デフォルトの名無しさん :04/09/11 09:02:17
- >>454
なるほどーとか思って
std::locale::global( std::locale("") );
したらとりあえず消えました。thx
処理系はVC6+STLportなんだけど...
どっかでロケール変更されてるのかしら
>>455
はははイミワカンネorz
勉強してきまふ
- 457 名前:デフォルトの名無しさん :04/09/11 10:25:00
- >>456
STLportだと
std::cout.imbue(std::locale("En_US"));
でカンマが付くようになるな。どっかで指定されてない?それともデフォルトの
ロケールがおかしくなっているの鴨。
- 458 名前:デフォルトの名無しさん :04/09/11 12:02:55
- C++オブジェクトのマーシャリングってチマチマやるしかないんでしょうか?
- 459 名前:デフォルトの名無しさん :04/09/11 12:37:02
- >>458
ない。
特定のフレームワークに依存して良いなら、もう少し楽できることもある。
MFC 使うとか。
環境絞り込んで書いてみ?
- 460 名前:387 :04/09/11 17:33:17
- >>388-389
遅くなったがレスサンクス
やっぱりこの苦行はしなきゃなのね
でもboost::poolとか使えば楽なのかな…
- 461 名前:デフォルトの名無しさん :04/09/11 22:28:10
- 素人な質問ですいません、
ifstream i;
char c[51];
i.open("test.txt")
while(!(i.eof())){
i.getline(c,50);
}
でtest.txtに50字以上の行が含まれていると強制終了
してしまうようなんですがこれは仕様なんでしょうか?
前にどこかのサイトでこの場合50字だけ読み込んでくれる仕様だと
勉強した記憶があるのですがそのサイトがどこだったか忘れてしまい
自分の記憶にも自信がありませんで、ここに頼らせてもらうことにしてしまいました。
すいませんがよろしくお願いします。
- 462 名前:デフォルトの名無しさん :04/09/11 23:02:24
- std::stringとstd::getlineを使え。
- 463 名前:デフォルトの名無しさん :04/09/11 23:37:00
- >>461
getlineは指定した長さ以上のバッファには書き込まない。
- 464 名前:デフォルトの名無しさん :04/09/11 23:43:34
- >>461
それだとgetlineが読み込むのは49字。
そして行末に達する前に限度まで読み込むと i.fail()==true;になる。
これ以上は自分で調べなさい。
というか、ちゃんとした入門書なりリファレンスなりを手元においとかな
勉強にならんだろ。
- 465 名前:461 :04/09/11 23:54:50
- すいません、やっぱりケチらずに本を買うことにします
どうもありがとうございました。。
- 466 名前:デフォルトの名無しさん :04/09/11 23:59:19
- 標準C++のstream周りはなぜあんなに複雑になってしまったのだろうか。
- 467 名前:デフォルトの名無しさん :04/09/12 00:48:42
- >>466
きっと作った本人たちも「や、やっちまった」と、後悔してると思います。
- 468 名前:デフォルトの名無しさん :04/09/12 02:10:17
- >>467
どうかね? あれを作ること自体が C++ の試運転であって、目的は果たせたんじゃないか?
良い結果も悪い結果もすべて C++ の仕様について検討するためのデータになればいいんであって、
その残りかすそのまま ISO 標準にされたのは禿にとってゴミを拾った奴らに勝手に献上されて恥をかいたって図式だと思うぞ。
俺に言わせれば言語仕様とライブラリが同一の規格になっていることこそ( ゚д゚)ハァ?な状況だ。
- 469 名前:デフォルトの名無しさん :04/09/12 02:22:55
- 演算子のオーバーロードでこんなに凄い事が出来る事を示したかったが
失敗した。
- 470 名前:デフォルトの名無しさん :04/09/12 02:34:40
- そこでlexcal_castですよ
- 471 名前:名無しさん@Vim%Chalice :04/09/12 02:47:40
- spirit か xpressive じゃね?
- 472 名前:458 :04/09/12 03:08:14
- >>459
サンクス、なんかオープンなフレームワークあればな〜と思ったんですが、ちまちまやります。
- 473 名前:デフォルトの名無しさん :04/09/12 15:28:40
- struct A {
int a;
A() : a(0) {}
A(const A& ref) { a = ref.a; }
};
struct B : public A {
int b;
B() : b(0) {}
B(const B& ref) { a = ref.a; b = ref.b; }
};
B b1;b1.a=1;b1.b=2;
B* b2 = new B();
A* a = b2;
*a = b1;
こんなことやりたいのですが、当然オブジェクトのスライシングがおきますよね。
コピーコンストラクタをvirtualにできるわけも無いですし、cloneメソッドを実装するしかないんですか?
- 474 名前:デフォルトの名無しさん :04/09/12 15:58:12
- http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094971899&res=1
すみません。助けてください。
今、ハッシュでデータを管理して、それを二分探索木で検索するようなプログラムを作っているのですが、
削除する名前を検索して削除するっていうのをやりたいんですが、
それがなかなかうまくいきません。コメントアウトしているところが問題のところです。
エラー内容が
D:\TEST PROGRAM\基礎のプログラム\ハッシュ法\ハッシュ法(クラス).cpp(222) : error C2664: 'Node_smallest' : 2 番目の引数を 'const char *' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照)
変換で修飾子が失われます。
D:\TEST PROGRAM\基礎のプログラム\ハッシュ法\ハッシュ法(クラス).cpp(233) : error C2440: '=' : 'const char *' から 'char' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
というやつです。考えは、削除したい所をpNext[1]の方の最小値を全て入れ替えて、削除するっていうやり方を
しようと思いました。他に良い方法があったら、その方法も教えていただければ嬉しいです。
若輩者ですが、ご指導お願いします。
- 475 名前:デフォルトの名無しさん :04/09/12 16:08:31
- >>474
エラーメッセージを読め。
それから、「コメントアウト」というのはコードの一部をコメントにすることだ。
- 476 名前:デフォルトの名無しさん :04/09/12 16:08:54
- >>474
- const char* pName;
+ char* pName;
- *pName = pNode->pName;
+ pName = pNode->pName;
- 477 名前:474 :04/09/12 16:38:02
- すみません。考えてみたんですが、わかりませんでした。。。
どうしたらいいのか、教えてもらえないでしょうか?
- 478 名前:デフォルトの名無しさん :04/09/12 16:41:48
- >>477
エラーメッセージ見てわかんないなら入門書から読み直しが必要だな。
- 479 名前:474 :04/09/12 16:43:54
- はい。そうします。
- 480 名前:デフォルトの名無しさん :04/09/12 16:46:19
- >>473
その場合コピーコンストラクタじゃなくて、代入演算子をvirtualじゃまいか
- 481 名前:デフォルトの名無しさん :04/09/12 16:47:48
- C++についてなのですが、ofstreamでcinでユーザーがタイプした文字列を
テキストファイルに出力して、そのファイルをもう一度読み込み別の
テキストファイルに出力するにはどうしたらよいでしょうか?
- 482 名前:デフォルトの名無しさん :04/09/12 17:20:34
- >>481
#include<iostream>
#include <fstream>
int main()
{
typedef std::istreambuf_iterator<char> isbi;
typedef std::ostreambuf_iterator<char> osbi;
std::fstream f1("file1", std::ios::in | std::ios::out | std::ios::trunc);
std::copy(isbi(std::cin), isbi(), osbi(f1));
std::ofstream f2("file2");
f1.seekg(0);
f1.clear();
std::copy(isbi(f1), isbi(), osbi(f2));
}
- 483 名前:デフォルトの名無しさん :04/09/12 17:26:34
- >>482
f1.clear()って必要あったっけ?
EOFまで読むとエラーフラグ立ちっぱなしになるのは知っているが・・・
- 484 名前:デフォルトの名無しさん :04/09/12 17:31:58
- >>483
いらなかったな。rewind()の感覚で書いてるもんでつい…
- 485 名前:デフォルトの名無しさん :04/09/12 17:36:22
- >>482
アドバイスありがとうございます。
私はC++始めたばかりなので難しすぎてよくわかりません。。
もう少し具体的に説明しますと
void Display_contact()
{
char cTemp[80], GivenName[20], FamilyName[20], Address[40], Phone[15],
EmailAddress[25], DateofBirth[20], TypeofContact[3];
ifstream ContactBook;
ContactBook.open("contact.txt",ios::beg);
clrscr();
cin.seekg(0);
cin.clear();
cout << "\t\t\tCONTACT MAINTENANCE SYSTEM\n" << endl;
cout << "\t\t\tALL CONTACTS\n" << endl;
if (!ContactBook)
{
cout << "cannot open file";
getche();
}
- 486 名前:デフォルトの名無しさん :04/09/12 17:36:44
- 続き
while( !ContactBook.eof() )
{
ContactBook.getline(GivenName,20);
ContactBook.getline(FamilyName,20);
ContactBook.getline(Address,40);
ContactBook.getline(Phone,15);
ContactBook.getline(EmailAddress,25);
ContactBook.getline(DateofBirth,20);
ContactBook.getline(TypeofContact,3);
- 487 名前:デフォルトの名無しさん :04/09/12 17:37:30
- 続き
cout << GivenName << " " << FamilyName << "\t\t\t";
cout << EmailAddress<< "\t\t\t";
cout << TypeofContact<< "\t\t";
cout << Address << "\t\t";
cout << Phone << "\t";
cout << DateofBirth << "\n\n\n";
↑のファンクションはすでに入力されたテキストファイルを読み込んでディスプレイするのですが
こんな感じでcontact.txtを読み込んで下のcoutみたいに形を整えてもう一度別なファイル名で出力したいんです。
申し訳ないのですがもう一度アドバイスお願いできますか?
- 488 名前:デフォルトの名無しさん :04/09/12 17:43:58
- >>487
ofstream out("ファイル名");
として、coutの代わりにoutを使えば良い。
- 489 名前:デフォルトの名無しさん :04/09/12 17:49:30
- >>482
#include <iterator> が抜けてる。
copy + streambuf_iterator より、 operator<< + rdbuf() のほうがよくない?
- 490 名前:デフォルトの名無しさん :04/09/12 17:53:29
- >>488
その場合ofstream out("ファイル名");は出力ですよね?読み込みはどうすればよいのですか?
contact.txt から report.txtというファイルに出力したいのですが、その場合読み込みはどこら辺に
どうやって書けばいいですか?度々質問して申し訳ないですがお願いします。
- 491 名前:デフォルトの名無しさん :04/09/12 18:11:39
- >>489
確かにそうだ。
>>490
>>485-487の出力部分だけcoutからofstreamに書き換えればいいだろ。
- 492 名前:デフォルトの名無しさん :04/09/12 18:24:57
- >>491
一応動いたのですがテキストファイルが空っぽなんです。。
ofstream out("report.txt");
out << GivenName << " " << FamilyName << "\t\t\t";
out << EmailAddress<< "\t\t\t";
out << TypeofContact<< "\t\t";
out << Address << "\t\t";
out << Phone << "\t";
out << DateofBirth << "\n\n\n";
}
ContactBook.close();
}
これであってますか?
- 493 名前:デフォルトの名無しさん :04/09/12 19:00:52
- 先ほど、ちょっとお世話になった>>474なんですが、
エラーの原因が構造体のconstってのはわかって、コンパイルできたんですけど、
ビルトすると、途中でエラー終了してしまいます。
あの、今回はマジで教えてもらえないでしょうか?
- 494 名前:492 :04/09/12 19:19:44
- すでにあったcontact.txtを削除したら動きました!!
>>482 >>483 >>484 >>488 >>489 >>490
アドバイス本当に感謝です!!
あと一回に表示する件数を4件にしたいのですが
どうやったらいいでしょう?
- 495 名前:492 :04/09/12 19:21:27
- 訂正
>>485-487の一覧をディスプレイするプログラムです。
出力する方ではないです。
- 496 名前:デフォルトの名無しさん :04/09/12 19:34:58
- >>493
無理です。
- 497 名前:デフォルトの名無しさん :04/09/12 20:15:16
- えっと、それなら諦めます。
質問なんですが、ハッシュ法で、二分探索木を使うよりも、双方向リストで挿入法を使うほうが早いですか?
それとも、遅いですか?
- 498 名前:デフォルトの名無しさん :04/09/12 21:06:46
- >>497
だから挿入のほうが気持ちいいから!
終了!
- 499 名前:デフォルトの名無しさん :04/09/12 21:29:23
- 挿入してからがあんまり早いとダメだな
- 500 名前:デフォルトの名無しさん :04/09/12 21:30:57
- 挿入はすんなり、挿入してからはゆっくり。
■過去ログ置き場に戻る■
1- 前250
次250
最新50