C++相談室 part135

■ このスレッドは過去ログ倉庫に格納されています
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
2018/05/02(水) 11:01:41.50ID:lsKTgXIy0
ライブラリに分ける利点ってなんですかね
2018/05/02(水) 14:44:29.23ID:MK7npuGj0
>>482
クラスのメンバ変数に他のクラスインスタンスを召喚するときとか
コンストラクタでnewしてやらないといけないと思うの
2018/05/02(水) 14:47:38.93ID:G9KSYPOz0
>>494
複数のプロジェクトで使いまわせる

>>495
スマポ(かコンテナ)で大体のnewは回避できる
そのケースも回避できる
497デフォルトの名無しさん
垢版 |
2018/05/02(水) 15:02:47.22
>>495
別にnewしなくてもよくね?
なんかサンプル出してみ?
new無くしてやっから
2018/05/02(水) 16:18:42.29ID:MK7npuGj0
>>497
class CTest
{
 CFoo cfoo;

 void CTest()
 {
  cfoo = new CFoo();
 }
};

こんなんとかどうでしょう
2018/05/02(水) 16:23:28.41ID:BwUG32HZa
>>498

class CTest
{
 CFoo cfoo;

 void CTest(): cfoo()
 {
 }
};


メンバ初期化子知らんのか
2018/05/02(水) 16:28:43.53ID:hqQx66t6a
山口メンバーも初期化できたらいいのに
2018/05/02(水) 16:29:15.41ID:9riosu0F0
ヤバいなジャバ上がりw
2018/05/02(水) 16:36:00.09ID:BwUG32HZa
ちなみに非PODならメンバ初期化子に書かなくてもデフォルトコンストラクタで初期化子される
503デフォルトの名無しさん
垢版 |
2018/05/02(水) 16:36:35.49
そもそも>>498の例なら初期化子自体いらんしw
2018/05/02(水) 17:10:02.19ID:MK7npuGj0
>>499
そ、そうやって初期化したcfooはdeleteしなくてもいいんでつか?
2018/05/02(水) 17:15:22.77ID:2RgXx2xAF
>>504
変数の寿命を理解してないのか?
C/C++で変数の寿命を理解せずコード書くとメモリリークだらけになるから止めるか横着せず勉強するかしてくれ
2018/05/02(水) 17:19:29.16ID:9riosu0F0
>>504
何言ってんだお前は
そもそもdelete出来んだろ
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
....
例えば↑とか、単にこれだけ

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

一見簡単そうなんだけど、俺のレベルでは不可能
2018/05/02(水) 18:09:52.99ID:2RgXx2xAF
>>507
それC++の質問なの?
.NETのライブラリ(=>C++/CLI)じゃなくて?
2018/05/02(水) 18:25:45.38ID:EH+UkdGd0
いや、c# です
2018/05/02(水) 18:26:58.58ID:fs6yNkAId
>>509
スレ違い
2018/05/02(水) 18:29:31.79ID:EH+UkdGd0
ごめん間違えた、ここ C++のスレだった
隣で聞きます。
2018/05/02(水) 18:52:21.12ID:R3g8E+PO0
>>504
delete しなくてもいいのです
2018/05/02(水) 19:04:04.70ID:MK7npuGj0
>>505
>>506
>>512
み、みんな、親切にありがとう・・・
2018/05/02(水) 19:06:49.69ID:U7aQES8cr
>>494
一度に作る分量が減るので間違えにくい
別々の人間が手分けして作れる
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使えば良いだけだしね
516デフォルトの名無しさん
垢版 |
2018/05/02(水) 23:29:42.51
どうせ>>498
CFoo cfoo;
はこれまた
CFoo *cfoo;
のつもりだったんだろう

とりあえず>>499の形にすればnewはなくせる
ポインタを保持したい場合も生ポインタはやめたほうがいいね
2018/05/02(水) 23:41:46.06ID:g0SlpjdS0
可能な限りスマートポインタを使え、そしてスマートポインタで駄目な場合はほとんどないってのはその通りなんだけど、
初心者が生ポインタをちゃんと理解したことのないままスマートポインタを使いこなせるとも思えぬ。
そこらへんはちゃんと分けて、今回の場合はまずは生ポインタを理解するという方向性で説明する場面じゃろ。
2018/05/02(水) 23:47:44.17ID:MK7npuGj0
>>516
>>499を仰ぎますm(_ _)m
2018/05/03(木) 00:10:52.91ID:XlBZHwDZ0
もうスマポはスマポとして理解させたほうがいいような気がするけどな
下手な生ポの知識は初心者に有害だ
2018/05/03(木) 01:53:27.71ID:OyWVOyw+0
ていうかコンストラクタだから返却値型いらんやん
2018/05/03(木) 02:06:40.03ID:jt77zXjA0
ポインターをdeleteせずに扱う猛者がいると聞いて駆け付けてきた
2018/05/03(木) 02:41:54.13ID:HFudy7bE0
delete をしない戦略ってのは無くはないよ。

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

