- 1 名前:デフォルトの名無しさん(ワッチョイ 7fc9-G+K4) mailto:sage [2016/04/03(日) 00:22:24.07 ID:ZT/2NYWz0.net]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part123 echo.2ch.net/test/read.cgi/tech/1456040187/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 peace.2ch.net/test/read.cgi/tech/1439849418/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
- 995 名前:デフォルトの名無しさん (ワッチョイ 1c7b-dmih) mailto:sage [2016/05/20(金) 19:51:35.59 ID:iM9BKZPP0.net]
- >>969
あ゛ー いいから普通にM_PI使え 規格原理主義者のたわごとなど完全無視しろ もしクソバカ環境でコンパイルエラーが起きたら #ifndef M_PI #define M_PI 3.14159265358979323846 #endif とかで如何なる問題も発生しない
- 996 名前:デフォルトの名無しさん (ワッチョイ bd6c-WkY+) mailto:sage [2016/05/20(金) 19:54:05.85 ID:BayA8c/P0.net]
- >>970
ようわからんけど 別にstaticにせんでも const OuterClass&をinnerClassにもたせてコンストラクタで指定すれば良い気がする
- 997 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 20:29:11.61 ID:gU7EupTq0.net]
- >>972
コンストラクタでやるという記述もググッた時に見つかったのですが、 今回はInnerClassを一つではなく配列として持つので、メモリをケチろうかと。 コンストラクタで渡した方が確かに記述は綺麗なのですが。 とはいえ、改めて「プログラミング言語C++」を確認しても、 クラス継承の話は多くてもクラス内包の話がほぼ無いので、 一般的にはコンストラクタで「メンバ変数」として渡すのでしょうか。確かにこれだと確実です。 記述的にはコンストラクタ内でstaticに対して上書きしまくってもいいのですが、 これができるのか?というのは若干不安ですし。
- 998 名前:デフォルトの名無しさん (ワッチョイ bd6c-WkY+) mailto:sage [2016/05/20(金) 20:43:41.93 ID:BayA8c/P0.net]
- OuterClassのインスタンスが一つならそれでもいいけど
それならそれで他に良い設計がありそうな気もする それこそシングルトンだとか
- 999 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 20:56:18.27 ID:gU7EupTq0.net]
- つまりstaticはどこに書いてあるクラスでも1つかもしれないと。
OuterClassは当面は1つで済みますが、今後複数化する可能性もあるので、シングルトンは駄目です。 余り真面目にC++やってなかったのですが、 内部クラスから外部クラスが階層アクセスできないのは、C++の仕様がちょっと古い気がします。 後発のJavaやJavaScriptは最初から出来るので。 ちなみに参考コード class OuterClass { class InnerClass { // 省略 }; int score; vector<InnerClass> nodes; };
- 1000 名前:デフォルトの名無しさん (スプー Sd28-MTTD) mailto:sage [2016/05/20(金) 21:02:34.05 ID:88qDJ/vwd.net]
- >>973
Inner - Outer の関係にする必要性はどこにあるの?
- 1001 名前:デフォルトの名無しさん (ブーイモ MM31-MTTD) mailto:sage [2016/05/20(金) 21:12:02.35 ID:icw8VvxgM.net]
- >>970
・staticメンバは
- 1002 名前:プログラムを通して一つ
・メモリをケチりたくてmethod_cpp1が可能ならそれがよいだろう ・JavaやJavaScriptでも結局は暗黙的にOuterClassへの参照を持つことになるのでInnerClassインスタンスごとにメモリを使うことになる ・InnerClassとOuterClassとの間にメモリ配置上の制約があるなら、ほかの手も考えられるが、配列で持つとのことなので恐らくダメだろう ・古いというのはわからなくもないが、後発の言語が暗黙的にやるコストについて意識しない人がいるのならあながち悪くはないのかもしれない [] - [ここ壊れてます]
- 1003 名前:デフォルトの名無しさん (ワッチョイ bd54-UmRV) mailto:sage [2016/05/20(金) 21:20:44.60 ID:Czf9pjzL0.net]
- >>971
いんや規格は重要だ まず動くことが至上命題ではあるがそこ履き違えると底辺コーダーになっちまうぞ
- 1004 名前:デフォルトの名無しさん (ワッチョイ bd54-UmRV) [2016/05/20(金) 21:34:03.42 ID:Czf9pjzL0.net]
- なんだP君だったのか…
>>970 メモリケチりたい状況で外の「インスタンス」にアクセスしたいってのは無理がある気がするな 俺ならOuterとInnerとは別に、もう一個クラス作ってそいつに両方に依存した処理やらせるかな
- 1005 名前:デフォルトの名無しさん (ワッチョイ bd54-UmRV) mailto:sage [2016/05/20(金) 21:38:07.10 ID:Czf9pjzL0.net]
- >>977を良く見てなかったが、どうやら余計なレスだったようだ
自分もmethod_cpp1の適宜渡す方法に同意します
- 1006 名前:デフォルトの名無しさん (ブーイモ MMe9-MTTD) mailto:sage [2016/05/20(金) 21:56:53.90 ID:Dz9bHtQOM.net]
- 適宜渡すとして記述が煩雑になるのが問題のようだから、それを緩和する手は色々ありそうな気はする
- 1007 名前:デフォルトの名無しさん (ブーイモ MMe9-MTTD) mailto:sage [2016/05/20(金) 21:57:43.59 ID:Dz9bHtQOM.net]
- あれID変わった
- 1008 名前:デフォルトの名無しさん (ワッチョイ fd10-MJjN) mailto:sage [2016/05/20(金) 22:09:45.76 ID:RCBW+7XV0.net]
- >>934
M_PIが規格で定義されてるかとかいう議論も意味あるかもしれないけど、 そもそも、円周率はたとえが悪いだけなんじゃないの? 重力加速度とか万有引力定数とかならどうするのがベスト?(もちろん場合によるだろうが)
- 1009 名前:デフォルトの名無しさん (ワッチョイ bd54-UmRV) mailto:sage [2016/05/20(金) 22:23:37.08 ID:Czf9pjzL0.net]
- >>981
ありそうな気はするが技巧的な方法しか思いつかないな InnerInnerを作り、今のInnerの機能を移動し、Innerにはコンテナと親の参照を持たせる そしてInnerInnerのmethod_cpp1のようなメソッドをInnerが委譲 これじゃ親から見た場合に多少はマシになるって程度で、コードも設計も汚いな
- 1010 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 22:43:44.89 ID:gU7EupTq0.net]
- >>976
いや特にありません。そもそも非オブジェクト指向でも当然組めます。 ただ、色々試した結果、オブジェクト指向に慣れてくると、 Java的な「それ刻みすぎじゃねーの?」と思えるような所まで刻んだ方が 結果的に見やすかったり、後々融通が利くことが何となく分かってきました。 なので、今後はそうしようかと試しています。 >>977 詳細にありがとうございます。やはりstaticでは駄目ですか。 method_cpp1は今回は可能ですが、記述の抽象度が混ざるので出来ればクラス分けしたかったのです。 JavaやJavaScriptでもメモリ使用量が少ないわけではないのはその通りですが、 内部クラスからは外部クラスを参照するのはかなり普通のことなので、 これは言語として対応して欲しかったところです。今まで拡張されなかったのが不思議なくらいです。 これはコンパイラ側だけで完全に対応でき、実行時の追加コストはありません。 (不要ならコンパイル時点で外側クラスポインタの確保を止めることが出来る) 申し訳ありませんが、メモリ配置上の制約というのは何のことか分かりません。
- 1011 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 22:44:35.94 ID:gU7EupTq0.net]
- ちなみに、やろうとしていることに近く、イメージ的に分かりやすいのは、「ライフゲームをオブジェクト指向で」です。
参考コード、非オブジェクト指向 bool map[64][64]; bool map_next[64][64]; for (int i=0
- 1012 名前:;i<64;i++)
for (int j=0;j<64;j++) map_next[i][j] = life_exe(i,j); 参考コード、オブジェクト指向 class LifeGame { class Dot { int x, int y; void life_exe(){} // ここで外側の map, map_new に直接アクセスして更新させたい。 }; bool map[64][64]; bool map_next[64][64]; }; 実際にやろうとしていることは、正規表現の探索に近いです。 ライフゲームのように外側変数が時系列で変化するものではないため、 探索途中経過(Dot)をオブジェクトとして持ち、 最初から各オブジェクトに終わりまで探索(life_exe)させる事が出来ます。 とはいえ、やはりメリットは大してありませんが。 [] - [ここ壊れてます]
- 1013 名前:デフォルトの名無しさん (ワッチョイ bcbf-7Gsa) mailto:sage [2016/05/20(金) 22:45:59.15 ID:91VA6wxC0.net]
- >>983
ライブラリの数値を使うか自分で数値を定義しておくかな… piとかeは数学関数で計算できるだけマシってことね M_PI使わない理由として俺は十分納得できるかな
- 1014 名前:デフォルトの名無しさん (ワッチョイ caa6-xKv1) mailto:sage [2016/05/20(金) 22:51:15.37 ID:RvnBIaae0.net]
- >>985
オブジェクト指向であることとか「刻む」ことの意義と インナークラスにすることがあまり結びつかないなあ。 内側のクラスの存在が外側から完全に隠れる以外の効果あったっけ?
- 1015 名前:デフォルトの名無しさん (ワッチョイ bd6c-dqc0) mailto:sage [2016/05/20(金) 22:53:44.87 ID:BayA8c/P0.net]
- 内側クラスは外側クラスのプライベートにアクセスできる
- 1016 名前:デフォルトの名無しさん (ブーイモ MM28-MTTD) mailto:sage [2016/05/20(金) 22:56:32.97 ID:4DucW+JdM.net]
- >>984
マクロやstaticメンバを使った汚い手から一時的な処理用のクラスを作るなどまで想像してましたが、どのみち一手間かかるので必要性次第でしょうね(Innerのメソッドが多くてそうでもしないと…とか) 結局それほどケチる必要がなくてコンストラクタで渡すので十分な予感 本当にポインタ1個分が問題になるような細かいInnerClassを多数作るようなケースなら、このアドレスの範囲にあるInnerのオブジェクトはどのOuterに対応する、という表が作れると検索時間と引き替えにメモリを節約できたり
- 1017 名前:デフォルトの名無しさん (ブーイモ MM28-MTTD) mailto:sage [2016/05/20(金) 23:07:25.77 ID:4DucW+JdM.net]
- >>985
最近追加されたラムダですらどのようにキャプチャするかを細かく指定しなければならない言語だということを理解した方がいいと思う 今後そういう機能が追加されるかどうかはしらないけど、されたらいいね
- 1018 名前:デフォルトの名無しさん (ワッチョイ bc42-MTTD) mailto:sage [2016/05/20(金) 23:17:26.67 ID:soKi6pqK0.net]
- innerクラスなんて完全なアンチパターンだろ
馬鹿じゃねーの
- 1019 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 23:24:48.47 ID:gU7EupTq0.net]
- >>988
インナーにするのは、DotはLifeGameでしか使わないからです。(他から見える必要がない) オブジェクト指向にするのは、多分制御が簡単になりそうだからなのと、 その際に記述が抽象階層で分離でき、見やすくなると予想されるからです。 もっと良い例がありました。「文書内の不完全マッチによる最有力候補探索」です。 これはほぼやりたいことと同じです。 例えばテキスト文書があったとして、「あいうえおかきくけこ」を探索するとします。 ここで、そのまま「あいうえおかきくけこ」があれば100点、それを示して終わりです。 これがない場合、欠け方それぞれで得点付けし、とにかく一番得点が高い候補を一つ出します。 (例えば「あ」がないのなら-20点とか、「う」が抜けているのなら-10点とか) 実際は多分100〜200字同士のマッチングと等価で、完全一致は期待できないため、 Dotに分枝の作成まで含めてlife_exeさせます。 結果、LifeGameからは「やっとけ。」だけで済み、詳細な実行ルーチンはDot側に集約されます。 といってもこれは分離されるだけで、どちらに書くかの違いだけなのですが、 それでも後々効いてきます
- 1020 名前:フで、Dot側に集約できる部分は集約しておきたいのです。
Dotは分枝の作成時に自分自身からforkする感じで、たぶんかなり増えます。 ただし親は一つなので、ここの部分は勿体ないかな、という感じでした。 (問題になるほど増えないとは思います) life_exe内には親のmapへのアクセスは大量に存在しますが、 life_exeはDot内で自走するので、引数として親ポインタを渡すことは出来ません。 従って、親ポインタはコンストラクタでメンバ変数として確保することになります。 コンストラクタで親ポインタを渡すのは、記述的には全く問題ないです。 (最初にもらった親ポインタを大事に抱えて再帰しまくることも出来ますが、、、) [] - [ここ壊れてます]
- 1021 名前:デフォルトの名無しさん (ワッチョイ b0ab-/fHo) [2016/05/20(金) 23:24:55.51 ID:G62tMzQY0.net]
- 馬鹿じゃねーよ
おまえ以外は
- 1022 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/20(金) 23:52:28.35 ID:gU7EupTq0.net]
- >>991
> 最近追加されたラムダですら 見てみましたが、確かにこのラムダはちょっと見にくいですし、使いにくいですね。 元はといえばC++には関数内関数が無い為、レキシカルスコープ(※)を導入できず、 ラムダのうまみも少し欠けている気がします。 (※一つずつ上の階層を探して名前が一致したらそれと見なす) g++では既に拡張が行われていると聞きましたが、先に関数内関数が欲しかったですね。 とはいえ、回答して頂いた皆様、ありがとうございました。
- 1023 名前:デフォルトの名無しさん (ブーイモ MM28-MTTD) mailto:sage [2016/05/21(土) 00:00:28.24 ID:z244ST7/M.net]
- >>995
使いにくいのにはそれなりの理由があって、それを理解しましょうねという話 その上で適切な言語を選びましょう
- 1024 名前:デフォルトの名無しさん (ワッチョイ 9102-xKv1) mailto:sage [2016/05/21(土) 00:01:00.93 ID:EJBeUkkD0.net]
- 動けば良いんだよ
- 1025 名前:デフォルトの名無しさん (ワッチョイ caa6-xKv1) mailto:sage [2016/05/21(土) 00:27:26.30 ID:jGVAnHGn0.net]
- >>995
よくわかんないけど、名前が一致した「それ」は型が揃っているのかな? 一致してる度合いに微妙に差があるのでは?
- 1026 名前:デフォルトの名無しさん (ワッチョイ bc7b-xKv1) mailto:sage [2016/05/21(土) 00:56:40.25 ID:Uqmc4lbY0.net]
- >>983
宇宙物理のシミュレーションだと万有引力定数が1になるような単位系で計算する
- 1027 名前:デフォルトの名無しさん (ワッチョイ caa6-xKv1) mailto:sage [2016/05/21(土) 01:08:07.17 ID:jGVAnHGn0.net]
- 外部からはOuter::Innerはautoでしか受けられない型か
- 1028 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/21(土) 01:23:16.26 ID:HBQ7d37R0.net]
- 次スレ
C++相談室 part125 echo.2ch.net/test/read.cgi/tech/1463761261/
- 1029 名前:デフォルトの名無しさん (ワッチョイ 7b5b-xKv1) mailto:sage [2016/05/21(土) 01:29:43.83 ID:HBQ7d37R0.net]
- >>998
自分がイメージしたのはJavaScriptで、あの言語はnamespaceがないので関数内関数がデフォ、 そして型がないので名前さえ一致すればそこで決まりですね。 ラムダで数階層上の変数を掴みに行くこともよくあります。 C++はnamespaceで細かく切れということなのでしょうが、 やはりユーザの意志で階層が切れないのは使いにくいですね。 C++のインナークラスはメリットがないといえばそうですが、JavaScriptだとインナークラスがデフォです。 (外に見せる必要がなければインナークラス) これに関しては「余分な物は見せない」というJavaScriptの方がプログラミングとしては正しいと思われます。 ただ、ラムダはGCヒープならほぼ問題ありませんが、スタックが基本のC/C++だと実装も難しいはずで、 C++のラムダは分かりやすくはないけど妥当な仕様の気もしますね。 現実的にはヒープポインタを値キャプチャでラムダでしょうし、この仕様で実害はありません。 スタック変数をラムダで参照キャプチャは使い方として不自然ですし。 それでもやりたければ出来るところがC++っぽいですが。
- 1030 名前:1001 [Over 1000 Thread.net]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。 life time: 48日 1時間 7分 19秒
- 1031 名前:1002 [Over 1000 Thread.net]
- 2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。 ─────────────────── 《プレミアム会員の主な特典》 ★ 2ちゃんねる専用ブラウザからの広告除去 ★ 2ちゃんねるの過去ログを取得 ★ 書き込み規制の緩和 ─────────────────── 会員登録には個人情報は一切必要ありません。 月300円から匿名でご購入いただけます。 ▼ プレミアム会員登録はこちら ▼ premium.2ch.net/ pink-chan-store.myshopify.com/
- 1032 名前:過去ログ ★ [[過去ログ]]
- ■ このスレッドは過去ログ倉庫に格納されています
|

|