[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/30 03:13 / Filesize : 322 KB / Number-of Response : 1026
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part129



1 名前:デフォルトの名無しさん(ワッチョイ dfcf-HvS5) mailto:sage [2017/01/09(月) 14:49:27.56 ID:p96WJVyd0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part128
echo.2ch.net/test/read.cgi/tech/1480172629/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
echo.2ch.net/test/read.cgi/tech/1478440682/

■長いソースを貼るときはここへ。■
 codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

477 名前:デフォルトの名無しさん (ワッチョイ 6bdc-89sP) mailto:sage [2017/02/22(水) 19:13:31.66 ID:M+n+vM/b0.net]
以下のようなマルチスレッドプログラムを書いたのですが、もっとエレガントに書くことはできないでしょうか?
std::atomic<T>を使ったら可能でしょうか?

■メンバ変数

 std::mutex m_Mtx;
 std::string m_str;

■生産者スレッド

 while( true )
 {
  lock_guard<std::mutex> Lock( m_Mtx );
  
  m_str += "何らかの文字列";
 }

■消費者スレッド

 std::string str;
 
 {
  lock_guard<std::mutex> Lock( m_Mtx );

  str = m_str;
  
  m_str.clear();
 }

478 名前:デフォルトの名無しさん (ササクッテロラ Sp9f-Aztl) mailto:sage [2017/02/22(水) 20:12:00.06 ID:OuXxGo6Bp.net]
それで必要十分だと思うよ
stdがついたり付いてなかったり、変数が大文字始まりだったり小文字始まりだったりするのが気持ち悪いけど

479 名前:デフォルトの名無しさん (ワッチョイ fb34-wIi3) [2017/02/22(水) 20:31:27.26 ID:3B67WX1e0.net]
>>468
強いて言うなら
str.swap(m_str);
かな。

480 名前:デフォルトの名無しさん (ワントンキン MM7f-Mjmn) [2017/02/22(水) 20:40:10.22 ID:W153DobNM.net]


481 名前:そんな動作が必要なプログラムを書いたことがないし、どんなケースで必用になるのか想像もつかないけど、その動作が正なのであるばそれでいいんじゃない?

m_ って付いてるってことはメンバー関数なんだろうけどデストラクタどうするんだろうとか、色々気になる所はあるけど。
[]
[ここ壊れてます]

482 名前:デフォルトの名無しさん (ワッチョイ 5b02-Z7AI) mailto:sage [2017/02/22(水) 21:09:30.45 ID:TTVI91Rf0.net]
バックグラウンドで通信するならおおよそこんな感じになるんじゃないの

483 名前:468 (ワッチョイ 6bdc-89sP) mailto:sage [2017/02/22(水) 21:38:29.81 ID:M+n+vM/b0.net]
>>470
ご回答、ありがとうございます。

>>472
その通りでございます。

>>470
なるほど!
ということは、atomic<T>を使って

■メンバ変数

 std::atomic<std::string> m_str;

■生産者スレッド

 while( true ) m_str += "何らかの文字列";

■消費者スレッド

 std::string str;
 str.swap( m_str );


と、超エレガントにできそうですが、この場合、swap()でのアトミック性ってどうなるんでしょう??

484 名前:デフォルトの名無しさん (ワッチョイ fb34-wIi3) [2017/02/22(水) 21:46:47.39 ID:3B67WX1e0.net]
>>473
心配なら
m_str.swap(str);
でいいんじゃね?

485 名前:468 (ワッチョイ 6bdc-89sP) mailto:sage [2017/02/22(水) 23:00:07.25 ID:M+n+vM/b0.net]
>>474
あ、そうですね!
それならより安心ですね。
テストしてみて問題なかったら、それでいきます!
ありがとうございました。



486 名前:デフォルトの名無しさん (ワッチョイ 8acc-CoTN) mailto:sage [2017/02/23(木) 00:46:03.89 ID:+OueSnEu0.net]
ハンガリアンキンモー

487 名前:デフォルトの名無しさん (ワッチョイ de5b-moPN) mailto:sage [2017/02/24(金) 08:16:42.09 ID:DyzPRDD50.net]
見たことないのですがポインタ(の
入った変数)を参照することって可能
ですか?
int* &みたいなことです。

488 名前:デフォルトの名無しさん (ブーイモ MMc7-Ccab) mailto:sage [2017/02/24(金) 09:58:19.90 ID:bBhQmgr7M.net]
>>477
出来ます。テンプレートで使われるのが一番多いかな?
func(T& dst)に対してint*を渡すみたいなパターン

489 名前:デフォルトの名無しさん (アウアウカー Saeb-uNyc) mailto:sage [2017/02/24(金) 10:28:09.00 ID:e/BP7pNwa.net]
それは初心者用質問スレで訊くのが合っていますよ

490 名前:デフォルトの名無しさん (ワッチョイ 8a3c-/RgJ) mailto:sage [2017/02/24(金) 11:40:07.36 ID:9xRtAprE0.net]
auto&&とint&&は機能的に別物と考えていいのかな。
int&&は右辺値参照を実現する記法で、auto&&は参照の参照を実現するための仕組みという認識なんだけど。

491 名前:デフォルトの名無しさん (ワッチョイ 8acc-CoTN) mailto:sage [2017/02/24(金) 12:43:18.76 ID:quEFnRbB0.net]
人に聞く前になぜ自分でやってみようとは思わないの?

492 名前:デフォルトの名無しさん (スップ Sd4a-36q6) [2017/02/24(金) 13:15:08.70 ID:u1ntmSSgd.net]
試してもその環境では動くということしか確かめられないから

493 名前:デフォルトの名無しさん (ワッチョイ 7fc9-2lVT) mailto:sage [2017/02/24(金) 22:09:09.79 ID:OddQnmIq0.net]
実現するのが目的ではないだろうけど
auto &&のauto部分がX &に解決されるのはどうも気持ち悪い

494 名前: ◆QZaw55cn4c (ワッチョイ 4613-8lb6) mailto:sage [2017/02/24(金) 22:22:18.18 ID:4ewDjGBZ0.net]
>>477
できる,二重ポインタより分かりやすい

495 名前:デフォルトの名無しさん (ワッチョイ 1f30-GZNV) mailto:sage [2017/02/25(土) 00:02:24.64 ID:5D288ePc0.net]
>>480
テンプレートの型パラメータと普通の型の関係と同じようなもの
機能的に完全に別物というより一段上に追加機能のレイヤーがあるかないかの違い



496 名前:デフォルトの名無しさん (ワッチョイ 8acc-CoTN) mailto:sage [2017/02/25(土) 00:13:15.17 ID:Bto43eGs0.net]
まあautoの部分はXにもX*にもX&にも解釈可能だからトーシローは錯覚する罠

497 名前:デフォルトの名無しさん (ワッチョイ 8a3c-/RgJ) mailto:sage [2017/02/25(土) 12:29:14.82 ID:xXEZYycv0.net]
auto&&はreference collapsingっていう仕組みらしいけど江添氏はこの機能の解説してないんだよね。
だから右辺値参照の仕組みと透過性があるものなのだと思ってた。
右辺値参照の仕組みを理解すればおのずと理解できるもんだと思ってた。

498 名前:デフォルトの名無しさん (ワッチョイ 63a6-8lb6) mailto:sage [2017/02/25(土) 13:33:16.56 ID:THbYlaQi0.net]
これとかじゃなく?
https://cpplover.blogspot.jp/2014/09/c14-decltypeauto.html

499 名前:デフォルトの名無しさん (アウアウカー Saeb-uNyc) mailto:sage [2017/02/25(土) 18:59:53.13 ID:A0aZ5Z9Sa.net]
江添はそう言ってる?

500 名前:デフォルトの名無しさん (ワッチョイ 7fc9-2lVT) mailto:sage [2017/02/25(土) 21:48:53.39 ID:r3+UW6Ch0.net]
江添の説明はこれだな
『テンプレート実引数推定のルールで型推定が行われる』
『できるだけ普通のプログラマーの常識に合わせるために、とても複雑になっている』
以上

501 名前:デフォルトの名無しさん (ワッチョイ 0a7f-orIt) mailto:sage [2017/02/27(月) 14:18:25.09 ID:XaQXd7Ck0.net]
libc++ の挙動にバグっぽいものを見付けたんで cfe-dev に投げたんですが
ttp://lists.llvm.org/pipermail/cfe-dev/2017-February/052807.html
応答がありません…もっとふさわしい場所ってあるんですかね?

っていうか std::is_abstract が純粋仮想関数入りのクラステンプレートに対して
false 返すのって規格に照らしてどうなんでしょう?

502 名前:デフォルトの名無しさん (オッペケ Sr23-2lVT) mailto:sage [2017/02/27(月) 18:50:50.34 ID:mrZfm/tmr.net]
テンプレートクラスならともかくクラステンプレートならコンパイルエラーにならないとおかしい
ちなみにただのバグにしか見えない

503 名前:デフォルトの名無しさん (ワッチョイ 0a7f-orIt) mailto:sage [2017/02/27(月) 20:02:23.96 ID:XaQXd7Ck0.net]
なるほど、テンプレートクラスと言えばいいんですね。
適切な言葉をちゃんと知りませんでした。

504 名前:デフォルトの名無しさん (ワッチョイ a37b-mxZJ) [2017/02/27(月) 20:55:00.96 ID:Of/Kbntx0.net]
https://bugs.llvm.org//
バグ報告はここじゃね?

505 名前:デフォルトの名無しさん (ワッチョイ 7fc9-2lVT) mailto:sage [2017/02/27(月) 21:11:47.21 ID:4UiY0/x/0.net]
libc++ではなくてclangが腐ってるようにも見える
melpon.org/wandbox/permlink/GCDP7CU2HzUOMMML



506 名前:デフォルトの名無しさん (ワッチョイ 0a7f-orIt) mailto:sage [2017/02/27(月) 21:22:12.75 ID:XaQXd7Ck0.net]
>>494
New user self-registration is currently disabled
らしいのでどうせメールするならメーリスでいいか、
というのと規格的にどうなのかよくわからなかったので…

507 名前:デフォルトの名無しさん (ワッチョイ 0a7f-orIt) mailto:sage [2017/02/27(月) 21:25:24.26 ID:XaQXd7Ck0.net]
>>495
g++ で libc++ を使わせても同じ挙動だったのですが
どうなってるんでしょうね?

508 名前:デフォルトの名無しさん (スプッッ Sd33-moPN) mailto:sage [2017/02/28(火) 09:18:02.99 ID:cUxO9p4sd.net]
long→short 警告でない
size_t→int 警告出る

警告出たり出なかったりの違いってなんなんだ?
上記二つとも出ると思っていたのだが

509 名前:デフォルトの名無しさん (スップ Sd4a-36q6) [2017/02/28(火) 09:25:14.27 ID:+UqvplX+d.net]
unsignedでは

510 名前:デフォルトの名無しさん (ワッチョイ 8acc-CoTN) mailto:sage [2017/02/28(火) 09:41:23.40 ID:Mx4bsJ8G0.net]
警告を出すか出さないかはコンパイラのオプションで自由に選べる

511 名前:デフォルトの名無しさん (スプッッ Sd33-moPN) mailto:sage [2017/02/28(火) 11:50:09.20 ID:cUxO9p4sd.net]
>>499
それだと思ったのだけどsize_tでも出ないところと出るところがある
なんなんだこれ

512 名前:デフォルトの名無しさん (ワッチョイ 466c-fGBt) mailto:sage [2017/02/28(火) 13:37:18.52 ID:XuG6C30R0.net]
template<typename T> T f(const T& x){return x;}
template <int N> struct S{ int a[N];}
template<>template<int N> S<N> f(const S<N>& x){S<N> r; r.a[0] = x.a[0]; return r;}
こんな感じのコードで
Extraneous template parameter list in template specialization
って警告されるんですけど何が問題でどう書くのが正解なんですかね?

513 名前:デフォルトの名無しさん (ワッチョイ 8acc-CoTN) mailto:sage [2017/02/28(火) 13:40:56.38 ID:Mx4bsJ8G0.net]
>>502
特化テンプレートを使う場合は型や値を明記しなけりゃならない
この場合はNの数値を明記しなけりゃいけない

514 名前:デフォルトの名無しさん (ワッチョイ 466c-fGBt) mailto:sage [2017/02/28(火) 13:45:44.39 ID:XuG6C30R0.net]
ああなるほど・・・
Nが多いからテンプレートしてるのに手間ですな・・・

515 名前:デフォルトの名無しさん (ワントンキン MMfa-cxDF) mailto:sage [2017/02/28(火) 14:36:02.06 ID:t3AtpORvM.net]
出先だから書いてないけどvaliadic templateと再帰で全部インスタンス化できそうだけど



516 名前:デフォルトの名無しさん (ワッチョイ 1f30-GZNV) mailto:sage [2017/02/28(火) 18:49:47.90 ID:jvds/XNw0.net]
最初のfの特化じゃなくて別のテンプレートのfでオーバーロードするだけ
template<typename T> T f(const T& x){return x;}

template<int N> struct S{ int a[N];};

template<int N> S<N> f(const S<N>& x)
{ S<N> r; r.a[0] = x.a[0]; return r; }

517 名前:デフォルトの名無しさん (オッペケ Sr23-2lVT) mailto:sage [2017/03/01(水) 12:26:23.09 ID:2EZ/mUsgr.net]
>>501
もしかして定数の値が欠損していない場合では
constexpr size_t v1 = 32767;
int32_t v2 {v1}; //たぶん警告は出ない

518 名前:デフォルトの名無しさん (ワッチョイ 1f90-BJNc) mailto:sage [2017/03/02(木) 19:18:35.64 ID:x/1yO3Ie0.net]
++演算子で延々とループできるリングバッファみたいなコンテナってあると便利だと思うんですが
STLに入っていないのはなんでですか?

519 名前:デフォルトの名無しさん (ワッチョイ 6b02-2BvX) mailto:sage [2017/03/02(木) 19:23:17.02 ID:6rzvDmku0.net]
提案されていたけどまだ入ってない

520 名前:デフォルトの名無しさん (ワッチョイ 6b02-2BvX) mailto:sage [2017/03/02(木) 20:02:04.86 ID:6rzvDmku0.net]
ごめん違う奴だった勘違いしてた

521 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/03(金) 00:07:16.62 ID:TsTyuoGu0.net]
class Fooに対して演算子(例えば「|=」)のオーバーロードを使って
 Foo& operator|=(const Foo& rhs) { (*thisとrhsの演算結果を*thisに入れる) ; return *this; }
とか定義する例を見る気がしますが、
こういうパターン(演算結果を返すと共に*thisの値が破壊される)なメソッドを演算子のオーバーロードでなく名前で実装するとしたら
get〜とすべき?それともset〜が普通?

522 名前:デフォルトの名無しさん (ワッチョイ ef6c-HgeV) mailto:sage [2017/03/03(金) 00:10:55.24 ID:MwnP4WDg0.net]
普通setじゃない?

523 名前:デフォルトの名無しさん (ワッチョイ 9fed-OGW1) mailto:sage [2017/03/03(金) 00:15:24.61 ID:/S0wuqbS0.net]
setの戻り値にsetされた値が返ってきても違和感ないけど、getで中身変わったらキレる
質問からはズレるけど、演算処理が入るならupdateとかその辺のどちらでもない名前にしとくのが良いと思うなあ

524 名前:デフォルトの名無しさん (ワッチョイ 1fcc-+LoG) mailto:sage [2017/03/03(金) 01:57:52.71 ID:gLymaIrQ0.net]
無いものは自分で作ればいいのよ
パンがなければお菓子を食べればいいのよ

525 名前:デフォルトの名無しさん (ワッチョイ eb7b-2BvX) mailto:sage [2017/03/03(金) 02:12:38.68 ID:ApTpm6Xd0.net]
先輩 お金がないならATMに行けばいいじゃないですかぁ



526 名前:デフォルトの名無しさん (ワッチョイ 5fd4-CqFM) mailto:sage [2017/03/03(金) 05:32:35.45 ID:v1le7QT40.net]
その|=の演算を意味する名前だろ。

527 名前:デフォルトの名無しさん (ワッチョイ 0f24-T7IB) [2017/03/03(金) 09:23:46.53 ID:EiwPmmlf0.net]
ビットORでsetというと「ビットを立てる」という意味か?
だとしたらビットANDでreset、ビットXORでflipか

528 名前:デフォルトの名無しさん (ササクッテロル Spef-OGW1) mailto:sage [2017/03/03(金) 09:35:11.95 ID:CN7XccVQp.net]
ビット演算はただの例でしょ

529 名前:デフォルトの名無しさん (ワッチョイ 0f24-T7IB) [2017/03/03(金) 09:53:32.07 ID:EiwPmmlf0.net]
副作用のある演算子なら+=や--もあるわけだが
それもひっくるめて一概にsetかgetかと問うのに例が|=なのか

530 名前:デフォルトの名無しさん (ワッチョイ abd9-8nUV) mailto:sage [2017/03/03(金) 11:08:49.61 ID:mnS2IoUK0.net]
>>513
カウンタとかオートインクリメントする奴があるだろ
もっとカルシウム取った方が良いぞ

531 名前:デフォルトの名無しさん (ワッチョイ 8b7b-ERAc) [2017/03/03(金) 11:52:47.71 ID:8SEA7Mtt0.net]
カウンターのインクリメントにgetなんて名前付けないでしょ

532 名前:デフォルトの名無しさん (スプッッ Sdef-cA0b) [2017/03/03(金) 11:56:49.79 ID:LaI4btVTd.net]
GetNextFrameなのに内部で動画のデコードが行われるミドルウェアがあった

533 名前:デフォルトの名無しさん (ドコグロ MM2f-Y1yA) mailto:sage [2017/03/03(金) 12:46:37.01 ID:hxiWJWmXM.net]
>>520
それカウンタのインクリメントがメインじゃないだろ
(メインの機能なら単なるバカ)
他にも取得したデータをキャッシュしとくとかでオブジェクトの状態を変える奴はある

>>522
デコードしたフレームが取得できるとかじゃなくて?

534 名前:デフォルトの名無しさん (ワッチョイ 1f7f-RJLO) mailto:sage [2017/03/03(金) 13:00:47.12 ID:qCQIHM4i0.net]
>>522
PopNextFrameにしろって文句つけたら

535 名前:デフォルトの名無しさん (スプッッ Sdef-cA0b) [2017/03/03(金) 13:15:03.93 ID:LaI4btVTd.net]
>>523
フレーム番号を取得する機能とデコードの機能が一つになってる



536 名前:デフォルトの名無しさん (ワッチョイ 1f7d-M3Ci) [2017/03/03(金) 13:33:04.16 ID:UcAC+2mM0.net]
>>514
マリー・アントワネットのこの言葉は、事実ではなくて、
『マリー・アントワネット』を書いたシュテファン・ツバイクの創作
だという説もあるね

537 名前:デフォルトの名無しさん (ワッチョイ cb3c-m4jB) [2017/03/03(金) 14:59:24.75 ID:BCfaURI80.net]
ロベールのC++入門講座持っている人に質問
p.537一番下のテンポラリオブジェクトの寿命と
p.543のテンポラリオブジェクトの寿命の違いがいまいちよくわからないんだけど
もう少し詳しく解説してくれませんか?

538 名前:デフォルトの名無しさん (ドコグロ MM2f-Y1yA) mailto:sage [2017/03/03(金) 19:06:53.97 ID:hxiWJWmXM.net]
>>525
そのまとめかたがいいかどうかは知らんけど名前は特に違和感ないけどな

539 名前:511 (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/03(金) 20:51:41.34 ID:TsTyuoGu0.net]
レスdクス

>>512
なるほど言われてみればそんな気がする

>>513
確かに言われてみればそうかもしれない

>>516
ごもっとも言われてみればその通りに思える

もとの「|=」は和集合を求める演算のつもりだったので
setUnionという名前にした、

540 名前:デフォルトの名無しさん (ササクッテロル Spef-OGW1) mailto:sage [2017/03/03(金) 22:11:43.72 ID:CN7XccVQp.net]
ちなみにJavaでよく使われるByteStreamのgetシリーズは値を読み出しつつ参照位置を進めるメソッドになっている
個人的にはreadあたりに改名しろやと思わなくもないけど、getでしれっと中身が変わるのは稀によくある

つまりC++のconstメンバ関数は素晴らしい

541 名前:デフォルトの名無しさん (ササクッテロル Spef-OGW1) mailto:sage [2017/03/03(金) 22:13:19.97 ID:CN7XccVQp.net]
ByteBufferだわ

542 名前:デフォルトの名無しさん (ワッチョイ 5b30-EN75) mailto:sage [2017/03/04(土) 00:38:16.02 ID:gb3ZxOZZ0.net]
それは設計の視点・方向性の違い
コンテナ/ホルダーとみるならgetで状態が変わらない方が自然だけど
ジェネレータとみるならgetで値を返しつつ状態が変わる(次の値の用意をする)のも自然だ

543 名前:デフォルトの名無しさん (ワッチョイ 0f24-T7IB) [2017/03/04(土) 08:01:38.91 ID:NPMNhlmj0.net]
読み取り動作と進行動作は本来別な話だが
I/Oを進行なしで読み取らせようとすると
キャッシュせにゃあかんのでそこは副作用となる
C++にはそのためにmutableがあるので問題にはならん

ただしポートを叩くのとアクセス管理は別な問題なので
1つのクラスに一緒くたに突っ込む設計に俺は反対

544 名前:デフォルトの名無しさん (オッペケ Sref-n7ZK) mailto:sage [2017/03/04(土) 08:40:11.52 ID:sD1+OZIDr.net]
珍妙な持論だ
だがiostreamの>>やstdioのfreadやソケットのrecvも
読み取り命令と進行命令を別にすべきという考えなら一貫性はある

545 名前:デフォルトの名無しさん (ワッチョイ 1f3c-Y1yA) mailto:sage [2017/03/04(土) 08:45:52.42 ID:IfQ9fk2A0.net]
>>532
> コンテナ/ホルダーとみるならgetで状態が変わらない方が自然だけど
そう言うのは Peek でいいかと



546 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/04(土) 09:59:29.30 ID:JHoGQxOg0.net]
I/Oに近い低水準レイヤ────で読み取りと進行が不可分なケースは
物理法則からくる制約と処理効率の兼ね合いからそうしているはずで
読み取り+進行、という操作に業界固有の用語が存在はずだから
その用語を使えば良いんじゃないの