というか、それ以上に、確保したのを解放しないのは「気持ち悪い」と感じる心が C/C++er にはある。
2018/05/03(木) 05:19:48.86ID:qNLpdLzsd
組み込みだとそもそも終了なんてものがなかったりする
2018/05/03(木) 20:37:30.17ID:giVWGYEy0
解放しないメモリをnewとか頭湧いてんのか
2018/05/03(木) 20:40:51.26ID:HFudy7bE0
あたまがあったまってるんだ。
2018/05/03(木) 21:00:46.14ID:Nqnp2049M
確保済みメモリに対してのnewってあるよ
2018/05/03(木) 21:15:35.38ID:hvfEvXXP0
>>526
placement new の意味が今でもよくわかりません…どんなときに使うのかなあ…
2018/05/03(木) 21:18:01.47ID:RMsmDfZSd
char buf[MAX_BUF];
new(buf) MY_STRUCT(1, 2, 3);
2018/05/03(木) 21:18:51.15ID:RMsmDfZSd
char buf[sizeof(MY_STRUCT)];
new(buf) MY_STRUCT(1, 2, 3);
2018/05/03(木) 21:19:45.60ID:HFudy7bE0
>>527
VRAM みたいな特殊なメモリを C++ のオブジェクトに見せかけたい場合とか
2018/05/03(木) 21:20:25.98ID:RMsmDfZSd
すでに確保したメモリーブロック上でコンストラクターを発動させる。
2018/05/03(木) 21:23:27.91ID:IMqmw2mT0
組み込みとかゲーム機のような、最初に一気に確保する環境で使うんじゃないかね
といっても確保済みのメモリに対して断片化しないように管理する仕組み作ったら、必然的にnew演算子もオーバーロードするだろうから結局placement new使わんかもしれんけど
2018/05/04(金) 04:49:56.51ID:JszYn0L4M
クラスを丸ごとDLL化するときにはnew系をオーバーロード
しておかないと解放時にエラーになるべ。

ヒープはDLL単位にあるので集めておきたい場合はplacement使う
534デフォルトの名無しさん (アウアウウー Sacf-a7mP)
垢版 |
2018/05/04(金) 11:44:28.56ID:8Ch7v1Nca
unique_ptrの配列版でメモリの再確保を行いたい場合どのように行うのがベターですか?
2018/05/04(金) 11:50:52.58ID:Z8Fitafid
何に対してベター?
2018/05/04(金) 12:02:46.79ID:uwR6wCpjM
>>534
unique_ptr::reset( ) じゃねーの?
2018/05/04(金) 15:25:56.64ID:xM/0IOG70
スマポ使うときは最初にnewするもんなんじゃ…
538デフォルトの名無しさん (ワッチョイ ab7f-XJxX)
垢版 |
2018/05/04(金) 15:29:55.09ID:YqO5U4DS0
make_unique使ってね
2018/05/04(金) 15:47:45.28ID:kp+zcI/10
配列伸ばしたいなら素直にvector使え
2018/05/04(金) 22:00:12.15ID:VI6126jwa
いろんな意味にとれるから質問の答えは未定義
2018/05/05(土) 18:32:19.19ID:sJdk0i7H0
[][][] [[[ ] X_[[[ [] ][ [] ][][[[]
2018/05/06(日) 13:23:46.73ID:z9ZCOpRGM
以下のように、派生クラスのメンバ関数で基底クラスのメンバ関数を呼ぶように
基底クラスが派生クラスに強制する方法はないでしょうか?
ttps://wandbox.org/permlink/K4IHMYwOsutPQz3i
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;
 }
};
2018/05/06(日) 14:08:44.77ID:1ubTl4pj0
>>542
NVIじゃね?
https://wandbox.org/permlink/zjVuc2KjEPYsahYS
2018/05/06(日) 14:59:52.15ID:z9ZCOpRGM
レスありがとうございます。
NVIというのがあるのですね。
(大昔に勉強したような…しかし思い出せず)
2018/05/06(日) 15:57:13.38ID:Amh1VkyH0
大昔とかの問題じゃなくて基本だぞ
2018/05/06(日) 19:15:44.52ID:5lNukHv1M
>>544
pure virtualなのに関数定義することなんてできたのか…
f()とbase::f()は同じ関数なんだよね?
2018/05/06(日) 19:32:29.01ID:9CUhRDV/0
}]] [[《_["[[]]" 〈[]》》 [][][]0,1》》〈〉 [] } } "B,V,0%%%,*1BVLO,SASA1`}}//%\\0,1\"VL"\
2018/05/06(日) 19:37:26.47ID:hMxfhnzD0
>>547
俺も知らんかった...
規格上も正しいみたい
https://cpplover.blogspot.jp/2013/11/blog-post_24.html
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))のようなチェックをしていない
2018/05/07(月) 22:52:31.63ID:JZ0Er0Nn0
ちょっと根本的な質問を。

