[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 07/15 20:46 / Filesize : 200 KB / Number-of Response : 834
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.35【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:36:23 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

347 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:29:17 ]
WinsockでHTTPしゃべるのは結構面倒くさいヨ。

348 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:38:18 ]
どうもです。
分野はネットワーク関係なんですね。
それが解っただけでも十分です。
ありがとうございました。

349 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:51:03 ]
>>343
WindowsならURLDownloadToCacheFile()が一番お手軽

350 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 01:16:50 ]
>>343
真珠ってPearlって書くのしってんのか?
いやPerlもPearlから来てるんだがな

351 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 11:07:27 ]
C++builder使っております。
unsigned char*とchar*のキャストは、(*型)だけでキャストできるのでしょうか?
出来ないキャストの場合は、エラーや警告などでますか?
以下のようにしてプログラミングしましたが、希望通りの出力でした。
ネットで危険なキャストがどうの、って良く見かけるんですが
よくわかりません。
”桁が大きくなると、小さい型にキャストするときは気をつける。”
これだけ注意すれば大丈夫でしょうか?

unsigned char* un_str="hoge";
char* str;
unsigned char* from_char_to_unsigned_char_str; //char*->unsigned char *の格納する変数

printf("un_str=%s\n",un_str); //unsigned char*は、char*みたいに出力できるか

str=(char*)un_str;
printf("str=%s\n",str);//(char*)だけで、キャストできるのか

from_char_to_unsigned_char_str=(unsigned char *)str;
printf("from_char_to_unsigned_char_str=%s\n",from_char_to_unsigned_char_str);//(unsigned char*)だけで、キャストできるのか

------出力-------------------------------
un_str=hoge
str=hoge
from_char_to_unsigned_char_str=hoge

352 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:03:04 ]
C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。

> printf("un_str=%s\n",un_str);
%s は const char* 型の引数を期待するから、
*((const char*)un_str)という変換が行われることになる。
un_strが指してるのは"hoge"、つまり const char[] だから、問題なく変換できる。
他も同じ。

353 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:26:55 ]
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
現実には大抵そうなっているけど、規格上はそんな規定なんてないはず。

354 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:28:46 ]
そうだっけ?
んじゃvoid*の扱いはどうなるんだ?

355 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:29:45 ]
同じでない場合は、void*が一番でかいポインタのサイズ
そして使うときはキャストされるので問題なし



356 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:32:17 ]
昔懐かしい、farポインタ、nearポインタ、とか?

357 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:40:29 ]
残念ながら void* も void(*)() を保持できる保証はない。

358 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:42:58 ]
375<< インラインアセンブリならできるかも・・・

359 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:45:19 ]
>>356
普通に char* と int* のサイズが違うようなアーキテクチャも存在した。

360 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 17:23:43 ]
>>352-359
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
いろいろと実験しながら、少しずつわかってきました。
丁寧に説明ありがとうございました。


361 名前:デフォルトの名無しさん [2007/03/09(金) 20:15:24 ]
WinSDKで、
モーダルダイアログボックスを使っているとき、
プロシージャに最後に呼ばれるメッセージは何ですか?
WM_CLOSEメッセージでDestroyWindow(hDlg)して、
WM_DESTROYメッセージが呼ばれた後に、WM_COMMANDがくるのですが…


362 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 20:55:26 ]
WM_DESTROYでウィンドウが消えた後は
たとえそのウィンドウ宛にメッセージが来ても
それは存在しないウィンドウハンドル宛だし
処理するところがないので無視することになるだけだと思うけど。

何か特殊なケース?

363 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:06:17 ]
>>362
WM_COMMANDがくること自体は問題ないのですが、
エディットコントロールにWM_COMMANDがきたときに使うメモリを解放するのに、
WM_DESTROYの後にエディットコントロールに対してWM_COMMANDがきてしまうと、
わざわざWM_DESTROY呼ばれる前後で、場合分けするのが無駄だと思えるので…

