X



C++相談室 part140
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/01/13(日) 05:56:22.70ID:9RrR7Arz
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 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
0708デフォルトの名無しさん
垢版 |
2019/02/11(月) 22:31:10.87ID:zUKSDces
脱法建て増し建築
0710デフォルトの名無しさん
垢版 |
2019/02/12(火) 01:08:47.17ID:Q7cKpfag
コンパイル時に解決できることは何でもやります。
0711デフォルトの名無しさん
垢版 |
2019/02/12(火) 02:16:21.61ID:xDY2FToe
大学で2年CをやったんだけどC++を学習するのかなり楽になる?
0714デフォルトの名無しさん
垢版 |
2019/02/12(火) 03:19:13.37ID:VJfrEW+T
>>711
C++はC言語のほとんどの部分を内包したようなものだから、先にC固有の部分を理解した上でC++に入るのはかなりやり易いとは思う。
あと、Cでは当たり前のやり方がC++では推奨されないやり方になる部分もあるので、考え方の切り替えは必要になる。推奨されないといっても深い理解のためにはけして無駄になるわけではない。
まあそれでも十分大変だが。
0715 ◆QZaw55cn4c
垢版 |
2019/02/12(火) 04:25:41.28ID:afakhEje
>>714
>Cでは当たり前のやり方がC++では推奨されないやり方
なんかありましたっけ?
0717デフォルトの名無しさん
垢版 |
2019/02/12(火) 06:12:35.00ID:DAeR3Vqi
ファイラ作る場合c+とc#どちらがいいのですか?
いずれ3dもやりたいです
0718デフォルトの名無しさん
垢版 |
2019/02/12(火) 07:02:19.46ID:a49a8vnI
ご本尊のハゲ先生は「Cを知らなくてもC++を使える」と書いてるな。
一方『独習C++』でシルトさんは「Cを知らなきゃC++は難しい」と書いてる。

C以外のプログラミング言語を知ってるかどうかに依存するのか知れんし、
「この本ではCと共通する部分は説明しないよ」程度の意味かも知れんけど。
0719デフォルトの名無しさん
垢版 |
2019/02/12(火) 07:29:33.60ID:SvKCMiwA
mallocは非推奨なんですか?
0720デフォルトの名無しさん
垢版 |
2019/02/12(火) 08:01:36.93ID:/ZK7yd+2
malloc/freeだとコンストラクタ・デストラクタが呼ばれないからね。
placement newと組み合わせて、余計なmallocを減らして高速化をねらう使い方もあるにはあるけど、そういのはコンテナクラスでまとめちゃうだろうし。
0722デフォルトの名無しさん
垢版 |
2019/02/12(火) 10:06:17.35ID:dWGWBM0h
>>719
malloc() の戻り値は「void *」で、C だとどんな型のポインタ変数に代入しても
エラーや警告が出なかったが、C++ だとエラーが出る。
C++ は型を非常に大切にしていて、
TYPE *ptr = new TYPE; や
TYPE *ptr = new TYPE[N];
のように書くのが標準。理由は、必ずコンストラクタを呼ぶようにするためと、
型の異なるポインタには cast しない限りは絶対に代入できないようにするため
だと思われる。というのは、delete ptr とした場合に、ptr の型によってどの class の
デストラクタが呼ばれるかが変わったり、ptr->func() とした場合に、func が、
どの class のメンバ関数であるかをコンパイラが知るため。わずかでも違っていれば
結果が変わってきてしまう。これが C++ が大きなプログラム開発に向いている
所以でもあって、わずかな間違いでもコンパイラが見つけてくれる確率が高くなっている。

C++ で malloc() をエラーを起こさずに使うには、コンストラクタが(絶対に)存在しない
ところのBYTE 配列の場合ですら、
BYTE *ptr = (BYTE *)malloc(N); 
のように書かなくてははならない。 これは面倒なので(←嘘です)、
BYTE *ptr = new BYTE[N]; 
と書く習慣になっている。
0723デフォルトの名無しさん
垢版 |
2019/02/12(火) 11:29:59.12ID:8lolhehX
delete [] ptr; じゃね
0724デフォルトの名無しさん
垢版 |
2019/02/12(火) 11:46:23.37ID:LAva8DO1
>>723
TYPE *ptr = new TYPE;
の場合は、delete ptr; で、