C#が既に普及しているなかあえてC++に固執する理由ってある?
2018/05/07(月) 23:34:15.98ID:Xl7KiTHE0
MSのOSしか使わないなんちゃてPGならC#で十分じゃないの
2018/05/08(火) 09:42:55.49ID:JvzvEXdEd
mono/Xamarinはしんどいと言う事を知らない世界の内はいいんじゃない?
大体Win限定だとしても高速化するのにC++で書いたのをdllimportするだろう
2018/05/08(火) 10:29:13.38ID:EjLESs2X0
ざまりんが苦しい人は信仰が足りないのです
 
 僕は信仰の自由を主張しますけどね
2018/05/08(火) 17:04:15.75ID:6aMWII0O0
>>551
余計な依存関係をかかえないのが嬉しいです
556デフォルトの名無しさん
垢版 |
2018/05/09(水) 03:49:30.68
Boostとか使ってると余計な依存関係をかかえてしまうけどな

C言語が一番
2018/05/09(水) 10:07:16.66ID:Ajqxpjd7d
一番多くの環境で使えるのはC言語
RAMが数十バイトしかないような非常にチープな8bitマイコンでも使える
2018/05/09(水) 10:29:31.98ID:ZxmL37bf0
数十バイトだとスタック領域ももパンクしそう、厳しいのではないか?
2018/05/09(水) 10:34:17.87ID:3kbM/2hPM
流石に盛り過ぎ
2018/05/09(水) 10:54:36.47ID:7azCP7HQa
知らないで盛ってると言うのはどうかと
昔6ピンpicでc使ってたけどRAMは16バイトだった気がする
2018/05/09(水) 11:01:43.78ID:7azCP7HQa
調べたら勘違いで自分の持ってたのはSRAM64バイトのpicだった
2018/05/09(水) 11:58:05.29ID:3kbM/2hPM
PIC12F609とかでもプログラム領域は1Kwあるけど
数十バイトしかない奴の型番教えてくれくれ
2018/05/09(水) 12:00:11.72ID:jousW3+sd
PIC10F200はRAMが16バイトですね
制約は当然ありますがC言語で開発出来ます
2018/05/09(水) 12:00:58.98ID:1NFscAG5a
C++どころかCすらやってはいけないレベルだな
恥ずかしいやつ
2018/05/09(水) 12:02:35.51ID:1NFscAG5a
>>562
ROMとRAMの区別がつかない人がなんでこのスレにいるのか?
2018/05/09(水) 12:04:25.14ID:3kbM/2hPM
ハーバードアーキテクチャのデータメモリサイズだけ書くの
卑怯だと思うの。プログラムメモリは256ワードあるじゃん
2018/05/09(水) 12:07:19.83ID:1NFscAG5a
>>557を受けての話だから
そのチープなマイコンで開発にCが使えてる
2018/05/09(水) 12:09:43.50ID:3kbM/2hPM
だから盛り過ぎでしょ
2018/05/09(水) 12:10:13.60ID:1NFscAG5a
>>568
じゃあできないというのか?
2018/05/09(水) 12:45:08.73ID:e8iSV/lBM
>>551
競技プログラミングとかunity覚えるの面倒とか?
2018/05/09(水) 13:09:28.13ID:J0gm0Ysvd
>>566
RAMってしっかり書いてるじゃん
チープなマイコンだとROM/RAMに別れてるのが普通だよアーキテクチャー関係無しに
2018/05/09(水) 18:42:26.74ID:X9SFPyiC0
スタックの話だよね
スタックはRAMであることが絶対条件なので
ROMがどんだけあろうが関係ない
573デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 18:49:54.96ID:bhGLBTeZa
C# と C++ は世の中でどちらのほうが使われているのでしょうか?

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

ありがとうございます。

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

Python のような言語は除いて。
2018/05/09(水) 19:01:30.85ID:ZxmL37bf0
何をやりたいと考えているか次第
577デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 19:05:22.21ID:bhGLBTeZa
>>576

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

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

