C++相談室 part135
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part134 http://mevius.5ch.net/test/read.cgi/tech/1516406742/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 http://mevius.5ch.net/test/read.cgi/tech/1509780815/ ■長いソースを貼るときはここへ。■ http://codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ http://www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>441 時間差だったかもしれんが>>440 の最初のパラグラフ参照 存在しない規格との互換性の問題を喚かないでいただきたい、というのはあるが 回避策も示しているのだからオール無問題 >>429 の例で 2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな 中身が全く同じであれば防ぎたいし 全く別の定義であればそれそれぞれをインクルードしたい >>442 #pragma onceの仕様はVisual C++しか実装してないと思ってる? >>443 >>444 >2重インクルードを防ぎたい場合とそれぞれ別にインクルードしたい場合があるってのは書かなくてもわかるよな ああ>>443 の脳内にはそういう要求もあるんですねわかります その場合は>>418 項番4でドゾー 藻前ら>>418 の単純さをバカにするが藻前らの論理展開のアレっぷりも相当なもんやぞ… いずれにしろ>>418 みたいなチープな仕様じゃ誰にも支持されない ツッコミ殺到でボコボコなのに勝利宣言してやがるな つっこんだ人たち(ここのほぼ全員)にバレバレなのに滑稽な >>418 ,421はミニマムの仕様を提示しただけで、つまり、 この仕様で問題ない場合は #pragma once で手抜きが出来て、 無理な場合は従来通りインクルードガード使えってことだろ。 俺はありだと思うぜ。仕様ってのはこういう割り切り方をしないと決まらない。 C++のラムダなんて後付で仕様を拡張して行っているし。(このやり方がいいとは思わないが) ただ、この仕様だと現行の #pragma once よりも割り切っているのがイマイチで、 「今」この仕様では却下されるだろう。 「#pragma once が全くない世界」なら、とりあえずここから出発するのもありだっただろう。 現行の #pragma once は常識的に考えて、 ・ファイル実体が同じ場合(ハードリンク/シンボリックリンク)は対応可能 ・コピーの場合(ローカルに xxx.h を tmp_xxx.h にしてデバッグ出力を改変したり)には対応不能 だろう。だから使用条件としては、 ・全ファイルがローカルファイルシステム上にあり、ヘッダファイルの改変は行わない であり、普通に個人レベルで開発する場合はこれで全く問題ないし、妥当だ。 会社で10-20人レベルで開発する場合、どのみちルールを子細に決めることになるし、 そういう場合は従来のインクルードガードでやれ、という割り切りも妥当だよ。 なお俺が推す仕様は、 ・#pragma once のファイル内では複数定義のエラーを無視する というものだ。従って、 ・現行の#pragma once とは違い、対象ファイルは必ず「ファイルとしては」「読み込まれる」 (これは現行のインクルードガードとも同じ) ・定義されている物のシグネチャが既に存在するものと全く同一だった場合、無視する。 ・シグネチャが異なっている場合、普通に読み込む(コンパイル対象とする) (勝手にデバッグ関数を追加されていた場合、その関数だけはコンパイルされる) ・#pragma once のファイルを全部パースし終わった際、「全部重複」「全部新規」ではなかった場合、警告を出す。 (正しく使えば「全部重複」「全部新規」のどちらかになる。 改変《追加》した場合は「一部新規」となり、警告にする。「一部欠落」は検知しない。) というものだ。 この場合、要するに「読み込んで同じだったら無視」なので、 #ifdef 内等、かなりアクロバティックに使われても、問題なく、使用者の直感通りに動作する。 改行の追加、コメント変更等は全く問題ない。 ただし常に全部のファイルを読み込み、初段階のパースは行うことになるので、 現行の #pragma once やインクルードガードよりは速度は劣る。 とはいえ、今更ここが問題になる時代ではないし、問題になるようならインクルードガードを使えと割り切る。 つまり、面倒なら #include を使わずに、全部 #pragma once にも出来る、というもので、 実際これで問題無いと思うんだがな。 もう書かなくて良いよ アホだってこはみんなわかったから インクルードのネストがn段 それぞれの段、m個のインクルードファイルからm個インクルードしてるとします 何パス必要でしょう >(ディレクトリパスは無視) 現行の#pragma onceでこんな実装になってる処理系あるかなぁ >>438 , >>446 > >>418 みたいなあまりにショボい仕様だと > 後々不満が出ることになる でも具体的には指摘できない ってか w static変数(クラスのインスタンス)がプログラム実行時にそのメンバ関数呼び出し時にその中で、 newをすると既存のヒープ領域を破壊することはありますか? どうもこのように解釈できる現象が起きているようなのですが、調べても分からずアドバイスを頂ければ幸いです。 環境はMacのHighSierra、コンパイラはbrewから持ってきたLLVMです。 >>460 99%以上の確率であなたのバグです。 1行目の意味はよく分かりませんが。 ああすまん、何となく1行目の意味は分かった。 ・クラスインスタンスをstatic変数に入れ、そのメソッドを呼んだ 事をそう表現したのかな? だったらはっきり言ってstatic云々関係ない。 GCなんて無いから「statc変数に入れたら忘れてGCされてしまう」みたいなことはそもそも無い。 ヒープを壊しているのはユーザーです。つーか、ランタイムもないし。 ガチでコンパイラのバグだと思っているのなら、 どのみち再現コード(その場合は20行程度か)を作るしかない。 その過程で君のバグだと気づけるだろうさ。 ただこのように「下から」デバッグをするのは時間がかかるから、俺は嫌いだけど、 君がそう思うのならやるしかない。 C/C++は広く長く使われて来ている言語だから、 現在もバリバリに使われているコンパイラなら、この辺の基本的な部分にバグは無いと思うよ。 static変数に確保するのはマイナーかもしれないが、滅多にやらないってほどではないし、 そもそも上記の通り、コンパイラにとって危険のある(バグに命中する可能性のある)使い方でもない。 ふつうに、 クラスのインスタンスがstatic宣言と読んだけだ static MyClass a; スコープローカルかファイルローカルかはわからん >>450 >>464 日本語でおk お前は半島に帰れ >>452 それでお前は何パスだと思うのさ? 予言してやる。お前は言えない。 なぜならお前は馬鹿であり、それがばれるのが怖いから。 ひとまず俺の一つ目の予言は的中だな。 次に行こう。 >>467 ID:aIENMcPWd お前の日本語の間違いをすべて訂正してみろ。 2つ目の予言をする。お前は言えない。 なぜならお前はゴキブリ韓国人であり、間違いを認識できていないから。 C++でプラットフォームに依存しない音楽再生ライブラリってある?特にlinuxで使いたいんだけど。 mpg123とかいうのもみてみたんだけどプログラムに組み込むやり方が分からない 質問ですが Q1. 浮動小数点型について表現しえる最小の値(負の値のうちの絶対値が最大のやつ)を取得する 環境非依存なやり方はどうすれば良いの? -std::numeric_limits<double>::max()とか -DBL_MAX でおk? Q2. テンプレートを型引数が整数型と浮動小数点型で分けたいんですが 同じ名前のテンプレート名のまま、テンプレートの特殊化的な簡単に済ませる方法は無い? >Q2 template <typename T, bool = std::is_floating_point<T>::value> struct hoge {}; template <typename T> struct hoge<T, true> {}; >>472 std::numeric_limits<double>::lowest() まりがとうございます >>473 >>475 すばらっし >>474 言葉足らずでスマンカッタorz 具体的型名で特殊化する普通の特殊化ではfloatとdoubleのそれぞれについて特殊化した定義を与えねばならないので >>473 みたいなやつを求めていたのです!ヽ(>∀<)ノ!!!111!1! たまにはlong doubleも思い出してあげてください Boost.Optionalを使う際に、 対象クラスが自分自身の有効無効を変更できるようにしようとしてみたところ、 宣言時に宣言対象を引数にとって初期化できることに気づきました。 変数の引数に変数自身を使うのは仕様的にありなのでしょうか? ttps://wandbox.org/permlink/YLKYol7KdEOhpyGU CObject obj; for(i=0; i<N; i++) { obj = new CObject(); ・・・(処理)・・・ } ↑みたいにdeleteせずにnew演算子でクラスオブジェクトを割り振り続けるプログラムってお行儀悪い? CObject obj; for(i=0; i<N; i++) { obj = new CObject(); ・・・(処理)・・・ delete(obj); } ↑こういうふうにすべき? 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b) 今時newなんかを自分で書いてることに疑問を持ったほうがいい 手っ取り早く動かしたいその場限りのコードならそういうことをやることもある くらいかな ポインタじゃないものにnewしたもの格納できるとでも思っているのかジャバグラマ上がりのトーシロー deleteしてからnewすることにします・・・ >>488 こうでしたorz CObject* obj; >>480 C++的には for(i=0; i<N; i++) { CObject obj; ・・・(処理)・・・ } でいいんじゃね 大規模なコードで大量にオブジェクト生成するならアリだと思うけど その場合もnewしたものをdeleteするための仕組みは必須だしね 追跡できなくなる、もしくは自分で自分を破棄する仕組みも無いようではダメ >>482 クラスのメンバ変数に他のクラスインスタンスを召喚するときとか コンストラクタでnewしてやらないといけないと思うの >>494 複数のプロジェクトで使いまわせる >>495 スマポ(かコンテナ)で大体のnewは回避できる そのケースも回避できる >>495 別にnewしなくてもよくね? なんかサンプル出してみ? new無くしてやっから >>497 class CTest { CFoo cfoo; void CTest() { cfoo = new CFoo(); } }; こんなんとかどうでしょう >>498 class CTest { CFoo cfoo; void CTest(): cfoo() { } }; メンバ初期化子知らんのか ちなみに非PODならメンバ初期化子に書かなくてもデフォルトコンストラクタで初期化子される >>499 そ、そうやって初期化したcfooはdeleteしなくてもいいんでつか? >>504 変数の寿命を理解してないのか? C/C++で変数の寿命を理解せずコード書くとメモリリークだらけになるから止めるか横着せず勉強するかしてくれ >>504 何言ってんだお前は そもそもdelete出来んだろ 教えてください やりたい事は ↓ https://stackoverflow.com/questions/14706954/how-to-override-the-text-displayed-for-a-property-in-the-propertygrid ここに出てるようなPropertyGridで、数値配列の値を16進で表示したい [0] 0x0001 [1] 0x0002 [2] 0x0003 .... 例えば↑とか、単にこれだけ そうとう調べまくったんだが、配列の例はみつけられなかった 配列でなければ、実装例は結構見つかるんだが・・・ 一見簡単そうなんだけど、俺のレベルでは不可能 >>507 それC++の質問なの? .NETのライブラリ(=>C++/CLI)じゃなくて? ごめん間違えた、ここ C++のスレだった 隣で聞きます。 >>505 >>506 >>512 み、みんな、親切にありがとう・・・ >>494 一度に作る分量が減るので間違えにくい 別々の人間が手分けして作れる >>503 そもそも>>498 はコンパイルエラー(もしくは警告)になるだろ... class CTest { CFoo* cfoo; CTest(int x){ cfoo = new CFoo(x); } ~CTest(){ delete cfoo; } void ReNew(int x){ delete cfoo; cfoo = new CFoo(x); } }; みたいな奴を想定してたのかも知らんけどこれでもunique_ptr使えば良いだけだしね どうせ>>498 の CFoo cfoo; はこれまた CFoo *cfoo; のつもりだったんだろう とりあえず>>499 の形にすればnewはなくせる ポインタを保持したい場合も生ポインタはやめたほうがいいね 可能な限りスマートポインタを使え、そしてスマートポインタで駄目な場合はほとんどないってのはその通りなんだけど、 初心者が生ポインタをちゃんと理解したことのないままスマートポインタを使いこなせるとも思えぬ。 そこらへんはちゃんと分けて、今回の場合はまずは生ポインタを理解するという方向性で説明する場面じゃろ。 もうスマポはスマポとして理解させたほうがいいような気がするけどな 下手な生ポの知識は初心者に有害だ ポインターをdeleteせずに扱う猛者がいると聞いて駆け付けてきた delete をしない戦略ってのは無くはないよ。 アプリケーションの起動時直後にガッと大量のメモリを必要として、 終了直前に全部解放するってパターンなら、 どうせプロセスの終了と一緒にリソースは回収されるのでわざわざメモリ解放の処理を入れる必要はない。 (C++ だとデストラクタは必ずしもメモリを解放するだけではないので注意が必要だが) だけどそういう戦略をとれるのはちゃんと理解した上で問題にならないことを確信できるだけの知識があってこそだわな。 というか、それ以上に、確保したのを解放しないのは「気持ち悪い」と感じる心が C/C++er にはある。 組み込みだとそもそも終了なんてものがなかったりする >>526 placement new の意味が今でもよくわかりません…どんなときに使うのかなあ… char buf[MAX_BUF]; new(buf) MY_STRUCT(1, 2, 3); char buf[sizeof(MY_STRUCT)]; new(buf) MY_STRUCT(1, 2, 3); >>527 VRAM みたいな特殊なメモリを C++ のオブジェクトに見せかけたい場合とか すでに確保したメモリーブロック上でコンストラクターを発動させる。 組み込みとかゲーム機のような、最初に一気に確保する環境で使うんじゃないかね といっても確保済みのメモリに対して断片化しないように管理する仕組み作ったら、必然的にnew演算子もオーバーロードするだろうから結局placement new使わんかもしれんけど クラスを丸ごとDLL化するときにはnew系をオーバーロード しておかないと解放時にエラーになるべ。 ヒープはDLL単位にあるので集めておきたい場合はplacement使う unique_ptrの配列版でメモリの再確保を行いたい場合どのように行うのがベターですか? >>534 unique_ptr::reset( ) じゃねーの? [][][] [[[ ] X_[[[ [] ][ [] ][][[[] ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる