X



C++相談室 part135

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 5fcb-q1Nq)
垢版 |
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0
次スレを立てる時は本文の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
0478デフォルトの名無しさん (ワイモマー MMb3-XMtE)
垢版 |
2018/04/30(月) 23:11:41.90ID:xhvNrk1GM
Boost.Optionalを使う際に、
対象クラスが自分自身の有効無効を変更できるようにしようとしてみたところ、
宣言時に宣言対象を引数にとって初期化できることに気づきました。

変数の引数に変数自身を使うのは仕様的にありなのでしょうか?
ttps://wandbox.org/permlink/YLKYol7KdEOhpyGU
0480デフォルトの名無しさん (ワッチョイ 9368-c97c)
垢版 |
2018/05/01(火) 23:40:40.03ID:dOOCYV+Z0
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)
0493デフォルトの名無しさん (ワッチョイ 8133-M5g1)
垢版 |
2018/05/02(水) 10:02:54.88ID:EfCiDMro0
大規模なコードで大量にオブジェクト生成するならアリだと思うけど
その場合もnewしたものをdeleteするための仕組みは必須だしね
追跡できなくなる、もしくは自分で自分を破棄する仕組みも無いようではダメ
0497デフォルトの名無しさん
垢版 |
2018/05/02(水) 15:02:47.22
>>495
別にnewしなくてもよくね?
なんかサンプル出してみ?
new無くしてやっから
0503デフォルトの名無しさん
垢版 |
2018/05/02(水) 16:36:35.49
そもそも>>498の例なら初期化子自体いらんしw
0507デフォルトの名無しさん (ワッチョイ 318a-23pz)
垢版 |
2018/05/02(水) 17:35:57.58ID:EH+UkdGd0
教えてください

やりたい事は ↓
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
....
例えば↑とか、単にこれだけ

そうとう調べまくったんだが、配列の例はみつけられなかった
配列でなければ、実装例は結構見つかるんだが・・・

一見簡単そうなんだけど、俺のレベルでは不可能
0515デフォルトの名無しさん (ドコグロ MMa3-tYAq)
垢版 |
2018/05/02(水) 20:14:18.27ID:sTDjib3HM
>>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使えば良いだけだしね
0516デフォルトの名無しさん
垢版 |
2018/05/02(水) 23:29:42.51
どうせ>>498
CFoo cfoo;
はこれまた
CFoo *cfoo;
のつもりだったんだろう

とりあえず>>499の形にすればnewはなくせる
ポインタを保持したい場合も生ポインタはやめたほうがいいね
0517はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5b6f-luqG)
垢版 |
2018/05/02(水) 23:41:46.06ID:g0SlpjdS0
可能な限りスマートポインタを使え、そしてスマートポインタで駄目な場合はほとんどないってのはその通りなんだけど、
初心者が生ポインタをちゃんと理解したことのないままスマートポインタを使いこなせるとも思えぬ。
そこらへんはちゃんと分けて、今回の場合はまずは生ポインタを理解するという方向性で説明する場面じゃろ。
0522はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-XJxX)
垢版 |
2018/05/03(木) 02:41:54.13ID:HFudy7bE0
delete をしない戦略ってのは無くはないよ。

アプリケーションの起動時直後にガッと大量のメモリを必要として、
終了直前に全部解放するってパターンなら、
どうせプロセスの終了と一緒にリソースは回収されるのでわざわざメモリ解放の処理を入れる必要はない。
(C++ だとデストラクタは必ずしもメモリを解放するだけではないので注意が必要だが)
だけどそういう戦略をとれるのはちゃんと理解した上で問題にならないことを確信できるだけの知識があってこそだわな。

というか、それ以上に、確保したのを解放しないのは「気持ち悪い」と感じる心が C/C++er にはある。
0532デフォルトの名無しさん (ワッチョイ 0b33-f8tT)
垢版 |
2018/05/03(木) 21:23:27.91ID:IMqmw2mT0
組み込みとかゲーム機のような、最初に一気に確保する環境で使うんじゃないかね
といっても確保済みのメモリに対して断片化しないように管理する仕組み作ったら、必然的にnew演算子もオーバーロードするだろうから結局placement new使わんかもしれんけど
0533デフォルトの名無しさん (ブーイモ MMc7-+yEv)
垢版 |
2018/05/04(金) 04:49:56.51ID:JszYn0L4M
クラスを丸ごとDLL化するときにはnew系をオーバーロード
しておかないと解放時にエラーになるべ。

ヒープはDLL単位にあるので集めておきたい場合はplacement使う
0534デフォルトの名無しさん (アウアウウー Sacf-a7mP)
垢版 |
2018/05/04(金) 11:44:28.56ID:8Ch7v1Nca
unique_ptrの配列版でメモリの再確保を行いたい場合どのように行うのがベターですか?
0538デフォルトの名無しさん (ワッチョイ ab7f-XJxX)
垢版 |
2018/05/04(金) 15:29:55.09ID:YqO5U4DS0
make_unique使ってね
0542デフォルトの名無しさん (ワイモマー MMaa-UBB+)
垢版 |
2018/05/06(日) 13:23:46.73ID:z9ZCOpRGM
以下のように、派生クラスのメンバ関数で基底クラスのメンバ関数を呼ぶように
基底クラスが派生クラスに強制する方法はないでしょうか?
ttps://wandbox.org/permlink/K4IHMYwOsutPQz3i
0543デフォルトの名無しさん (ワッチョイ c6e7-PabT)
垢版 |
2018/05/06(日) 14:01:54.85ID:f5coeozT0
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;
 }
};
0545542 (ワイモマー MMaa-UBB+)
垢版 |
2018/05/06(日) 14:59:52.15ID:z9ZCOpRGM
レスありがとうございます。
NVIというのがあるのですね。
(大昔に勉強したような…しかし思い出せず)
0550デフォルトの名無しさん (ワッチョイ 27d7-XJxX)
垢版 |
2018/05/07(月) 05:32:12.66ID:WYJ+W2Mc0
>>547
12行目のbase::f()はvirtualを抑止してpure virtualを呼び出す
13行目のf();は動的結合でchid::f()を呼び出す

baseは抽象クラスでnew base{}できないので
13行目の動的結合がbase::f()を呼び出すということは起こりえない
だからif(typeid(*this) != typeid(base))のようなチェックをしていない
0556デフォルトの名無しさん
垢版 |
2018/05/09(水) 03:49:30.68
Boostとか使ってると余計な依存関係をかかえてしまうけどな

C言語が一番
0573デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 18:49:54.96ID:bhGLBTeZa
C# と C++ は世の中でどちらのほうが使われているのでしょうか?

いま、 C++ の本(ロベール)を読んでいますが、無駄ですか?
柴田望洋訳の分厚い本も買ってしまいました。
0574デフォルトの名無しさん
垢版 |
2018/05/09(水) 18:54:28.74
C++は無駄とは言い切れないがロベールは無駄
0575デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 18:59:28.28ID:bhGLBTeZa
>>574

ありがとうございます。

結局、どのプログラミング言語を習得するのがおすすめでしょうか?

Python のような言語は除いて。
0577デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 19:05:22.21ID:bhGLBTeZa
>>576

趣味でアルゴリズムとデータ構造を勉強しています。
プログラミングコンテストの問題(Aizu Online Judge)を解いたりもしています。

もし、プログラマーになるとした場合、もっとも必要とされる言語を使って、
アルゴリズムとデータ構造の勉強をすれば効率的かなと考えています。

セジウィックとウエインの本や講義動画を読んだり見たりするときには、
Javaの入門書を見たりしています。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況