いったんメモリに乗ってしまったデータは使われ方が1種類で決まりきっているとかいった
特殊なケースを除き、取得と変更わ分けるのが正義
この領域において不必要なオブジェクトの変更を放置するのは
チューリングマシン

547 名前:の計算モデルで物事を初期化しないプログラマーレベル []
[ここ壊れてます]

548 名前:デフォルトの名無しさん (ワッチョイ 1f3c-Y1yA) mailto:sage [2017/03/04(土) 10:39:59.31 ID:IfQ9fk2A0.net]
ちゅーりんぐましんしってるおれすげーくん w

549 名前:デフォルトの名無しさん (ワッチョイ ab98-T7IB) mailto:sage [2017/03/04(土) 11:12:56.99 ID:+pEijc2g0.net]
読みにくい日本語から漂うアスペ感

550 名前:デフォルトの名無しさん (ワッチョイ 3b0e-RhaL) mailto:sage [2017/03/04(土) 12:55:27.75 ID:r8uNi5/x0.net]
getc

551 名前:デフォルトの名無しさん (ワッチョイ bb02-5QEK) mailto:sage [2017/03/04(土) 22:54:48.79 ID:zKraxpcF0.net]
デフォルトコンストラクタを持たないメンバーの初期化をしたいのだけど、
初期化が複雑だから初期化リストに含めたくない場合ってみんなどうしてるの?unique_ptrに変更する?