TYPE *ptr = new TYPE[N];
の場合は、delete [] ptr;

と書くのが C++ の原定義。ここが、C++ のちょっと怖い気がするところ。
間違えてても、コンパイル段階ではエラーになってくれない。
0725デフォルトの名無しさん
垢版 |
2019/02/12(火) 11:55:45.12ID:8lolhehX
ほんそれω
0726デフォルトの名無しさん
垢版 |
2019/02/12(火) 12:07:41.98ID:rbyp88AN
deleteにカッコつけるのってちょっと配列を特別視してて嫌だわ。
配列を実現するにしても、[]表記を捨ててもいいんじゃないの。
0727デフォルトの名無しさん
垢版 |
2019/02/12(火) 12:14:13.71ID:NT60/ZFg
その辺は禿先生も失敗だったと認めてるけど今更変えられないんだよ
new[]は一切使わず、配列をnewするときはstd::arrayを使うのが今時の推奨スタイルです
0728デフォルトの名無しさん
垢版 |
2019/02/12(火) 12:14:29.27ID:2XqJFBgN
今時はstd::unique_ptrを使えという人もいるかも知れん。
newとdeleteでいいと思うが念のため。
0730はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/12(火) 14:52:25.40ID:jYEPbswv
たしかオブジェクトは、それと同じ型を要素とする大きさが 1 の配列と同じレイアウトだっていう保証は
どっかに書いてなかったっけ? (C++ じゃなくて C だっけ? うろ覚えですまん。)
それを前提とすると delete と delete[] の区別を導入してしまったのは不用意だよな。
malloc / free では区別なしに出来てたわけだし。
0732デフォルトの名無しさん
垢版 |
2019/02/12(火) 15:08:09.96ID:dWGWBM0h
>>730
ヘッダ部分を除いたデータ部分としては完全に同じといっても過言ではないんだけど、
ptr = new TYPE; とした場合は、C++ の仕様上は
メモリブロックの先頭に「配列の場合には埋め込まれるところの要素数」をコンパイラは
必ずしも埋め込まなくても良いという事になっていて、その場合、delete 命令から見ると、
要素数1の配列とは同じではない。ただし、VC++ の場合には、危険を避けるため、
delete と delete [] は、どちらを書いても問題なく動作するようになっている
という文書を読んだ事が有る。

(C++元々の)仕様は、なるべくメモリ使用量も検査量も少なくして効率を上げる、
という哲学から来るものなんだけど、型検査をがちがちにして安全性を高めている一方で、
非常に危険な仕様になっていると言えなくもない。ただし、TYPE が小さなオブジェクトの
場合、new TYPE において、メモリブロックのヘッダ部分を配列と同じ構造にしてしまうの
は、結構、メモリの無駄使いにはなる。ただし、それもC#なんかの無駄と比べれば
すずめの涙程度の全然問題ない程度のものではある。しかし、それだけ、C++が効率が
良いはずではある。
0733はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/12(火) 15:18:28.58ID:jYEPbswv
>>732
new はランタイムの処理だ。
同じメモリプールから切り出してくるならどちらにせよ大きさの管理は必要で、
コンパイル時に型が (すなわち必要なバイトサイズが) わかっているからといって、
それで効率的にはなる余地はあんまりあるとは思えんな。
0736デフォルトの名無しさん
垢版 |
2019/02/12(火) 15:44:00.70ID:dWGWBM0h
>>735
生のメモリブロックも、大きさは管理されているといえばされているんだけど、
理由は分からないけど、サイズを取得するための _msize(ptr) が存在しない
ライブラリがある。あと、TYPE が小さい場合、アラインの問題もあって、
MBのサイズがTYPE が2個以上入ってしまうようになってしまう場合も有り得て、
要素数を計算する再にその場合の処理を適切にしないといけない。
恐らく出来ないわけではないはずなんだけど、そういう変な事情も
考慮して元祖の C++ は設計されたんじゃないかな。
0737デフォルトの名無しさん
垢版 |
2019/02/12(火) 17:37:31.15ID:LAva8DO1
日本で最も使いやすい無料レンタルサーバーといえば、xrea だろう。
しかし、bit defender traffic light は、「黄色ランプ」になる。
これも、日本人に対するいじめの一環と考えられよう。