364 名前:デフォルトの名無しさん [2007/03/09(金) 21:31:38 ]
VC++6 で CString 使ってるんだけど、
CString な変数に ANSI コードページでもユニコードでもない文字列つっこんで処理したいんですわ。
具体的には、GetLenth とか Replace したい(ANSI コードページでもまともに処理してなさそうだけど)
楽に処理するにはどうしたらいいでしょう?CString 捨てな方法でもいいです。

365 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:56:12 ]
vector<BYTE>でよくね?



366 名前:364 [2007/03/09(金) 22:07:24 ]
>>365
俺に言ってる?
CString はたとえばコードページ 932 の場合、
Replace で 1 バイト文字を置換対象にするときに、2 バイト文字の下位バイトが置換対象とバイト的には等しくても、置換しないようにするよね?
そういうのをすべてのコードページでやりたいの。
ではよろしくお願いします。

367 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:08:23 ]
>>364
っ nkf

368 名前:364 [2007/03/09(金) 22:33:56 ]
>>367
nkf のライブラリにコードページを指定出来るようなメソッドを追加したクラスが実装されているということでしょうか?
単なる変換ができるというだけなら却下ですな。
(nkf 使わなくても文字コードの変換はできるし、変換することによってコードをマッピングできなくなる場合とか考えたくない。
ユニコード系のコードに変換すればマップだけはできるんだろうけど。
それといちいち文字コード変換するとよさげなソースコードにならなさそうなんだ。
そもそも nkf って日本語しか対応してないだろ?
個人的には今回の場合 UTF-8,CP51932,CP932 を使えれば問題ないと思ってるんだけど、他の奴が許さないんだぁ。)
注文多すぎてむかつくかもしれないけど、どうかどうかよろしくお願いします。
ぶっちゃけ CString::SetCodepage() とかいうメソッドが実装されていて、あとはよきにはからってくれる実装がほしい。

369 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:44:11 ]
>>368
一々文字コード変換をしたほうがデバッグが楽だと思う

UTF-8 -> Unicode 変換

Unicode で何か処理

Unicode -> UTF-8 変換

よさげなソースコードにならなさそうって言われればそれまでだけど…

370 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:50:22 ]
CStringに自分が今どのコードページのデータを持っているとか
それにあわせてReplaceの動作が変わるなんて出来ないんじゃないのって思うから
vector<BYTE>でよくね?

371 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:53:13 ]
>>364
つ MLang

372 名前:364 [2007/03/09(金) 23:14:46 ]
>>369
やりたいことの一つに、「ANSI CP 以外の文字列読み込み->文字置換->そのまま書き込み」ってのがあるんだけど、
ユニコードにいちいち変換してたら絶対にスマートでないよね。
あと、調べたところまずなさそうなんだけど、変換->逆変換で違うコードにマッピングされると困る。
>>370
コードページ指定して UNICODE には変換できるんだから、出来ないはずはないとおもうんだけどなぁ。
クラスに変数 1 つだけ入れておけば使用側がセットして良きにはからうことはできるはず。デフォルトは CP_ACP で。
なんで実装されてないのか理解できないほどだ。
vc8 だと reentrant locale が一部実装されていて、1文字送りは簡単にできそうになってるなぁ。VC6 でつくらないといけないんだけど。。。
>>371
ちょっと調べてみます。ざっとみた感じでは変換しかしてくれなさそうだけど。
あと、これつかわないと CP51932 つかえなさそうですね。
MultibyteToWidechar とかに 51932 とかつっこめば変換だけは出来るとおもってたけど。

373 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:17:13 ]
鬼車がCSIじゃなかったっけ。Cだけど。

374 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:30:14 ]
>>372
> ユニコードにいちいち変換してたら絶対にスマートでないよね。
コードページごとに処理を特殊化させるほうがよほどスマートじゃないと思うがね。

375 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:36:58 ]
というか、そういう、1つの言語に対応するエンコーディングが氾濫していて
UNICODEの変換・復元がもったいない、なんていうことを言うのは
日本人だけなのではないか?(w



376 名前:デフォルトの名無しさん [2007/03/09(金) 23:38:03 ]
ソケットについて質問です。

クライアントからホストを

char* szHost = "www.google.co.jp"
gethostbyname( szHost );

の様に指定してHTMLをサーバから取得できる事は判ったのですが、例えば、

取得したいHTMLが、

www.google.co.jp/search?hl=ja&q=c言語&btnG=Google+検索&lr=

の様にクエリも含む場合はどうすれば良いのでしょうか。
よろしくお願いします。(板違いなら誘導お願いします。)

377 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:40:20 ]
URLエンコードしてそのままGETにぶち込めばいいだろ?
CESも場合によっては変換する必要があるけど。

378 名前:デフォルトの名無しさん [2007/03/09(金) 23:47:15 ]
返信ありがとうございます。
暮れ暮れ君で申し訳ないですが、URLのエンコードってどうやるんでしょうか。

379 名前:364 mailto:sage [2007/03/09(金) 23:52:19 ]
>>373
単純な置換にはかなり大げさなライブラリですな。いざとなったらこれで Replace をオーバーライドするか。
どうもありがとうございます。
もっと単純にできる方法も引き続き募集いたします。
>>374
個人的にはコードページが違うんだから、特殊になるのは当然だとおもうけど。
ユニコードが*本当に万能*なら汎用的に処理できるんでしょうけど。ま、CSI 論争はやめておきましょうか。
>>375
ま、大きな声でいってるのは日本人だけでしょうな。
でも、XFree86 で utf8 関数が投入されたときは一部の外国人もぶーたれてたな。
CSI かどうかはおいといて、reentrant locale がほしい人は外国でも結構いるみたい。

380 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:55:41 ]
なんかこの人気持ち悪い…

381 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:58:26 ]
>>380
おまえもな

382 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:17 ]
俺も俺も

383 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:45 ]
std::basic_string<char, euc_jp_traits<char> >みたいな?
traitsを自作するとかさ。

384 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:05:36 ]
>378
「URLのエンコード」程度なら、検索するべきですわん。
簡単に見つかるから。正確な事もわかるし。

ラフに解説すると、URLとして使ってよい文字ってのは
あらかじめ決まってるから(←ってのは知ってたと思うけど)
使えない文字は %xx みたいな形式に置き換える事。

385 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:42:35 ]
>>379
変換コストがもったいないと思っているのなら
大抵のCSI対応クラスは内部で統一コードに変換してるから意味ないぞ



386 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:46:18 ]
>>385
CSIの意味わかってる???

387 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:13:10 ]
キーが倒されている場合は歩くのモーションを、倒されていない場合はウェイトのモーションを再生したいのですが、

whileの中で、

if(キーが倒されている)
アニメーションAを再生
アニメーションBを停止

else if(キーが倒されている)
アニメーションAを停止
アニメーションBを再生

と書くと、()内が真or偽が判定されるたびに、アニメーションが最初から再生されて、0フレーム目しか再生されません。
最初に書いたようなことをするには、どういう風にプログラムを書けば良いでしょうか?
できればヒントでよろしくお願いします。

388 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:19:58 ]
再生時に開始フレーム指定してそっからはじめればいいだけじゃん

389 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:35:22 ]
どっちみちキーが倒されている気がするのは気の所為か?
キーも大変だな、一々倒されて。

390 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:36:17 ]
>>380
ヘンなとこで敬語使ってるからじゃね。

391 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:00:27 ]
整数の加算結果がオーバーフローしたかどうかを調べるにはどうすればいいですか?

392 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:03:47 ]
加算前より減ってたらオーバーフロー

393 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:30:54 ]
>>391
鼻から悪魔がでたらオーバーフローしていると判断してよろしい。
処理系によっては、オーバーフローした場合を判断する方法があるかもしれない。

394 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 10:26:51 ]
 すいません、初歩的な質問なんですが、どなたかご意見いただければうれしく思います。
 クラスBの中でクラスAのオブジェクトの配列を管理したい。
 でもクラスAは、A2やA3などにも派生させてて、それも配列に入れたい、って場合。

