C++相談室 part126 [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/08/13(土) 11:24:45.65ID:NPYsKJkE!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part125
http://echo.2ch.net/test/read.cgi/tech/1463761261/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.99【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1469177649/
■長いソースを貼るときはここへ。■
http://codepad.org/
http://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
0268デフォルトの名無しさん
2016/08/31(水) 16:56:40.77ID:/MnV3wL60269デフォルトの名無しさん
2016/08/31(水) 17:50:46.05ID:WLaQrr/5合格。絶対にこんなコード書かないけど、
プロパティの要件は一応満たしている。
0270デフォルトの名無しさん
2016/08/31(水) 18:02:51.48ID:N4JrJ9XH0271デフォルトの名無しさん
2016/08/31(水) 18:55:44.77ID:gRHWeOr50272デフォルトの名無しさん
2016/08/31(水) 19:41:02.78ID:YUscqvM80273デフォルトの名無しさん
2016/08/31(水) 20:06:57.16ID:XvHw9frf0274デフォルトの名無しさん
2016/08/31(水) 20:41:02.91ID:+TzIiYAW0275デフォルトの名無しさん
2016/08/31(水) 20:43:28.45ID:YUscqvM80276デフォルトの名無しさん
2016/08/31(水) 20:54:10.62ID:/MnV3wL60277デフォルトの名無しさん
2016/08/31(水) 20:57:52.91ID:ntcwlW+60278デフォルトの名無しさん
2016/08/31(水) 21:00:08.58ID:NSLbELcw0279デフォルトの名無しさん
2016/08/31(水) 21:32:42.17ID:viOT3sew0280デフォルトの名無しさん
2016/08/31(水) 21:48:33.01ID:MERKTov50281デフォルトの名無しさん
2016/08/31(水) 21:59:28.02ID:/ANAyxIk余計なことして何が起こっても全て使用者の責任
0282デフォルトの名無しさん
2016/08/31(水) 22:34:19.56ID:xAEFTakh0283デフォルトの名無しさん
2016/08/31(水) 22:57:22.63ID:YUscqvM80284デフォルトの名無しさん
2016/08/31(水) 23:03:00.58ID:6ukDv4b6そうかもね。設計が下手なんじゃないかな。
もっとも俺もC#ではプロパティ使いまくるけどね。大概のは{get; private set;}だな。
0285デフォルトの名無しさん
2016/08/31(水) 23:06:47.51ID:gUL/+EZq「C++で標準でできないことは出来る必要がないから、
そもそも、やろうとする奴が悪いんだ」みたいな幼稚な思考だったらやめとけよ?
それは宗教だ。
0286デフォルトの名無しさん
2016/08/31(水) 23:10:36.99ID:YUscqvM8俺は良し悪しは言ってないよ
0287デフォルトの名無しさん
2016/08/31(水) 23:23:15.94ID:YUscqvM8「このクラスは内部に属性A、属性B、属性Cを持ち、その状態とアクセスを管理します」
みたいな仕様を公開してるクラスだったらプロパティは使いたくなるだろうな。
でもどちらかというとそういうクラスは少ないような気がしたのさ。
0288デフォルトの名無しさん
2016/08/31(水) 23:36:37.26ID:mzwgRQN40289デフォルトの名無しさん
2016/08/31(水) 23:45:12.50ID:YUscqvM8何が?
0290デフォルトの名無しさん
2016/08/31(水) 23:51:01.09ID:/MnV3wL6普通にprivateデータメンバじゃん、それ
0291デフォルトの名無しさん
2016/08/31(水) 23:56:32.05ID:YUscqvM8いや、それらの属性を持ってること自体を外部に公開してる。
privateメンバだったらそんなことは内部仕様にしか書かないでしょ。
0292デフォルトの名無しさん
2016/09/01(木) 00:14:02.16ID:PJEueDDa「どんな属性を持ってるか自体を隠蔽するのが普通」
って書けばいいじゃん
0293デフォルトの名無しさん
2016/09/01(木) 00:31:43.23ID:8Xtys+zEC#はGUI作成程度しか使わない俺的感性だと、setter/getterで十分じゃね?と思うんだが、メリットをトクトクと語ってくれ。
0294デフォルトの名無しさん
2016/09/01(木) 04:18:24.20ID:siIxmZ+Uclassの実装とインターフェースの分離が容易にします
プログラムの字面の変更なしで
後から小細工ができます
言語仕様に内包されたパッチ機能?w
>>293
十分だと思います
後から改変するとき小細工が出来て便利なのかな?
0295デフォルトの名無しさん
2016/09/01(木) 06:05:34.36ID:quvSlm2c0296デフォルトの名無しさん
2016/09/01(木) 07:26:09.87ID:8Xtys+zE手間変わらなくね?
0297デフォルトの名無しさん
2016/09/01(木) 07:37:27.71ID:d6w4LGKMC#のプロパティは超便利で手間が大きく違う
使ってみれば分かるよ
いまだにこんな便利なものが実装されていないJavaはゴミ
0298デフォルトの名無しさん
2016/09/01(木) 08:36:37.64ID:8Xtys+zEいや、使った事あるんだけど…
その上でわからないからトクトクとお願いしてる。
0299デフォルトの名無しさん
2016/09/01(木) 08:44:04.42ID:7t+U5xjY0300デフォルトの名無しさん
2016/09/01(木) 08:45:24.36ID:ZAvvKiiS0301デフォルトの名無しさん
2016/09/01(木) 08:51:59.38ID:8Xtys+zEああ、なるほどね。
意味論として、OOのメッセージとプロパティが、C#のメソッドとプロパティに相当するのか。
言われてみれば当然かも。
あざっす。
0302デフォルトの名無しさん
2016/09/01(木) 09:01:16.42ID:DsNIQM1pいちいちGetなんちゃらSetなんちゃらと書くよりも既読性が上がる
0303デフォルトの名無しさん
2016/09/01(木) 09:39:25.12ID:DsNIQM1p可読性だったわw
0304デフォルトの名無しさん
2016/09/01(木) 09:52:32.53ID:oseS/uHr0305デフォルトの名無しさん
2016/09/01(木) 10:08:05.72ID:d6w4LGKMほんとにC#のプロパティ使ったことあるんですかねえ(笑)
0306デフォルトの名無しさん
2016/09/01(木) 11:42:15.33ID:n+lE1LxE0307デフォルトの名無しさん
2016/09/01(木) 11:57:18.01ID:f8G6zOLb全部メソッドの方が統一感はあると思う。
0308デフォルトの名無しさん
2016/09/01(木) 12:08:36.30ID:n+lE1LxE俺は1対5ぐらいだ。
だからあれば便利というのはわかる。
0309デフォルトの名無しさん
2016/09/01(木) 12:30:21.99ID:LcnNSect手間は結構変わるよ。
まず、getter/setterを普通に定義するのより、
プロパティの方がコード量が単純に減る。
変数名と関数名の一致だとかも考慮しなくていいから、
保守もしやすい。
その上、利用時にはpublicメンバ変数のように使えるから、
呼び出し先のコードもすっきりする。
必須ではないから不要と思うなら使わなければいいけど。
便利機能ってだけだし。
0310デフォルトの名無しさん
2016/09/01(木) 12:31:26.62ID:LcnNSectそれはVBAとかそうだけど、ややこしいからやめてくれw
0311デフォルトの名無しさん
2016/09/01(木) 12:46:32.26ID:d6w4LGKM単純な話こういうことを言ってるんだけど。。。
JavaやC++の場合
private int x;
public getX(){return x;}
public setX(int val) {x=val;}
C#の場合
public int X {get; set;}
手間は1/3以下になってる
ほんとに使ったことあるの?
0312デフォルトの名無しさん
2016/09/01(木) 13:12:08.94ID:+q6YP6fMみんな口々に勝手なこと言うのを
あれもこれもと言語に取り込む
ということをするかしないかというポリシーは
言語が違えば違って当たり前
C#でどうだからC++もどうせよとか
C#でどうだからJavaはゴミとか
そんなにC#が好きならC#だけ使ってればいい
0313デフォルトの名無しさん
2016/09/01(木) 13:23:01.35ID:d6w4LGKM高速性が求められる場面ではほぼ唯一の選択肢だし
他の言語に比べて不便なところがあったとしても、かゆいところに手が届く感は最強だし
0314デフォルトの名無しさん
2016/09/01(木) 13:37:36.32ID:Zz5UEunk0315デフォルトの名無しさん
2016/09/01(木) 13:52:30.49ID:d6w4LGKMget/set時にコードが介入できる
0316デフォルトの名無しさん
2016/09/01(木) 14:51:04.12ID:nGqVI4Wrこれは、あり得ない選択
変数は出来るだけ、狭いスコープに閉じ込めるのが基本
0317デフォルトの名無しさん
2016/09/01(木) 14:52:33.38ID:3wSPfZnR昔見た理屈だと、ゲッターセッターは間に正規化とか突っ込めるからセーフティなんだと。
0318デフォルトの名無しさん
2016/09/01(木) 15:42:38.63ID:n+lE1LxE上段も下段もそれぞれ正しい
0319デフォルトの名無しさん
2016/09/01(木) 16:38:25.17ID:f8G6zOLbc++の場合、表記が違うので入れ替えが大変。
0320デフォルトの名無しさん
2016/09/01(木) 16:52:35.75ID:oseS/uHr0321デフォルトの名無しさん
2016/09/01(木) 17:03:57.26ID:d6w4LGKMそういう場合も多いかもしれないけど、.Net環境においてはpublicプロパティにすることによる恩恵は多々ある
例えばDataGridViewに内容を表示するときなど
0322デフォルトの名無しさん
2016/09/01(木) 18:10:45.91ID:3cPIMSrPpublic変数じゃ、変更されたタイミングで描画をアップデートするみたいな処理がやりにくくなる
needUpdateViewみたいなフラグをtrueにできるだけでも、getter/setterはあったほうがいい
単なる構造体に近いようなクラスでも、データの不整合を起こさないようにバリデーションが行えるという意味では重要
後から値の範囲を制限したくなるとか、複数の変数間で整合性のとれないケースを排除したくなるということはよくある
例えば、Personクラスが初めは性別と名前しかなかったところを、そこに「父」「母」「息子」「娘」みたいな属性を付けたくなったら、性別女で「父」は弾きたくなる
public変数だったらこれはできないけど、setter経由であればできる
「親」「子」にして性別と合わせて計算すればいいとかいう話があるかもしれんが、余談だがその場合はgetterで男女+親子の属性で「父」とかを取り出すことができるね
0323デフォルトの名無しさん
2016/09/01(木) 18:27:41.58ID:zfFV4MMV0324デフォルトの名無しさん
2016/09/01(木) 18:41:33.44ID:L3a4bYLCそれは利用者の予期を裏切るような実装をするなって話であって、
ゲッタセッターならよくてプロパティーではだめだって話じゃないと思うけど
0325デフォルトの名無しさん
2016/09/01(木) 19:29:54.38ID:quvSlm2cC++も11以降がんがん新しい要素取り入れてるんだから、
今の仕様が絶対的なものじゃないぞ。今の仕様を絶対視するのは宗教だ。
0326デフォルトの名無しさん
2016/09/01(木) 19:36:30.23ID:qC9ojyjS同性婚の夫婦が養子をとった時に破綻する先見性のない設計ですね w
0327デフォルトの名無しさん
2016/09/01(木) 19:46:48.63ID:zfFV4MMV参照とって書き換える関数に渡したらどうなるんだとか考えると、変数っぽく使えるのは混乱招くだけのような。
0328デフォルトの名無しさん
2016/09/01(木) 20:02:06.91ID:f8G6zOLb不要な汎用化じゃね?
必要になってから修正でいいだろ。
0329デフォルトの名無しさん
2016/09/01(木) 20:16:20.03ID:qC9ojyjSネタに突っ込むならもう少し面白いやつ頼むわ
0330デフォルトの名無しさん
2016/09/01(木) 20:31:55.38ID:n+lE1LxEちょっともにょもにょする。
0331デフォルトの名無しさん
2016/09/01(木) 20:40:39.28ID:n+lE1LxE0332デフォルトの名無しさん
2016/09/01(木) 21:41:16.10ID:quvSlm2cC++でプロパティ導入するなら、getterの戻り値は参照かconst参照のどちらかに制限すれば、
その辺の問題は解決しそう。
0333デフォルトの名無しさん
2016/09/01(木) 23:31:36.63ID:kyBhPm5k実行速度とか気にせずに気楽に使ってしまいやすい、なんて弊害も多少あるみたいね。
0334デフォルトの名無しさん
2016/09/01(木) 23:49:26.27ID:VuYRfyfhフラグをプロパティ化してどうのこうのとか言ってるやついたけど、参照透過性なくなって状態遷移図保守の雇用を産みだしてるだけ
0335デフォルトの名無しさん
2016/09/01(木) 23:55:31.16ID:quvSlm2c例えばWindowクラスとかどうすんの。メンバ変数変えられないWindowクラスとか欠陥品でしょ。
0336デフォルトの名無しさん
2016/09/01(木) 23:55:52.32ID:oRYPM1bK言いたいことはわかるが、 外からの属性アクセスをやめたとしても、
実際に内部状態が変化するなら参照透過ではないよな?
0337デフォルトの名無しさん
2016/09/01(木) 23:58:42.81ID:VuYRfyfhお前がWindowクラスを書くのは自由だけど、C++なんだから数値計算ライブラリとかを想定して書けよ
>>336
もちろん
0338デフォルトの名無しさん
2016/09/02(金) 00:04:47.23ID:q6GNZ6RD否定されてから急に話題を限定し出すってのは一番見苦しいパターンだぞw
素直に間違いを認めろよ。数値解析だっていくらでもそういう事例あるだろ。
0339デフォルトの名無しさん
2016/09/02(金) 00:23:31.33ID:dxT5btnL設計に時間をかけられるときはhetter/setterは減るだろう、ってだけ。
0340デフォルトの名無しさん
2016/09/02(金) 00:25:04.39ID:dxT5btnL〇 getter
0341デフォルトの名無しさん
2016/09/02(金) 00:32:46.64ID:wMSGanuZゲッターはSize()、
セッターをSetSize()にして
Get省略してる
0342デフォルトの名無しさん
2016/09/02(金) 00:50:46.08ID:VaOayOrf自分はSetも省略する
たまに引数の関係でできない時もあるけどさ
0343デフォルトの名無しさん
2016/09/02(金) 04:12:21.27ID:+CUdjKtm0344デフォルトの名無しさん
2016/09/02(金) 04:38:51.30ID:17n5VyUh0345デフォルトの名無しさん
2016/09/02(金) 06:31:01.77ID:96M6CE+eああ、引数の違いを利用すればsetもgetも省略できるのか。
int value(int val); ... メンバvalueの値の設定
int value(); ... メンバvalueの値の参照
同じ関数名で機能の異なるものを作るのは危険、
ということから思いつきもしなかったけど、
この使い方なら便利で有用かも知れないな。
0346デフォルトの名無しさん
2016/09/02(金) 07:16:35.65ID:Vf4h0u1D> int value(int val); ... メンバvalueの値の設定
なぜに戻り値?
0347345
2016/09/02(金) 07:33:47.21ID:96M6CE+e値の範囲制限とかする場合に、
戻り値に「実際に格納された値」を入れて返す。
あと瑣末なことだけど、
cout << a.value(val) << endl;
みたいに格納しつつ値も使う、ができてちょい便利。
0348デフォルトの名無しさん
2016/09/02(金) 07:35:34.05ID:MC2dvnuP0349デフォルトの名無しさん
2016/09/02(金) 07:36:05.31ID:sd/G3GoC0350デフォルトの名無しさん
2016/09/02(金) 07:49:11.95ID:Vf4h0u1D> 戻り値に「実際に格納された値」を入れて返す。
こっちはまだわからなくもないが
> 格納しつつ値も使う、ができてちょい便利。
みたいな設計はどうかと思う
0351デフォルトの名無しさん
2016/09/02(金) 08:01:45.25ID:/uIui9G6(a = b) = c;
みたいな20世紀の設計思想だな
0352デフォルトの名無しさん
2016/09/02(金) 08:01:48.98ID:5Aji0+2+メソッドチェーン出来て便利だよね。
0354デフォルトの名無しさん
2016/09/02(金) 08:44:56.31ID:OksuLk+6a.val(b.val() + c.val()) みたいなやつ
というかどうしてもプロパティが欲しけりゃ演算子オーバーロードで真似っこできるじゃん
0355デフォルトの名無しさん
2016/09/02(金) 08:48:54.95ID:xzsbRhmnプロパティ分かってない奴か? コードを示して見ろ。
0356デフォルトの名無しさん
2016/09/02(金) 09:12:04.14ID:+CUdjKtmこんな感じか?
0357デフォルトの名無しさん
2016/09/02(金) 09:14:47.55ID:OksuLk+6ググれば普通に出るが?
なんでそんなに必死なの
http://boost.2283326.n4.nabble.com/the-best-possible-c-properties-implementation-tt2626498.html
0358デフォルトの名無しさん
2016/09/02(金) 09:20:57.20ID:OksuLk+6そうね、そういう感じ
0359デフォルトの名無しさん
2016/09/02(金) 10:36:49.94ID:AFnhG1K/無理やりオーバーライドできるようにしなくていいよ。
既にコードも必要以上に複雑化しててgetter/setterの方がマシなレベルだし。
0360デフォルトの名無しさん
2016/09/02(金) 12:07:39.19ID:+CUdjKtmNVIって知ってる?
0361デフォルトの名無しさん
2016/09/02(金) 12:09:10.62ID:rUpx5Cs1タイプ量の問題ならマクロで解決出来るし。
0362デフォルトの名無しさん
2016/09/02(金) 12:26:51.71ID:6Qab/oE8これからもどんどん新しい機能を取り入れてどんどん
わけがわからなくなるといい。
0363デフォルトの名無しさん
2016/09/02(金) 12:41:00.31ID:1fpVQ5H80364デフォルトの名無しさん
2016/09/02(金) 12:49:08.18ID:6Qab/oE8いまさら後戻りはできない。
0365デフォルトの名無しさん
2016/09/02(金) 18:00:48.43ID:96M6CE+e現在C++にないから不要な機能だ、と突っ張るのは危険かも知れないよ。
いつか「次の規格から『C#のプロパティ』と同様の機能が追加」と
発表されるかもしれない。これまでもそうやって肥大化してるじゃない。
0366デフォルトの名無しさん
2016/09/02(金) 18:28:49.74ID:qjeLwgBZC#のプロパティは言語的にメソッドとは違うものとして認識出来るようになっている
そこから様々な便利さが出てきている
0367デフォルトの名無しさん
2016/09/02(金) 19:27:06.33ID:nL/2u0CXマクロで出来ることではなく、
マクロに頼っていたことを、
マクロを使わずに出来るようにしてきたんだよ。
スコープに従わないオブジェクト指向の敵との戦いだ
■ このスレッドは過去ログ倉庫に格納されています