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
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; } 長くなってすいません。
448 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:02:59 ] push_backしていってvectorのサイズがでかくなったときにvector内部で再割り当てが起こってる。 なので&v[i-1]は途中から不正なポインタを指す。 なので本当は&v[i-1]が不変なのを期待しちゃダメ。 ↓こうやって最初に100確保しておけば再割り当てが起こらないだろうから大丈夫。 int main() { int i; std::vector<Test> v(100); Test b; b.p = NULL; v[0] = b; for (i=1;i<100;i++) { b.x = i; b.p = &v[i-1]; v[i] = b; } Test *c; c = &v[v.size()-1]; int count = 0; while ( c->p != NULL ) { printf("%d: %d\n",count++,c->x); c = c->p; } }
449 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:04:21 ] あ、でも同僚がこんなコード打ったら殴る
450 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 17:59:18 ] 宣言した後に余裕を持ってNULLの要素を追加してやらないと駄目なのか で、不足してきたらまた余裕を持ってNULLと末端の要素を 実際に割り当てた時は割り当てた所に書き込むのと同時に、末端となる位置も変えてやらにゃならん こんな事してたらvectorの意味無いじゃん
451 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:13:42 ] 空でないディレクトリをまるごと 削除する関数ってあるでしょうか。 C++Builderです。
452 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:18:30 ] C++Builderは知らんな。 Win32 APIにはSHFileOperationがあるが。
453 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:24:20 ] system("rmdir /S /Q C:\");
454 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:30:34 ] >>448 やはり場所が変わっていたのですか・・・ vectorを使うべきじゃなかったようですね ありがとうございました。
455 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:44:58 ] >>454 イレテータ使え
456 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:51:32 ] つーかlist<int>使え
457 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 18:54:06 ] >>452 SHFileOperationですか。 見てみたんですが、引数がたくさんあって難しそうですね。(汗 簡単な解説と使用例どこかにないか探して見ます。 >>453 おおお。今はこの方法で行きたいと思います。 ありがとうございました。
458 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:26:01 ] すいませんが初心者の質問です。 あるクラス内でnewしたメンバ変数への参照かポインタを返す場合、 クラスの外側からdeleteさせないようにするにはどうすればいいんでしょうか? constつければコンパイルエラーになるもんだと思ってたんですが、 試してみたらダメでした。 class moge;//詳細は略 class hoge{ moge* mp; public: //略 const moge * const getMp(){return mp;}; const moge& getMRef(){return *mp}; } void f(hoge& h){ const moge * const mp = h.getMp(); delete mp; //コンパイルエラーになってほしい } void g(hoge& h){ const int& i = h.getRef(); delete &i; //コンパイルエラーになってほしい }
459 名前:458 mailto:sage [2007/03/12(月) 19:29:44 ] すいません。g()がメチャクチャになってました。 void g(hoge& h){ const moge& m = h.getMRef(); delete &m;//コンパイルエラーになってほしい } が正しいですね。
460 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:32:01 ] デストラクタをprivateへ移行
461 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 19:36:53 ] >>455 std::vectorのイテレータは、 基のvectorの要素数が変わったら無効になってよいとなっているので、 何の解決にもならない。
462 名前:458 mailto:sage [2007/03/12(月) 20:02:43 ] >>460 即レスありがとうございます。 確かに質問内容の答えにはなってるんですが、ちょっと説明不足でした。 class hogeのメンバ関数内でmogeをnewしていて、hogeのデストラクタで deleteしたいんです。 mogeのデストラクタをprivateにするとhogeの破棄時にdeleteできずにメモリが リークしてしまうという問題が出てしまいますよね。
463 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:16:05 ] だったら、友達にでもしろよ。
464 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:21:16 ] 所有権が移動しないスマートポインタ使えば?
465 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:29:52 ] クラスを1階層増やせばいいんでないの。 class IMoge{ protected:~IMoge(){}}; class moge : public IMoge{public:~moge(){} }; class hoge{ moge *mp; public : IMoge &getmogeref(){ return *mp; } ~hoge(){delete mp;} };
466 名前:デフォルトの名無しさん mailto:sage [2007/03/12(月) 20:36:14 ] そうだ、外側からdeleteしない設計にすればいいんだ! うわ俺マジ頭良い^^
467 名前:458 mailto:sage [2007/03/12(月) 20:39:01 ] >>463-465 どうもありがとうございます。 たぶん友達にするのが一番個人的な要求に合っていると思います。 というか、こんな基本的なことも浮かばないあたり、ダメダメですね。
468 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 00:04:47 ] 時間の都合だと思うが、>466のスルーされっぷりに噴いた。 いや、たぶん突っ込まれてもそれはそれで困るんだろうけど。
469 名前:デフォルトの名無しさん mailto:sage [2007/03/13(火) 19:37:36 ] 以下のようなプログラムを実行すると error LNK2019: 未解決の外部シンボル "public: void __thiscall C01::TEST(void)"〜 とでます。 inlineをはずれば通るのですが、どうしてもinlineを付けたいです。 解決方法御願いします。 //00.cpp #include "01.h" void main() { C01 c; c.TEST(); } //01.h class C01 { public: void TEST(); }; //01.cpp inline void C01::TEST() { }