class A {
...
};
class A2 : public A{
...
}
class A3 : public A{
...
}
class B {
vector<A> a1_vector;
}

 ってしたいんだが、これだとa1_vectorにはA2,A3が入らないですよね?
 ってなると・・

class B {
vector<A*> a1_vector;
}

 で、new A, new A2とかでオブジェクト作って、そのポインタをa1_vectorにpushすることになると思うんですが、これだとクラスBのインスタンスが破棄されたときに、a1_vectorで管理されている各オブジェクトって廃棄されないですよね?
 で、google先生とかに聞くと、share_ptr使う人がいるみたいなんですが、それで問題ないですかね?
 なんか注意点とかありますか?もしくは他にいい方法ありますでしょうか?


395 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:11:03 ]
問題ないよ、A のデストラクタを仮想関数にするの忘れないようにね




396 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:19:43 ]
設計を見直せ。

397 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:28:53 ]
>>394
boost::shared_ptrでおk
std:auto_ptrはコピーが破壊的でコンテナにいれらんないから駄目

敢えて他の方法を挙げるとすれば、Boehm GCを使うとか?

398 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:34:10 ]
GC使うと、メモリ解放はいいけど、デストラクタ呼びだしタイミングが
予測不能にならない?

399 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:35:30 ]
>>394ではないが。
>>396
参考までに聞きたいが、どう設計を見直すんだ?

C++でポリモーフィズムを実現したいなら、参照を経由するしかないし
派生クラスを基底型の配列やvectorに突っ込もうとすると
スライシングが発生するから、>>394の言っていることはごく当然の話では?

C++でポリモーフィズムを使うなと言ってる?

400 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:39:21 ]
>>398
勿論その辺は他のGC言語となんも変わらない。

401 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 12:31:45 ]
Boost使うならポインタに特化したboost::ptr_vectorなんてものもある。

402 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 13:11:10 ]
>>399
>396ではないが、「他にいい方法」を模索するなら実装方法を検討する前に設計を見直せということでしょ。
>394ではないから、そのクラス構成が最適解なのかは判らないのだから。

403 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:19:41 ]
>>402
それは深読みじゃねえの?
>>394はC++でポリモーフィズムをやりたいときのスマートな方法を問うている
だけに見えるけど。

404 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:36:21 ]
>>402
最適解なのか「判らない」んなら、少なくとも「設計見直せ」は言いすぎだろうな。
「その設計では駄目だ」と断定してるのと同じだ。

405 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:08:24 ]
394です。
みなさん、いろいろありがとうございます。
おおむねsharedでよさげな感じですね。

ただ、396さんの「設計みなおせ」も気にはなるところです。
やっぱり、こういう書き方になる設計って良くないんですかね?
他の人のソース見ても、こういう書き方してるの、あまり見たことないし。




406 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:28:51 ]
他所に見せるソースはサンプルが多いから
サンプルにboost使う状況を避けた設計してるとかじゃないかなぁ(適当

sharedなら割と直感的になるので悪くないと思うし、
EffectiveSTLの7項にもマンドクセってなったらsharedを検討してみては? ってある

407 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:26:35 ]
boostのsharedは物凄く遅いらしいから場合によっては別案を考えた方がいいと思う

408 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:50:44 ]
「物凄く遅い」と言うには、どの程度遅いのかデータが欲しいところだね。

409 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:53:03 ]
ttp://www.boost.org/libs/smart_ptr/smarttests.htm

410 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:01:33 ]
価値観によるところは大きいだろうけど、これが「物凄く遅い」なら
iostreamやソートは「筆舌に尽くしがたいくらい遅い」んだろうね。

411 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:45:37 ]
>>392, 393
鼻から悪魔ですか・・・
まあ、Intel系ならちゃんとオーバーフローしてくれますよね^^

どうもありがとうございました。

412 名前:デフォルトの名無しさん [2007/03/10(土) 22:49:42 ]
C++で、Cのstrtok()のような関数はありませんか。

