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 なお俺が推す仕様は、
・#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_[[[ [] ][ [] ][][[[] 以下のように、派生クラスのメンバ関数で基底クラスのメンバ関数を呼ぶように
基底クラスが派生クラスに強制する方法はないでしょうか?
ttps://wandbox.org/permlink/K4IHMYwOsutPQz3i FAQやな
インターフェースとカスタマイズポイントを分けろ
struct base {
void f() { //非仮想
cout << "base" << endl;
this->f_custom();
}
private:
virtual void f_custom(){}
};
struct child : base {
void f_custom() override {
cout << "child" << endl;
}
}; レスありがとうございます。
NVIというのがあるのですね。
(大昔に勉強したような…しかし思い出せず) >>544
pure virtualなのに関数定義することなんてできたのか…
f()とbase::f()は同じ関数なんだよね? }]] [[《_["[[]]" 〈[]》》 [][][]0,1》》〈〉 [] } } "B,V,0%%%,*1BVLO,SASA1`}}//%\\0,1\"VL"\ ■ このスレッドは過去ログ倉庫に格納されています