552 名前:デフォルトの名無しさん (ワンミングク MM3f-QRNW) mailto:sage [2017/03/05(日) 00:17:33.91 ID:n48qZSY3M.net]
>>540
builder patternを使う

553 名前:デフォルトの名無しさん (ワッチョイ 8b7b-ERAc) [2017/03/05(日) 00:27:52.82 ID:qOQ2PN1U0.net]
>>540
複雑ってのがよくわからんのだけど、例えばどんな?
単に引数を求める形に変換する必要があるとかならヘルパ関数作るだけ

554 名前:デフォルトの名無しさん (ワッチョイ 9fc1-OGW1) mailto:sage [2017/03/05(日) 01:30:40.03 ID:gIuIuvFQ0.net]
>>541
まぁこれ

555 名前:デフォルトの名無しさん (ワッチョイ bb02-5QEK) mailto:sage [2017/03/05(日) 09:53:23.05 ID:Ur8kOvvv0.net]
説明不足でした。すみません。
class Car {
. Engine e; //<デフォルトコンストラクタをもたない
};
みたいなクラスでeを初期化するのに
. 適切なトルクの計算;
. 適切な燃費の計算;
. e = Engine(トルク, 燃費);
とかしないといけなかったら、
Car : e(トルク, 燃費) {}みたいに初期化するのは難しいよね?
みなはどうしてるの?



556 名前:デフォルトの名無しさん (ワッチョイ 3b0e-RhaL) mailto:sage [2017/03/05(日) 10:36:02.63 ID:2RIrBifF0.net]
適切なトルクの計算や、適切な燃費の計算なんて処理はそのクラスのコンストラクタ以外じゃ使わないような特殊なものなの?
それはCarが計算すべきものなの?
別の関数でも用意して、Carのコンストラクタにエンジンの初期化情報を渡させるような作り方をするのが普通じゃね。

557 名前:デフォルトの名無しさん (ワッチョイ 1fcc-+LoG) mailto:sage [2017/03/05(日) 10:38:36.22 ID:X9OstEVD0.net]
Engineクラスに別途Initialize()メソッドを持たせるだけ
無理にコンストラクタで全部やろうとする設計がバカっぽい

558 名前:デフォルトの名無しさん (オッペケ Sref-n7ZK) mailto:sage [2017/03/05(日) 10:58:54.48 ID:w6jz+T9vr.net]
>>544が説明不足なんじゃなくて
ビルダーパターンと言う言葉を覚えて
レスも良く読まずに単語レベルで反応したアホがいるだけ

559 名前:デフォルトの名無しさん (ワッチョイ 9fc1-OGW1) mailto:sage [2017/03/05(日) 11:13:35.88 ID:gIuIuvFQ0.net]
Engineにコピーコンストラクタかムーブコンストラクタ作って、CarにEngineを受け取るコンストラクタを作る