別にstrtok()でも目的は果たせるんですが、
元の文字列を破壊したり、同時に2ヶ所以上で呼びづらかったりと
あまり美しいとは言えないような気がして。


413 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 22:59:03 ]
無いと思う
けどそれくらい自分で作ればいいんじゃ?
std::stringとか、目的の機能を実装するのに使えそうなモノはあるし

414 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:01:17 ]
>>412
istringstreamからデリミタを指定してgetline()


415 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:11:45 ]
istream_iteratorでfor_eachがC++流



416 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:14:21 ]
高機能さを求めるならboost::tokenizerだと思う。

417 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:17:43 ]
>>415
ただのistream_iteratorだとtokenじゃなくてcharが返らんか?

418 名前:417 mailto:sage [2007/03/10(土) 23:24:39 ]
ごめん。超アホなこと書いた。
でも、これってデリミタ指定できるか?

419 名前:412 mailto:sage [2007/03/11(日) 00:10:10 ]
レス感謝。
いただいたヒントを元に、更に調べてみようと思います。

それにしても、strtok()ってクセ強いですよねぇ……。



420 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:23:25 ]
>>412
ちゃんとしたベンダーならマルチスレッドな環境で同時に使っても
問題が起きないことを保証してくれてるもんだぞ>strtok()
まぁ、同じスレッドから複数の処理をやっちゃうと確実にアウトだけど。

421 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:30:41 ]
boost::tokenizerでは、デリミタを残す/捨てる、空トークンを残す/捨てる
を選べるのが良いな。

strtok()には色々問題があるが、デリミタも空トークンも捨てる仕様なので、
これでは困ることもある。
シェルのような感じで空白文字を区切りに使うときはこれでよいのだが。

環境によってはBSD由来のstrsep()という関数が使える場合もある。
こっちは予めリエントラントで、デリミタを捨てて空トークンを残す仕様だ。
ただし、コピーを避けるために元のバッファに破壊的に動作するのは同じ。

Cなら単にsscanf()を使うのも悪くない選択肢。

422 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:32:24 ]
>>420
MSVC++の場合はhidden dataをTLSに隠す仕様だから問題ない。
が、リエントラント版strtok()はstrtok_r()のような別名で提供している
実装も多いよ。
こういうことがあるから、移植性を考えてもstrtok()の使用は
好ましいとは言えない。

423 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 01:58:54 ]
質問です。

/* test.c */
#include <stdio.h>
#include <math.h>

int main(void) {
double i = 2;
double foo;

printf("%d\n", (int)pow(10, 2)); /* 結果 100 */
printf("%d\n", (int)pow(10, i)); /* 結果 99 */
printf("%f\n", pow(10, i)); /* 結果 100.000000 */
foo = pow(10, i);
printf("%d\n", (int)foo); /* 結果 100 */

return 0;
}

このソースをMinGW32-gccでコンパイル・実行すると、結果がコメントのようになります。
(bccだと、100、100、100.000000、100 になるのですが。)
これはコンパイラの仕様なのか、それともバグなのか、どちらでしょうか?


424 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 03:01:43 ]
int main(void) {
double i = 2;
double foo;
foo = pow(10, i) - 100.0;
printf("%e\n", foo);
foo = pow(10, i);
printf("%e\n", foo);
}

多分情報落ちしてるだけだと思う。

425 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:03:40 ]
基底クラスの代入演算子をオーバーロードしてメンバをコピーするようにしたのですが
派生クラスでも同様に代入演算子をオーバーロードした時に基底クラスのメンバをコピーするためには
派生クラスのオーバーロード内に基底クラスのメンバをコピーするような処理を自前で用意しないといけないのでしょうか?





426 名前:425 [2007/03/11(日) 13:12:55 ]
というのも、基底クラスと派生クラスでコピーコンストラクタを用意していると
派生クラスのコピーコンストラクタで自動的に基底クラスのコピーコンストラクタが
呼ばれているように見えましたので。。。

427 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 13:17:40 ]
こんな感じで基底クラスのoperaotr =を呼べばいい。
class Base
{
public:
  Base& operator =(const Base&);
};