一応の理由としては、xrea で設置されていたバナー広告が過去に
マルウェア感染していた事があるかららしい。

いずれも日本で最も使いやすかったり普及していたり、日本人にとっては
最も重要なものばかりだ。
0739デフォルトの名無しさん
垢版 |
2019/02/12(火) 18:28:54.36ID:a7xlnsdf
pmrとかいう名前空間が出来ててワロ。
0740デフォルトの名無しさん
垢版 |
2019/02/12(火) 18:55:34.22ID:rlDMzVZE
スマートポインタを返す関数?について質問です
Smp<Foo> f = foo(); // こういうのがあるとき
if (foo()->bar) {} // こういうのとか
handle h = foo()->handle; // こういうのは安全なんですか?
または、スマポのデストラクタが動く瞬間はいつですか?
0742デフォルトの名無しさん
垢版 |
2019/02/12(火) 19:33:57.75ID:ujVln6bm
>>740
uniequ_ptr/shared_ptrはチェックしない
ただ、operator bool()を持ってるから取得してすぐチェックしてやれば以降は安全
デストラクタが呼ばれるのは寿命が尽きるとき
1番上の例はfのスコープの終わり、下2つはその行の終わり
0743デフォルトの名無しさん
垢版 |
2019/02/12(火) 19:52:41.54ID:rlDMzVZE
operator bool()について勉強になりました
if (f = foo() && f->bar) {}
こういう書き方にすればnull関係のチェックとなるというわけですね
> 下2つはその行の終わり
なるほどですね、実はそれを恐れていましたw
あほっぽいですが->barする直前にもしやデストラクタ動く?と怯えました
ありがとうございます
0745はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/12(火) 20:59:11.79ID:jYEPbswv
>>743
最新の C++ (C++17) なら

if(auto f=foo(); f && f->bar) {}