Initializeメソッド付けるのは「オブジェクトを作ったら必ずInitializeを呼ぶ」ってルールを守らなきゃ使えないクラスになるから好み分かれると思う

560 名前:デフォルトの名無しさん (オッペケ Sref-n7ZK) mailto:sage [2017/03/05(日) 11:45:46.07 ID:w6jz+T9vr.net]
デフォルトコンストラクターを作ることがはばかられる質問者は
ムーブコンストラクターを作ることができない可能性がある
という発想には至らなかったようだ

561 名前:デフォルトの名無しさん (ワッチョイ 1f59-NqFr) [2017/03/05(日) 11:55:22.78 ID:69Hgyfek0.net]
ラムダ式でやろう
class Car{
t toruku{ 100 };
n nenpi{ 200 };
Engine e{ [](auto&& toruku, auto&& nenpi){ return { toruku * 2, nenpi * 3 }; }( this->toruku, this->nenpi ) };
};

562 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/05(日) 11:55:25.99 ID:uSZUgTTE0.net]
>>546
その設計はEngineの宣言(Engiine e;)からe.Initialize()呼び出しまでの間を持たせるために、
Engineに無理矢理デフォルトコンストラクタを付ける設計変更を要す、

仮にInitialize()をeではなくファクトリメソッドとするなら
>>540にてすでに
>unique_ptrに変更する?
としてすでに言及されているパターンと実質同じなのでは…