class Derived : public Base
{
public:
  Derived& operator =(const Derived&);
};

Derived& Derived::operator =(cosnt Derived& d)
{
  Base::operator =(d);
  //以下Drived分のコピー処理
}

428 名前:425 [2007/03/11(日) 13:46:43 ]
>>427

なるほど。基底クラスを指定して呼び出せばよかったのですね。
基本的なことだったのかもしれませんがとても勉強になりました。



429 名前:デフォルトの名無しさん [2007/03/11(日) 15:08:05 ]
質問があります。

class Hoge { … }

vector<Hoge> HogeArray;

文法としてこんなことできますか?

430 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 15:13:14 ]
できるよ

431 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 15:43:21 ]
出来ないな。セミコロンがない。

432 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:39:16 ]
絶対言うやつがいると思った

433 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:47:46 ]
揚げ足取りのレベルで頭の程度が知れるのをまったく怖れないのは
ある意味度胸かも

434 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:58:21 ]
しかし、>>431的な言い方は問題あるにしても、
言ってあげるべきモノではあると思う。
慣れないうちはつけ忘れ多いだろうし。

435 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 16:59:37 ]
まあ文法ならtemplateがらみでもない限りコンパイル一発で間違いはすぐわかるんだけどな



436 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:25:54 ]
それでも文法の間違いがわからない人が来るスレだと思ってた

437 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:38:43 ]
>>435
ヒント:ココは初心者スレ

438 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:43:57 ]
ソースとエラー/警告を載せれば
もれなく>>435が全て解決してくれるスレになりました。

439 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 17:47:23 ]
>ソースとエラー/警告を載せれば
初心者はどれを載せたらいいのかもわからんし難しいなw

440 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 19:00:00 ]
いやでも「コンパイルエラーの解決」なんて話題は、
基本的には、初心者どころか入門者(入門書を読み始めたばかり)というレベルだけだろ。
それを解決するもの簡単だし。
もちろん、規格の細部や処理系異存かなんて話はあるけどさ。

本当に時間がかかる「バグ」というのは
「コンパイルは通るけど意図通りに動きません」なんだから。
もちろん、極稀なコンパイラのバグにぶつからない限り
「ソースの通りに動いている」わけだけど。

441 名前:429 mailto:sage [2007/03/12(月) 00:31:30 ]
すいません。

431さんの言うとうりセミコロンの付け忘れでした。

442 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:44:48 ]
>>431のエスパー能力に敬意を表する!

443 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 01:54:30 ]
これはもうメイクミラクルやね

444 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 06:03:42 ]
いや>>441は偽物だ。

三点リーダを>>429のように使えるはずないもん!

445 名前:デフォルトの名無しさん [2007/03/12(月) 11:07:51 ]
newとdeleteを頻繁に使うのはよくないですか?



446 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 11:09:38 ]
newは別にいいけど、deleteは例外安全や面倒くささを考慮して、
std::auto_ptrなど何らかのスマートポインタに入れておくべき。

447 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 16:47:03 ]
pを辿って99から1までを表示するプログラムです。

実行すると途中のcount=35あたりまで表示されてエラーが起こります。
メッセージ:「ハンドルされていない例外は TEST.exe にあります:0xC0000005: Access Violation。」

これは何故起こるのでしょうか。解決法もできれば教えてください。お願いします。
struct Test
{ int x;
 Test *p;
};
int main()
{ int i;
 std::vector<Test> v; //xに1〜99を順に入れていく。pには一つ前のポインタを入れる
 Test b;

 b.p = NULL;
 v.push_back(b);

 for (i=1;i<100;i++) { //
 b.x = i;
 b.p = &v[i-1];  //
 v.push_back(b);
 }

 Test *c;
 c = &v[v.size()-1];

 int count = 0;
 while ( c->p != NULL )  {      // NULLが出るまでpを辿る
  printf("%d: %d\n",count++,c->x);
  c = c->p;
 }                                                 長くなってすいません。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<200KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef