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
304 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:22:55 ] >>303 おおー。それですね。完璧ですね。
305 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 12:31:03 ] 規格 8.5.14 内のここは? if the function is a constructor, the call initializes a temporary of the destination type. The result of the call (which is the temporary for the constructor case) is then used to direct-initialize, according to the rules above, the object that is the destination of the copy-initialization. In certain cases, an implementation is permitted to eliminate the copying inherent in this direct-initialization by constructing the intermediate result directly into the object being initialized;
306 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 13:07:44 ] >299 ええ? >297の通りじゃ……と思ってC++STDを確認しました。 8.5 Initializers (snip) initializer: = initializer-clause ( expression-list ) initializer-clause: assignment-expression { initializer-list ,opt } { } initializer-list: initializer-clause initializer-list , initializer-clause ということで、>297の通りじゃね?良くわからないけど。
307 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 13:12:39 ] >>306 「ということで」じゃねーよ。何を確認したんだよ。 = に続けて置かれた初期値の型が同じなら、動作上は direct-initialization と 同じに最適化されるが、意味上は依然として copy-initialization なので、 たとえばコピーコンストラクタが private になってたりすると >>297 の 1 は コンパイルエラーになる。
308 名前:306 mailto:sage [2007/08/13(月) 14:06:53 ] あれ?そうだっけ? ということでもうちょっと調べてみました。 過去ログにあった。 ir9.jp/prog/ayu/datlog/tech_cpp/1047560042/1047560042_03.html#R700 条件付きで同じになるっつうのが正解かしらん? copy-initializationとdirect-initializationについて纏まっている資料は無いのかね? More Exceptional C++に載っているみたいだけど……
309 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 14:56:26 ] ためになるなあ
310 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:11:10 ] おもしろいな、copy constructorへのaccess checkがかかるけど、 実際にはdirect-initializationが行われる(よばれる)のか class Nurupo { private: //public: Nurupo(const Nurupo&) { *(int*)0 = 0; } public: Nurupo(int nurupo1, int nurupo2, int nurupo3) { ; } }; void foo() { Nurupo nurupo = Nurupo(1,2,3); } private:だとコンパイルエラーになるが、 public:にして実行しても落ちるわけではない でさ、これもRVOって呼ぶの?returnしてないのに?
311 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:53:47 ] >>310 これは RVO とは呼ばない。
312 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 01:55:03 ] >>308 規格のドラフトでいいんじゃないの? >>2
313 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:39:08 ] JIS に行けばドラフトじゃなくてちゃんとしたのを一応読める。色々と不便ではあるけど。
314 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 02:45:47 ] 日本の未来に絶望する配布形式
315 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 08:29:54 ] 不要なものは使いにくくなっている C++的には正しい配布形式
316 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:19:47 ] const int i[10]; という配列をメンバーに持っていた場合、どうやって初期化すればよいのでしょうか?
317 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:21:52 ] >>316 できません。 const 外すか、パフォーマンスに問題なければ std::vector を使うか。
318 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:23:08 ] int i[10]; という配列をメンバーに持つクラス X を作って、 const X x; として、その x のコンストラクタで初期化する。
319 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 10:40:09 ] 残念ながらコンストラクタ内で代入することになるね。
320 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:11:20 ] ご意見伺いたいです。 C++にてシングルトンを実装するに当たって、インスタンスの解放を明示的に実装しますか? 私は、実装します。 プログラムの終了まで存在するものとしても解放するべきだと思っています。 実装しないという人の理由が、解放される順番が難しい、 というのですがそれは理由にはならないのではと。 解放しない派で、もっとこう積極的な理由があるなら教えてください。
321 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:19:43 ] 明示的な解放が必要ってことは static HogeClass *s = new HogeClass; return s; とかするのか?
322 名前:デフォルトの名無しさん mailto:sage [2007/08/14(火) 23:25:57 ] Modern C++ Design読め。 言語に頼れるのならば任せるのがベターだろうと思うよ。 それができない(例外的な)ケースのときだろうね。明示的に実装することを考えるのは
323 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 02:20:59 ] mallocしたメモリは確実に解放しますか? 私は、解放します。 プログラムの終了まで存在するものとしても解放するべきだと思っています。
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[]ってなんで配列の要素数がわかるんですか?