セジウィックとウエインの本や講義動画を読んだり見たりするときには、
Javaの入門書を見たりしています。
578デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 19:07:11.19ID:bhGLBTeZa
>>576
コンピューターサイエンスを広く学ぶ上で一番適した言語がいいかなとも考えています。
2018/05/09(水) 19:16:40.18ID:ZxmL37bf0
C++のスレで言うのもどうかとは思うが、
初心者が覚えるのに相応しい言語はJavaじゃないかなと思う
アルゴリズムだけを学びたいなら、C言語が良いかもしれない
他の人の意見も聞いてね
2018/05/09(水) 19:47:49.06ID:dHqNIKDN0
>>577
そういうのがやりたくて、しかも今 C で片言がしゃべれるのなら、そのまま進めるのが一番いい
581デフォルトの名無しさん (アウアウウー Sacf-XJxX)
垢版 |
2018/05/09(水) 20:02:47.70ID:bhGLBTeZa
>>579
>>580

参考になりました。
ありがとうございました。
2018/05/09(水) 21:19:28.33ID:X9SFPyiC0
>>578
アセンブラかVerilog/VHDLあたりじゃね?
今の伝統的言語はユニプロセッサに源流があって
直列一辺倒の弱点が浮き彫りになっている昨今
【広く】学ぶうえでは却って足かせになるぞ
2018/05/10(木) 12:15:01.11ID:yXMj8vMdM
>>578
Occam2 とか XCが最凶かもな
2018/05/10(木) 12:20:40.60ID:YLAKf1v1a
Cはアルゴリズム勉強にはあまり向いてないと思う
以前各言語向けのアルゴリズム辞典みたいのを見比べてみたけど
Cのだけ異質な感じ
forのカウントいじってあったりして勉強しにくい

少なくともオブジェクト指向入れた言語じゃないと後で生かしにくい
2018/05/10(木) 15:18:57.11ID:RiSXhiCD0
オブジェクト指向が導入されているべきかどうかというよりも、単純に C は抽象化の能力が低いんだよ。
下層レイヤを上手く隠せないから段階的に積み上げていくというのがやり難い。

学習段階では上から下まで見えているって方が分かりやすいということはあるかもしれないので、
どちらが良いかというのは考え方とか好みにもよるので一概には言えないと思う。
2018/05/10(木) 15:24:31.29ID:bWcYs//f0
アルゴリズムの仕組みが言語の内部に隠されると理解を妨げるだろう
オブジェクト指向については、別の機会に学べば良い
2018/05/10(木) 15:59:00.64ID:RiSXhiCD0
そうとも言えない。
複雑なものを理解するには「分解する」は基本的なアプローチのひとつで、レイヤを切り分けるのは有用だよ。
それが >>585 に書いた「段階的に積み上げていく」の意図ね。

かといってそれで全体像が見通しにくくなってもそれはそれでアレだし、何がベストかなんて言えないよ。
やりやすいと思った方でやるしかしょうがないんじゃね。
2018/05/10(木) 16:46:33.01ID:bWcYs//f0
C言語で書かれたアルゴリズムが読み解けるようでないと
後で困るだろう
2018/05/10(木) 17:51:59.26ID:Ulb5C2sT0
C以外だとリストのシャッフルはshuffleだけで済ませられる
Cだとshuffleの中身を書かないといけない

C以外だと「Combination()を使おう」
Cだと「Combination()を実装しよう」
くらいの差がある

アルゴリズムがどこまで指すのか分らないが、楽しいことから先にやればいいんじゃねえの、ということで、C以外から
2018/05/10(木) 18:15:07.55ID:bWcYs//f0
アルゴリズムを学習するって、その実装の中身を理解することだろう
2018/05/10(木) 18:39:39.67ID:k0RUZ23fa
個人的には、各種ソートや基本的なデータ構造の操作を自前で書くようなシンプルなところから入った方が分かりやすいかと思うけど、まあ人それぞれかなと。
592デフォルトの名無しさん (アウアウウー Sa89-k37M)
垢版 |
2018/05/10(木) 18:45:52.70ID:yjf1B9Q5a
みなさん、ありがとうございます。

セジウィックとウエインのアルゴリズムの本に載っているのは、おそらく
ジェネリクスを使っているので一般性もあって、かつ効率もいいプログラム
だと思います。

ライブラリのようなクオリティーでプログラムを作るというのが理想です。
593デフォルトの名無しさん (アウアウウー Sa89-k37M)
垢版 |
2018/05/10(木) 18:51:57.46ID:yjf1B9Q5a
アルゴリズムの本というと C 言語でプログラムが書かれた本が多いですが、
やっと C++ で書かれた日本語の本が最近出版されましたね。

セジウィックとウエインの本よりももっと初歩的な本のようですが。

データ構造とアルゴリズム (電子情報通信レクチャーシリーズ B-8) 単行本 ? 2018/2/1
岩沼 宏治 (著), 美濃 英俊 (著), 鍋島 英知 (著),
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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