563 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/05(日) 11:58:09.92 ID:uSZUgTTE0.net]
>>548
横だがおk

564 名前:デフォルトの名無しさん (ワッチョイ 9fc1-OGW1) mailto:sage [2017/03/05(日) 12:18:26.47 ID:gIuIuvFQ0.net]
>>549
デフォルトコンストラクタが作れないケースとムーブ

565 名前:(コピー)コンストラクタが作れないケースは全く違うと思うけど、どうしてそんな可能性があるって発想に至ったの? []
[ここ壊れてます]



566 名前:デフォルトの名無しさん (ワンミングク MM3f-QRNW) mailto:sage [2017/03/05(日) 12:23:52.28 ID:h33ckUPTM.net]
俺はいつもコンストラクタは
デフォルトコンストラクタ(必要に応じて)
コピコン、ムブコン
メンバをすべて受け取るコンストラクタ
しか作らんけどなぁ

メンバを作るのが少しでもややこしければstaticなcreateみたいなの作ってそこでメンバ作る

567 名前:デフォルトの名無しさん (ワンミングク MM3f-QRNW) mailto:sage [2017/03/05(日) 12:26:06.75 ID:h33ckUPTM.net]
あと、ポインタで持つのはポリモーフィズムを期待するときだけだわ
C++でnullにしておきたいからポインタにするってなんかへんじゃね?
使うとき毎回nullチェックするポリシーも一緒に維持しないといけなさそう

