1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ class C++相談室lt;part56gt; pc11.2ch.net/test/read.cgi/tech/1170343752/l50
324 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 03:29:48 ] だからModern C++ Design読めって。そもそもmallocなんか使わないよ。 ローカル関数内のstaticオブジェクトを使うのが簡単じゃない?
325 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 04:20:38 ] 「リソースは解放する」「順序は守る」「両方」やらなくちゃならないのがのC++のつらいところだな。
326 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 05:39:13 ] シングルトンの解放に関する話は結構ややこしいからな。 Modern C++ Design 読め、で済ますしかない。
327 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 07:29:15 ] 機械翻訳のような妙な日本語。
328 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 08:00:51 ] >>323 C++でmalloc()使う方がどうかしている。
329 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 08:43:20 ] >>324 >>328 有名な「malloc/free論争」と同じ 不毛な議論だということを述べているのだと思うが
330 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 08:46:56 ] 不毛も何も、C++ならnew/deleteがあるのだからmalloc()なんて使わないだろって話だが。 そんなに毛が欲しければCを使っていればいいだけのことだ。
331 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 09:25:19 ] 論点はmallocかnewか、ではなく newしたものは必ずdeleteする必要があるか、という点なのだけど。 「mallocではなくnew」などというのは、本質を外れた揚げ足取りに過ぎないと 気が付いているんだろうけど、引っ込みがつかないんだろうね。
332 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 09:33:22 ] 相手が呆れて去っていきさえすれば勝ちだから、そりゃあ頑張るさ。 「勝者とは強い者のことを言うのではない、戦場に最後まで立っていた者のことを言う」 と、妖魔司教ザボエラ様も仰ってる。
333 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 09:48:46 ] deleteするか否かは時と場合による。
334 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:04:49 ] placement new なら delete しない代わりにデストラクタ呼ぶ、という話か?
335 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:34:09 ] 時と場合で移り気なの
336 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:34:36 ] スマートポインタ使えよ RAIIの原則に従っておけば何も考えなくていいんだから
337 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 10:41:01 ] newしたらdeleteするのは当たり前だが、mallocしたものはfreeしないと言うこともあるかも知らん。
338 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 11:10:57 ] あーあ、mallocやっちゃった。スレタイ読めない馬鹿発見。
339 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 11:13:18 ] というのは、レスが読めてない馬鹿の言うことなんだけどね、この場合。
340 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 11:20:33 ] delete はデストラクタ呼ぶから、free とは問題が別だよという話だろう。
341 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:09:46 ] newしたメモリは確実に解放しますか? 私は、解放します。 プログラムの終了まで存在するものとしても解放するべきだと思っています。
342 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:15:10 ] あーあ、newやっちゃった。スレタイ読めない馬鹿発見。
343 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:31:17 ] ティンコティンコティンコ
344 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:38:33 ] デストラクタでOSが自動でやる以上に何か意味のある仕事をするんなら 勿論deleteすべきだろうな
345 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:48:37 ] RAIIとかリソース所有の概念を知らないやつが混ってるな。 C++必須の概念のはずなのに、知らないやつってホント多いよな。
346 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:52:51 ] >>345 決め付けは良くないですyo
347 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:53:03 ] 解放しないとデバッガがメモリリークを報告しまくってうっとうしい
348 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 12:53:52 ] >>347 それはデバッガがクソ
349 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:01:34 ] いずれにせよnewしたメモリは全部スマートポインタに突っ込むのが常識だろ。 今時手動deleteとかありえねえ
350 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:04:15 ] 今時ガベコレも無い言語なんて時代遅れもはなはだしい
351 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:25:50 ] ライブラリでいくらでも実装できるLispとC++は最高、ということですね?
352 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:40:39 ] スマートポインタが万能だとでも思ってるんだろうか
353 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:42:58 ] RAIIあれば大抵は処理できるよ。 >350 ガベコレも結局無限リソース(メモリ)しか上手く処理できないしな……
354 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 13:44:47 ] 循環参照があっただけでおしまいじゃん
355 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:01:29 ] シングルトンどうしが循環参照してても解放すべきです。 私はそう考えます。
356 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:29:38 ] おまえいいこと言うな
357 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:48:33 ] >354 ちゃんとリソース所有権を考えれば循環参照はめったにおこらない。 まあ、考えるのが面倒だからガベコレに頼りたくなるんだけどね。 >355 どういう状況だよ。シングルトンわかってないだろ。
358 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:49:34 ] >>355 そんなシングルトンが存在すること自体、設計が変だと思わないか
359 名前:デフォルトの名無しさん [2007/08/15(水) 14:51:45 ] 寝具るddd
360 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 14:57:57 ] >>357-358 可哀相なくらい行間が読めないコンビだな。
361 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 15:35:05 ] 読む気ねぇ。ここはマ板じゃねぇし。なんで技術的な部分以外を気にしなきゃいかんのかね? いい加減夏厨相手にするのも飽きたなぁ
362 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 15:51:47 ] 馬鹿を晒すぐらいなら書かなきゃいいのに
363 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 15:54:14 ] 行間なんてものは要するに書き漏らしただけ ちゃんと伝えたきゃ書け
364 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 15:56:26 ] 行間っつーか、ギャグだろ。
365 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 06:38:10 ] >>361 日本語でコミュニケーションする能力が 技術的な部分と両輪で機能してない間抜けなぞ問題外。
366 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 14:56:08 ] (゚ー゚*)ダッコ♪
367 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 15:29:53 ] reddit 経由「透過的プログラマ指向ガベコレ for C++」 ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2310.pdf Boehm らによる言語機能としてのガベコレ提案。ちょっと期待。
368 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:15:46 ] class SUBCLASS { public: LPSTR& operator[](LPCSTR); }; class SUPERCLASS{ public: SUBCLASS *subclass; }; SUPERCLASS aaa; int main() { aaa.subclass = new SUBCLASS(hogehoge); return aaa.subclass["bbb"]; } わけあってmapが使えないので上のようにしているのですが 「error C2107: ポインタでない式に、添字が使われました。」 というエラーが出てしまいます どのようにすれば解決できますでしょうか? 開発環境はVS2005です よろしくお願いします
369 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:30:39 ] あんまり真面目に読んでないけど、とりあえずこうじゃね? return (*aaa.subclass)["bbb"];
370 名前:368 mailto:sage [2007/08/16(木) 18:44:26 ] >>369 どうもー やってみましたがだめでした
371 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 18:53:11 ] >>370 エラーメッセージが変わっただろ。ちゃんとその辺を書けよ。 で、戻り値の型がLPSTRなんだから、らreturn文で呼ばずに単独で呼んでみな。
372 名前:368 mailto:sage [2007/08/16(木) 19:00:40 ] >>371 うーんエラーメッセージは変化なしです
373 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:06:17 ] aaa.subclass->operator[]("bbb")
374 名前:368 mailto:sage [2007/08/16(木) 19:08:45 ] >>373 コンパイル通りました ありがとうございました
375 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:11:26 ] 意味があるかは知らんが、(*aaa.subclass)["bbb"] でコンパイルは通るぞ。
376 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:11:34 ] >>373 俺もそうだと思ったけど、関数形式で呼ぶのがなんか嫌だから書かなかった なんか解決策ないかね
377 名前:371 mailto:sage [2007/08/16(木) 19:13:21 ] >>372 そうか? 前者は引き数が合わなくて関数が見つからないが、後者は戻り値の型が合わなくてエラーになると思うのだが。 つーか、なんでまたmain()のreturnなんかで試すんだ? >371の後半は読んでないのか?
378 名前:376 mailto:sage [2007/08/16(木) 19:13:31 ] ああそうか、違和感の理由が分かった。 連想配列にしたくて添え字をオーバーロードしているはずなのに opreator[]で呼んだら意味を成さなくなっちゃうからだ。
379 名前:376 mailto:sage [2007/08/16(木) 19:15:59 ] つうことで解決案 subclassをカプセル化して、参照越しにoperator[]を呼ぶ
380 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:23:44 ] (*aaa.subclass)["bbb"] でコンパイル通らず、 aaa.subclass->operator[]("bbb") でコンパイル通るってあり得ないと思うんだが。
381 名前:368 mailto:sage [2007/08/16(木) 19:28:22 ] >>375 あわわ間違って(*aaa.subclass["bbb"])としちゃってたようです >>377 エラー部分だけ抜き出そうとして型違いのreturnになってました、ごめんなさい… >>379 単語の意味がわかってないので検索してやってみます、ありがとうございました
382 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 19:35:38 ] でもなんでchar *じゃなくて、char * &なんだろう。 constでないということは、こういうことがやりたいんだろうか。 (*aaa.subclass)[''bbb"] = new char[10] ; いや、ひょっとしたらこういうことがしたいのか char * & ptr = (*aaa.subclass)[''bbb"] ; ptr = static_cast<char *>( realloc(ptr) ) ;
383 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 20:59:50 ] class Base { public: Base(int n) {} }; class Derived : Base { public: Derived(int n) {} }; これがどうしてダメで、Base::Base()が必要なのか教えてください。
384 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:06:38 ] 親クラスに n を渡すなら、それをちゃんと書かなきゃいけない。 public: Derived(int n) :Base(n) {}
385 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:06:53 ] はい?
386 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:07:27 ] >>383 その例のDerived のコンストラクタは結局 Derived(int n) : Base() {} の省略形だから
387 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 21:21:45 ] そのnは親に渡さずに別に使うnかもしれないし。
388 名前:デフォルトの名無しさん [2007/08/16(木) 23:12:17 ] >>383 Derived クラスのインスタンスを生成するときに Base クラスのコンストラクタを呼び出すからなんだと思います。 コンストラクタを定義していないときはデフォルトコンストラクタが呼び出されるけど 定義してると定義されたものを呼び出すから この場合は引数のいらないコンストラクタを定義するか Derived クラスのコンストラクタで Derived(int n) : base(100) {} みたいに Base(int n) を呼び出して 引数を渡さないとだめだと思うんです。 初心者なんで間違ってるかもしれません。 っていうか STL 難しすぎでうっ!
389 名前:デフォルトの名無しさん mailto:sage [2007/08/16(木) 23:20:25 ] Baseのコンストラクタにデフォルト値を書いておくのもいいかも っていうか STL 関係ねー
390 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 00:01:01 ] >>388 >っていうか STL 難しすぎでうっ! でうっ?
391 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 00:20:57 ] 唐突にこれを思い出した ttp://www.karakuri-box.com/~killer-q/file7/KITERETU0022.png
392 名前:デフォルトの名無しさん [2007/08/17(金) 00:41:05 ] すいません。釣りではありません。 C++ってどんな局面で使うんですか? WinアプリならC#使ったほうが圧倒的に楽
393 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:00:07 ] 脳みそ沸かしたいとき
394 名前:デフォルトの名無しさん [2007/08/17(金) 01:24:19 ] Cで先頭アドレスと要素数がわかってるのですが ForループじゃなくてC++のiteratorに変換してくれるtemplateとかないんですか? ない場合どのiterator継承すればいいんでしょうか
395 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:40:46 ] T*head; size_t element;が既知なんでそ? なら、&head[0]〜&head[element]がiteratorの要件を満たしてくれるでそ?
396 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 01:48:01 ] >>392 楽かどうかなら C# が楽だろうが、 C# は Windows にしか優しくないし、 速度も C++ に劣るし、 そういうのが必要な時には C++ が圧倒的有利。
397 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:19:58 ] 速度が必要になるようなミッションクリティカルな場面に出会ったことがない 最近は全部C#。
398 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:21:20 ] サーバーアプリだとC#?ハァ?
399 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 02:38:29 ] ?
400 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 03:59:53 ] つかここ#かんけーねーし
401 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 05:58:45 ] >>392 C#を実装するのに使います
402 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 12:37:18 ] >>401 が良い事言った
403 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 21:16:42 ] なぜ想像力がデスクトップとサーバー位にしか働かないんだ プログラムが必要な場面はいろいろあるぞ
404 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 21:39:47 ] class CFUNC a; の2次元配列を動的に確保する場面があって、 CFUNC ***pppa; として使いたいですが、 pppa = new CFUNC**[y_len]; でまずy要素を確保して pppa[0] = new CFUNC*[x_len]; 各y要素のx要素を確保して pppa[y][x] = new CFUNC(); で、各要素をインスタンス化して (*(pppa[y][x])).hoge(); みたいに使おうと思うのですが、このpppaを破棄する場合に deleteはどう書いたらいいのかわからなくなってしまいました。。。どなかたpppaをdeketeしてもらえませんか? ちなみによくしらないのですが、delete[]ってなんで配列の要素数がわかるんですか?
405 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 22:15:50 ] typedef CFUNC*** PPPCFUNC typedef CFUNC** PPCFUNC typedef CFUNC* PCFUNC と整理してやると PPPCFUNC pppa = new PPCFUNC[y_len] pppa[0] = new PCFUNC[x_len] pppa[y][x] = new CFUNC になるんで deleteとdelete[]で困る局面はなくなると思ってみたり 要素数は実装によるけどもコンパイル時には決められないからどっかで一元管理してんでないすか多分 俺はそうする
406 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 22:53:53 ] VC++では先頭の手前に要素数が格納されてた希ガス
407 名前:404 mailto:sage [2007/08/17(金) 22:59:04 ] なるほど、typedefを忘れてました。 ではこれで確保したpppaはdelete[] pppaで破棄できるんですねっ! 要素数は、 int pppa_len_y; int *pppa_len_x = new int[ pppa_len_y ]; でnew時に一緒に初期化しています。 もっと手軽な方法ありますか?
408 名前:404 mailto:sage [2007/08/17(金) 23:02:44 ] >406 それじゃぁmallocするときに、必要size+1とってfreeのときにそれ利用してるんですねぇ。 ってことは要素数を保持しなくても、ポインタの手前の要素数使えってこと? ちなみにc++の規定ですか?処理系依存ですか?
409 名前:デフォルトの名無しさん mailto:sage [2007/08/17(金) 23:17:52 ] 処理系依存。
410 名前:404 mailto:sage [2007/08/18(土) 00:17:58 ] >>405 PPPCFUNC pppa = new PPCFUNC[y_len]; でnewしようとすると、PPFUNC*からPPPFUNCに変換できません と怒られてしまいました。 PPPCFUNC pppa = (PPPFUNC)( new PPCFUNC[y_len] ); でキャストして大丈夫なのでしょうか?
411 名前:404 mailto:sage [2007/08/18(土) 00:36:14 ] すいません、勘違いです。typedefミスってました。OTL
412 名前:383 mailto:sage [2007/08/18(土) 11:08:57 ] >>384-389 ありがとうございました。よくわかりました。 最近C++を勉強しているのですが、Java育ちのゆとり世代なものでスパルタさにガクブルものです。 class Foo { private: char* s_; public: Foo(char* str) : s_(new char[strlen(str)+1]) { strcpy(s_, str); } ~Foo() { delete[] s; } }; int main() { Foo a("foobar"); Foo b = a; } この程度で落ちるってのがすごすぎです(なぜ落ちるのかはちゃんとわかりますが・・・)。
413 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:24:18 ] >>412 生でnewを使うからそういう羽目になる。 std::stringを使うなり、std::vectorを使えばいい。 せめて、スマートポインタを使え。
414 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 11:34:02 ] コピーコンストラクタや代入演算子をちゃんと書かないから・・
415 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:19:01 ] C++を使う時は、リソースの所有権を常に意識する必要がありますな。 RAIIはちゃんと勉強しといたほうが良いよ
416 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:37:37 ] そうだな、コピーコンストラクタと代入演算子は常に書くべき。
417 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 12:40:35 ] Java→C++とか死亡ルートじゃね? Java→C→C++って回るべきだと思うんだが
418 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 13:32:09 ] GC付きC++って選択肢もあるんでないの(w
419 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 14:17:34 ] Javaなんか使うから頭が馬鹿になるんだよ。 GC付きの言語を使うと変な癖が付く。
420 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 15:08:22 ] 時代に逆行している人
421 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 16:59:23 ] >>417 自分はC#→C→Java→C++ってやってきたけどおk?
422 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:03:18 ] コンストラクタで例外を投げるクラスがあり、 そのクラスをstaticに使ってるんですが、 この場合、どのように例外をキャッチすればいいのでしょうか? class Throw{ public: Throw(){ throw 1; } }; class TestClass{ static Throw throw; }; こんな感じです。
423 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:12:19 ] >>422 コンストラクタの中でキャッチするか、プログラムが死ぬか。
424 名前:デフォルトの名無しさん mailto:sage [2007/08/18(土) 17:36:05 ] >422 staticをやめる