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 たまには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"\ >>547
12行目のbase::f()はvirtualを抑止してpure virtualを呼び出す
13行目のf();は動的結合でchid::f()を呼び出す
baseは抽象クラスでnew base{}できないので
13行目の動的結合がbase::f()を呼び出すということは起こりえない
だからif(typeid(*this) != typeid(base))のようなチェックをしていない ちょっと根本的な質問を。
C#が既に普及しているなかあえてC++に固執する理由ってある? MSのOSしか使わないなんちゃてPGならC#で十分じゃないの mono/Xamarinはしんどいと言う事を知らない世界の内はいいんじゃない?
大体Win限定だとしても高速化するのにC++で書いたのをdllimportするだろう ざまりんが苦しい人は信仰が足りないのです
僕は信仰の自由を主張しますけどね >>551
余計な依存関係をかかえないのが嬉しいです Boostとか使ってると余計な依存関係をかかえてしまうけどな
C言語が一番 一番多くの環境で使えるのはC言語
RAMが数十バイトしかないような非常にチープな8bitマイコンでも使える 数十バイトだとスタック領域ももパンクしそう、厳しいのではないか? 知らないで盛ってると言うのはどうかと
昔6ピンpicでc使ってたけどRAMは16バイトだった気がする 調べたら勘違いで自分の持ってたのはSRAM64バイトのpicだった PIC12F609とかでもプログラム領域は1Kwあるけど
数十バイトしかない奴の型番教えてくれくれ PIC10F200はRAMが16バイトですね
制約は当然ありますがC言語で開発出来ます C++どころかCすらやってはいけないレベルだな
恥ずかしいやつ >>562
ROMとRAMの区別がつかない人がなんでこのスレにいるのか? ハーバードアーキテクチャのデータメモリサイズだけ書くの
卑怯だと思うの。プログラムメモリは256ワードあるじゃん >>557を受けての話だから
そのチープなマイコンで開発にCが使えてる >>551
競技プログラミングとかunity覚えるの面倒とか? >>566
RAMってしっかり書いてるじゃん
チープなマイコンだとROM/RAMに別れてるのが普通だよアーキテクチャー関係無しに スタックの話だよね
スタックはRAMであることが絶対条件なので
ROMがどんだけあろうが関係ない C# と C++ は世の中でどちらのほうが使われているのでしょうか?
いま、 C++ の本(ロベール)を読んでいますが、無駄ですか?
柴田望洋訳の分厚い本も買ってしまいました。 >>574
ありがとうございます。
結局、どのプログラミング言語を習得するのがおすすめでしょうか?
Python のような言語は除いて。 >>576
趣味でアルゴリズムとデータ構造を勉強しています。
プログラミングコンテストの問題(Aizu Online Judge)を解いたりもしています。
もし、プログラマーになるとした場合、もっとも必要とされる言語を使って、
アルゴリズムとデータ構造の勉強をすれば効率的かなと考えています。
セジウィックとウエインの本や講義動画を読んだり見たりするときには、
Javaの入門書を見たりしています。 ■ このスレッドは過去ログ倉庫に格納されています