568 名前:デフォルトの名無しさん (ワッチョイ 1f3c-Y1yA) mailto:sage [2017/03/05(日) 12:49:35.40 ID:f7+gl1ia0.net]
>>553
違うから可能性がない
とでも言うのか?
そのクラスは触れないだろうな
って考えるのが普通だと思うが

569 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/05(日) 13:05:22.78 ID:uSZUgTTE0.net]
>>544
>eを初期化するのに
>. 適切なトルクの計算;
>. 適切な燃費の計算;
>. e = Engine(トルク, 燃費);
>とかしないといけなかった
がデフォルトコンストラクタの追加が困難な理由を表してゐる、

次は>>566がコピーコンストラクタやムーブコンストラクタの追加が困難な理由を説明する番なのでは…

570 名前:デフォルトの名無しさん (ワッチョイ 9fc1-OGW1) mailto:sage [2017/03/05(日) 13:18:33.58 ID:gIuIuvFQ0.net]
どこの世界の普通だそれ…
Engineが仕事上触れないなら諦めてポインタで持つしか無いんじゃね
Carの初期化時点(コンストラクタ呼び出し時点)ではEngineは初期化するための情報が無いんだから、コンストラクタの中かInitialize関数かで後から初期化するしか無いでしょ
>>550のラムダ式が使えればそれでも出来そうに見えるけど、initializer_listってこんな使い方できたっけ?