というように初期化と条件式をセミコロンで区切った書き方もできる。
ここで宣言した変数は if 文全体の終わりがスコープの終わりになるので、
範囲が限定的、かつ、スコープの終わりがわかりやすいので、
積極的に活用したいところ。
0747デフォルトの名無しさん
垢版 |
2019/02/13(水) 01:07:33.18ID:eXt03lvN
今までは構文の都合でconstであるべき変数もconstにできないことがあったが↓↓↓、
char c;
while ((c = *(p++), (c != '\0' && isprint(c))) {
 /*...*/
}
// 以下変数cを使わないコード

これからはconstにできる↓↓↓やたー!
while (const char c = *(p++); (c != '\0' && isprint(c))) {
 /*...*/
}
0748デフォルトの名無しさん
垢版 |
2019/02/13(水) 01:12:36.96ID:eXt03lvN
もうfor文とかも見境無し!
for (int i = 0; const char c = str[i]; c != '\0'; i++) {
 /*...*/
}

すばらしい…!
0755デフォルトの名無しさん
垢版 |
2019/02/13(水) 03:25:00.08ID:EX0tVwso
shared_future, shaed_mutex を使い分けるポイントって何でしょうか?
0756デフォルトの名無しさん
垢版 |
2019/02/13(水) 12:15:19.31ID:e6JJwbK6
基本uniqueで、いろんな所に取り回したいのがsharedかな
所有者がはっきりしてればunique、パタパタ受け渡したり色んなので共有するならsharedが自分の基準
0757デフォルトの名無しさん
垢版 |
2019/02/13(水) 17:50:02.15ID:9xiZOSOZ
c++のデスクトップアプリケーションをVS2017で作ろうと思うのですが、フォームデザイナーはないのでしょうか?
ボタンの位置などは全部コードで作る感じでしょうか?
0760さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/02/13(水) 17:59:32.77ID:25aOYuUG
リソースエディタでダイアログを作って、DialogBoxまたはCreateDialog系の関数でダイアログを作成できる。
0761デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:13:16.31ID:9xiZOSOZ
↑mfcというのは今はあまり使われないそうですが、c++でインターフェースを作る場合、
今どきは何が使われるんでしょうか?
ある程度いい見た目にするのなら、自作しなければいけない感じですか?
0765デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:25:23.74ID:lB+7RHzg
>>761
Visual studioでは標準的
ただマイクロソフトから見切られているので今後の発展は無い

最近ならQtが人気
初心者には取っつきづらいのと日本語情報がほとんど無いのとライセンスがちょっと厳しいのとVSで完結させることはできないが移植性が高くガンガン更新されているから将来性は一番ある
今時なデザインにしたいならQt内で独自言語のQMLを使ってつくるかWebEngineをつかってhtmlとjavascriptと連携させて作る必要がある
どちらも簡単にはできないけど
0769デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:40:53.11ID:QnNf1eu6
>>757
Tcl/Tk
0770デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:42:26.28ID:QnNf1eu6
>>766
ほんそれ
0771デフォルトの名無しさん
垢版 |
2019/02/13(水) 18:53:39.36ID:lB+7RHzg
使いもしないオプションを付けて時間がかかるとか言ってる人がいるってマジ?
0774デフォルトの名無しさん
垢版 |
2019/02/13(水) 19:19:16.70ID:e0d6KWci
>>773
目的によるだろうね
個人でC++を使ってる人の大半はC++を使うこと自体が半ば目的化していると思う
自尊心と中二心をくすぐる言語だから
0775はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/13(水) 20:01:48.29ID:VqRfiaP4
間違いなく C++ に出来ることは多いのだが、
要はそこまで必要な場合ってそんなに多くないでしょって話。

画像処理とか仮想通貨マイニングみたいな性能のチューニングがギリギリまで必要ってのなら
C++ を使う甲斐があるけど、 GUI を記述するのに C++ を使うのはそれほど強い必然性はない。
本来の処理をする部分が C++ で書かれているなら、
あえて GUI だけ別言語にする必要もないなっていう程度のことだと思う。
0776デフォルトの名無しさん
垢版 |
2019/02/13(水) 20:06:47.12ID:xfyW+H6K
意外とここアマチュア多かったのかな?
仕事でもないのにわざわざC++触るやつの気が知れん
0777デフォルトの名無しさん
垢版 |
2019/02/13(水) 20:24:14.55ID:RwVg7GE7
型がきっちりしてるから処理追いやすくていいと思うんだけどなあ
Javascriptで書かれたオープンソースなんて読んでもわけわからん
0778はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/02/13(水) 20:36:26.96ID:VqRfiaP4
ワイはアマチュアやで。 むしろプロは必要もないところまで取り組まんやろ。

知り合いにプロのゲームプログラマ (誰もが知っている有名シミュレーションゲームの老舗メーカーに所属)
がいるけど、 C++ の言語機能に関する知識なんて、びっくりするほど貧弱やぞ。
0779デフォルトの名無しさん
垢版 |
2019/02/13(水) 20:51:52.56ID:lB+7RHzg
ゲームプログラマは特殊だわ
あいつら例外なくゲームのことしか頭にないし
エンジン作ってる部署の人なら詳しい人もたくさん居るだろう
0781デフォルトの名無しさん
垢版 |
2019/02/13(水) 20:57:07.30ID:BFnAt9lr
可読性とデバッグのバランス考えると、
C中心で毛が生えた程度に++浅く
使うのが一番楽。

物理計算とかAIとかのが重要で
C++の文法遊びや多重にネストした
テンプレ遊びに深く付き合っても、
生産性上がんないからなあ。
0782デフォルトの名無しさん
垢版 |
2019/02/13(水) 21:36:58.08ID:D91GFqhb
テンプレみたいなコンパイラ毎に動作の異なるもんに執着してたら明らかに生産性下がるわ。
0783デフォルトの名無しさん
垢版 |
2019/02/13(水) 22:13:34.76ID:9vYYaAAU
++で生産性上がらんとか言ってる人はOOP理解出来てないだけだろ
俺も昔は同じで++に謂れのない敵意を持ってた
でも他のモダンな言語に乗り換えてファウラーやエヴァンスなどを読み漁ってOOPに習熟してから++に戻ってきたら今度は逆にCがゴミに思えるようになったよ
まあしかしこの壁を乗り越えるまでが大変なんだけどね
0785デフォルトの名無しさん
垢版 |
2019/02/13(水) 23:15:55.01ID:rqUgXbGq
C++はクラスの記述コストが高すぎて真面目にOOPするには辛いわ
モダンな言語と比較して、心理的にどうしてもクラスやメソッドの粒度が大きくなりがち
0787デフォルトの名無しさん
垢版 |
2019/02/13(水) 23:39:30.60ID:eXt03lvN
C++は破壊的代入ができるから嫌
デフォルトがconstでないとか、言語としてどうなの…
0790デフォルトの名無しさん
垢版 |
2019/02/14(木) 05:24:13.40ID:SFw402Pv
>>774
なるほど、自分はcgやりたいのでC++使うしかない感じですが、とりあえずc#をまともにできるようになります
0791デフォルトの名無しさん
垢版 |
2019/02/14(木) 16:05:08.53ID:b/dX4O0G
>>782
jsみたいにブラウザ毎に動作の異なるもんに執着してたら明らかに生産性下がるわ。
0794デフォルトの名無しさん
垢版 |
2019/02/14(木) 18:27:36.97ID:1/Iln0l0
ブラウザごとに動作が異なるのは、マイクロソフトが憎いからであって、影響力を失った今、マイクロソフトと違う動作にする必要が無いような気がする。
0795デフォルトの名無しさん
垢版 |
2019/02/14(木) 18:37:23.11ID:P/UAeoar
まだデスクトップでは絶大なる影響力があるから駄目だ。
凋落のメドも立ってない。
0796デフォルトの名無しさん
垢版 |
2019/02/14(木) 18:54:11.85ID:VFIxp5Qu
そしてGUIライブラリ開発者が萎えてQt一強になったりwebview的なものが流行るんですね
もうおしまいだわ
0797デフォルトの名無しさん
垢版 |
2019/02/14(木) 19:01:20.69ID:DfU+cSua
未来ではリテラシーが高まってCUIが標準になってるよ
GUIはエンタメ分野でだけ生き残る
0798デフォルトの名無しさん
垢版 |
2019/02/14(木) 19:11:38.67ID:1/Iln0l0
Windowsタブレットは中々イケてるけどな。
ちょっとだけ未来が見えるんだけど、惜しい、まだ未来じゃない。
って感じ。
手書きは流行ると思うよ。
電車の中でキーボード打つのは無理だけど、手書きなら何とかなる。
でも、ペン高いし、文字認識は驚くほどの精度だけど、図は描きにくかったり。
まだ未来は来てないんだよね。
0800デフォルトの名無しさん
垢版 |
2019/02/15(金) 00:09:02.90ID:GRt3HKgN
参照渡しについて質問です
void hoge(const int &x) ってすると int以外の型を渡すと危険ですか?
(short、long、unsigned、doubleなど)

void hoge(int x) のほうが安全な気がするけど、別にどっちでも一緒ですか?
0801デフォルトの名無しさん
垢版 |
2019/02/15(金) 00:21:58.58ID:LSuSmSCZ
int以外の型を渡せばintに変換した一時変数が作られてその参照が渡されるからそこに危険性はない
0805デフォルトの名無しさん
垢版 |
2019/02/15(金) 01:58:57.74ID:GRt3HKgN
>>801-804
なるほど、安全性は一緒なんですね。
うちの会社にそういうコードを書くベテラン社員がいるので、
気になって質問させてもらいました。
やっぱり組み込み型は普通に値渡しでいいみたいですね。
■ このスレッドは過去ログ倉庫に格納されています

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