571 名前:デフォルトの名無しさん (ワッチョイ 8b7b-ERAc) [2017/03/05(日) 13:39:08.47 ID:qOQ2PN1U0.net]
class Car{
static double 燃費計算();
static double トルク計算();
Engine e;
public:
Car():e(トルク計算(),燃費計算()){}
};

これだけの話じゃねえの?

572 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/05(日) 13:41:57.26 ID:uSZUgTTE0.net]
>>559はCarクラスにエンジンの詳細(燃費計算()とかトルク計算())を含める設計に何の疑問も抱かないのか…

573 名前:デフォルトの名無しさん (ササクッテロリ Spef-OGW1) mailto:sage [2017/03/05(日) 13:44:52.75 ID:rDGU9DZ0p.net]
>>559
Engineクラスを触らない前提ならこれでいいな

574 名前:デフォルトの名無しさん (ワッチョイ 8b7b-ERAc) [2017/03/05(日) 13:44:54.60 ID:qOQ2PN1U0.net]
>>560
例えでしかないんだから細かいところにつっこみ入れてもしょうがないだろ?

575 名前:デフォルトの名無しさん (ワッチョイ 5b8b-M3Ci) mailto:sage [2017/03/05(日) 13:47:42.42 ID:uSZUgTTE0.net]
Carクラスにstaticメソッドでエンジンの詳細を持たせる結果、
>>561が指摘するようにCarクラスのエンジン換装を不可能にしておいて
「細かいところ」とのたまう神経の図太さは
そのうち大成するやつかもわからんね…



576 名前:デフォルトの名無しさん (スププ Sd3f-OGW1) [2017/03/05(日) 14:06:10.31 ID:HN9/KcX+d.net]
CD-R

577 名前:デフォルトの名無しさん (ワッチョイ 1f3c-Y1yA) mailto:sage [2017/03/05(日) 14:16:16.25 ID:f7+gl1ia0.net]
>>557
頭大丈夫?
初期値が与えられていない状態にするって言うディフォルトコンストラクタなんていくらでもあるぞ
そんなのはディフォルトコンストラクタが作れない理由になんてなってない






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<322KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef