C++相談室 part133

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1fcf-H1rY)
垢版 |
2017/11/24(金) 16:52:50.43ID:WoNXR2ax0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part132
http://mevius.5ch.net/test/read.cgi/tech/1507561894/

このスレもよろしくね。
【初心者歓迎】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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/12/04(月) 19:27:49.25ID:I5+tBH1vM
拡張メソッドってデコレータパターンで充分なのに、なんで最近の言語には結構ついてんだろ。
2017/12/04(月) 19:43:03.25ID:ESsPBxjD0
>>292
>>44-45
結局のところ、std::stringstream を使うべきだという結論になりました。(std::stringstream は今回初めて知った)
教科書本文(64ページ、項4.2.3、70ページ、項4.5)
https://ideone.com/F761bo

73ページの練習問題4-5の方は
https://ideone.com/H9iE4j

このように >>42 は多大な努力を強いられる教科書ですので、お勧めです、強くなりたい人はどうぞ
私はもう強くなくてもいいから、この本はもういいです…

教科書をお持ちでない人には関係ない話ですみません
296デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/04(月) 21:39:45.95ID:k2OIwnad0
>>282
2017/12/04(月) 21:40:55.38ID:gpGY1qga0
ん?
2017/12/04(月) 22:43:49.08ID:5AQkRrK70
>>285
別に驚くほどのことじゃないし…
関数のインライン展開と、同じ機能の非インライン関数の存在は両立する
>>284の規定は関数のアドレスをとられたときのため用
2017/12/05(火) 10:37:05.67ID:x6DQdw1l0
>>151
template の話もお願いしていいですか?
型安全を優先するあまりに instantiate(これいい訳がないね) してまで、という思考と void * を許してしまう思考の両方について、比較していただくとうれしいんですけれども
2017/12/05(火) 10:45:00.72ID:x6DQdw1l0
>>168
std::make_shared はあっても unique 版はない、とかなんとか、そこらへんが徹底されていない、とか、確かあったような気が
2017/12/05(火) 10:50:30.93ID:x6DQdw1l0
>>150-152
ファイルのopen/close とか、RAII /デストラクタが Java にもあればなあ、と思っています。
あと、Java の syncronized って、結局、テキトーなダミー変数を mutex 代わりにしちゃう、とかありません?
2017/12/05(火) 10:53:52.88ID:x6DQdw1l0
>>115
古来ゆかしき Boehm GC を思い出しました。これ、C++11 later とかの対応はどうなんだろう?
http://www.hboehm.info/gc/ よくわからん…
2017/12/05(火) 10:58:49.04ID:x6DQdw1l0
>>101
>K&Rも「関数ポインタも使えるよ」としか書いて無い。あれはもっと力説されて然るべきだった。

これが本題かな?
いや、関数ポインタってそんなに特筆すべきものだったかな…むしろ setjmp()/longjmp() の方がインパクトが、ってこれはexception として広く採用されていましたっけね
いや、関数ポインタってコールバック(とvtable)は別として、何か使えるネタが他にあるかなって考えてました、今のところ思いつかないな…
2017/12/05(火) 11:06:41.81ID:x6DQdw1l0
>>99
>(instance.method()とstaticMethod(instance)の実行時の違いがほぼ無い、
うーん、Java で、これでもか、これでもか、と this が null でないことをチェックするのを読んだことがあります。
C++ だと(virtual でなければ)普通に this = 0 にして this->method() できちゃうんですが、この this の null チェックって、広く行われているのでしょうか?http://codepad.org/gtEBWFKR
2017/12/05(火) 11:20:19.80ID:x6DQdw1l0
これでおしまい
try〜catch はいいとして、finally って使いにくい、というか使い方がわからないんですが、finally って意味あるんでしょうか?
2017/12/05(火) 12:10:12.56ID:4pWc4df5r
> RAII /デストラクタが Java にもあればなあ、と思っています

RAIIは7年前にジャバに入った筈だが
何を言っているのだろうか
2017/12/05(火) 18:56:58.67ID:+5IMShlD0
>>305
C++ 的にはなるべくデストラクタで後始末がつくようにやれというスタンスっぽい
2017/12/05(火) 19:00:20.98ID:+5IMShlD0
>>304
C++ ではヌルポインタからメンバ関数を呼び出すのは未定義だよ。
メンバ関数内でデータメンバにアクセスする要素がなかったとしても未定義。
2017/12/05(火) 19:12:28.94ID:x6DQdw1l0
>>308
え!
2017/12/05(火) 19:18:52.02ID:EmfbEE5b0
this->method()は(*this).method()と等価で、ぬるぽに*適用したらその時点で未定義だからアウト
2017/12/05(火) 19:33:35.46ID:EFbqYV3B0
未定義だけどvirtualじゃなきゃ大抵動く
だからNULLチェックも意味がある
2017/12/05(火) 19:58:57.51ID:U9JLSPtA0
thisをNULLチェックするようになったらそれはもう終わってるコード
2017/12/05(火) 20:02:17.22ID:EFbqYV3B0
終わってるヤツでも使えるようにする
よくあること
314デフォルトの名無しさん (ワンミングク MM7a-o8PC)
垢版 |
2017/12/05(火) 20:52:26.72ID:sgxJpWORM
>>313
呼び出されなくても泣くなよ
2017/12/05(火) 20:53:39.04ID:TKR/EMkrM
>>305
catchの中で再スローしてもとにかくリソースを解放したいとか普通にあるでしょ
2017/12/05(火) 21:07:41.41ID:njWV82p8M
>>304
俺はしない

以上!
2017/12/05(火) 23:32:01.27ID:U9JLSPtA0
>>315
RAIIを徹底すればそんな危なっかしいことは不要
2017/12/05(火) 23:35:55.54ID:+TIDOo7u0
>>309
自分にレスすんなよ
見てて恥ずかしいだろ
2017/12/05(火) 23:52:38.14ID:U9JLSPtA0
>>300
std::make_uniqueがあるだろうが(C++14)
320デフォルトの名無しさん (ワッチョイ 59e3-HgL3)
垢版 |
2017/12/05(火) 23:55:11.50ID:WoyHGfNJ0
返答を期待しないでただ聞いて文句言ってもらいたんですけど

03以来久し振りにc++いじってます
17だか20の最新仕様も未だにclassでgetter/setter定義しなきゃいけない仕様なんですかね?
C#のpropertyがあれば便利と思うんですけど。今あるか知りませんが

どうなんでしょ?今後の仕様も導入予定なし?

おやすみなさい
2017/12/06(水) 00:03:17.02ID:nXK3hnHv0
そもそも状態を露出するな
2017/12/06(水) 01:18:56.49ID:s33DVBsR0
>>311
いや、俺は意図通りに動かない場合にガチで遭遇したことあるからこれはホントにお勧めしない。
2017/12/06(水) 01:21:27.27ID:+0bHqE6f0
>>320
そもそも、せったげったってそんなに重要か?
2017/12/06(水) 01:48:19.95ID:K0RLdWNW0
>>311 https://wandbox.org/permlink/i6CwiXS4NMgpintS
2017/12/06(水) 02:05:35.10ID:s33DVBsR0
一応 >>324 を解説しておくと、 this が真のときはもちろん真だし、
this が偽 (ヌル) のときは未定義なのでどういう挙動をしてもかまわないので真と解釈してもええやろという超推論で常に真として扱われる。
326デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
垢版 |
2017/12/06(水) 04:07:36.86ID:hjP5HWFz0
++thisってやるとどうなるんだろうねえ。
327デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/06(水) 05:07:17.55ID:yhpve1PE0
できないよ
thisは常にconst修飾されている
禿本1stではthisへの代入があったんだけどね
2017/12/06(水) 07:19:10.64ID:Fjj6BXu50
>thisは常にconst修飾されている

それは規格のどこに書いてあるのですか
329デフォルトの名無しさん (スプッッ Sdea-gD61)
垢版 |
2017/12/06(水) 08:02:56.90ID:vAzWmOhld
thisってprvalueじゃないのか?
2017/12/06(水) 08:25:21.60ID:ROyOilcp0
This is a pen.
2017/12/06(水) 08:33:58.89ID:BltAOSs70
ISO、C++17の仕様「ISO/IEC 14882:2017」を発行
https://mag.osdn.jp/17/12/05/171500

「ISO/IEC 14882:2017」
https://www.iso.org/standard/68564.html
332デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/06(水) 10:56:56.20ID:yhpve1PE0
>>329
ご指摘どうも
struct X
{
void f()
{
decltype(auto) that(this);
that = nullptr; //ok
}
void g()
{
X* const it(nullptr);
decltype(auto) that(it);
that = nullptr; //error
}
};
確かにそのようで
333デフォルトの名無しさん (ワッチョイ a580-o8PC)
垢版 |
2017/12/06(水) 11:12:02.00ID:J84WjEud0
それはメンバー関数の修飾によっても変わるやろ
334デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/06(水) 11:21:40.65ID:yhpve1PE0
void f() constのことを言っているなら見当違いだが
335デフォルトの名無しさん (スプッッ Sdea-gD61)
垢版 |
2017/12/06(水) 11:44:06.58ID:vAzWmOhld
*thisじゃなくてthisのことだよね?
何かで「const pointerである」って読んだことあるような気もするけど、
そもそもprvalueにしか思えない。
336デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/06(水) 12:20:51.70ID:yhpve1PE0
this = だの &this なんてことは考えもしないので気がつかなかった
2017/12/06(水) 13:26:30.44ID:+UwbONVA0
this is it
338デフォルトの名無しさん (ワッチョイ 5d78-ToxZ)
垢版 |
2017/12/06(水) 16:04:03.08ID:S418wH960
this, this... this...
2017/12/06(水) 18:31:30.07ID:Kh6EF+Se0
=0とかじゃなくてpureとかそのまま書ければいいのに
そもそもなんで0入れるんだ
2017/12/06(水) 20:25:22.49ID:EpXMgW7A0
vtblの関数ポインタをNULLにセットするっていうK&R時代の発想で決まった文法
2017/12/06(水) 20:29:30.14ID:EpXMgW7A0
独自拡張で0の代わりに関数ポインタ代入できるようにした糞コンパイラと
それ使ってイベントハンドラかなんかの設定するようになってる糞システムが
なんかあったような気がするけど誰か覚えてない?
342デフォルトの名無しさん (ワッチョイ a66e-hJGX)
垢版 |
2017/12/06(水) 21:00:00.17ID:yhpve1PE0
>>340
実際には存在し得ない抽象クラス単体オブジェクトが指すためのvtableな
bcc32のバグで存在し得たことはあるが
2017/12/07(木) 01:28:26.94ID:lJwR2NaH0
=0、漏れはしゅき!!!!1!!!!!11!

キーワードを増やさなくて済む
切り札は最後までとっておくべきものじゃ
2017/12/07(木) 01:56:58.07ID:lJwR2NaH0
つかpureみたいな柔弱で恥ずかしい感じのキーワードを追加してくれなくて本当に良かった
2017/12/07(木) 02:03:07.27ID:5gbe7aWB0
ピュア関数の提案は出てたよ。最適化に効くとかで。
2017/12/07(木) 02:13:17.50ID:ETsKWPG+0
ピュアプリズム!
347デフォルトの名無しさん (ワッチョイ 5778-T1Xs)
垢版 |
2017/12/07(木) 02:18:10.34ID:clrrPlpA0
C++98だかでポインタ値にNULLじゃなくて0を使うのが推奨されていた頃の名残じゃないかな
の割にはnullptrを指定するとエラーになるけど
2017/12/07(木) 02:43:01.31ID:vxJqQn/b0
文脈依存キーワードを導入しちゃったからな。
pure も有りといえば有りな気はしないでもない。
2017/12/07(木) 19:18:50.53ID:TKFMtTzr0
pure関数って状態を持たない関数であって純粋仮想関数とは別物だぞ
2017/12/07(木) 19:49:26.48ID:5gbe7aWB0
>>347
標準委員の人がそういう意味じゃないよ。適当に決められたんだよ。って言ってた。
2017/12/07(木) 20:45:51.07ID:G7lyLovKM
>>349
この話の流れで virtual pure function でないと思ってるお前が不憫だよ...
2017/12/07(木) 22:05:02.33ID:lJwR2NaH0
=0は最初ボーランドが勝手に実装した、とどこかで読んだが
じゃあ=0より前のC++には純粋仮想関数は無かったのやろうか…
2017/12/07(木) 22:43:46.61ID:lJwR2NaH0
ていうか
 class Foo {
public:
void someMethod() { }
};
と書くしかなかったものが
 class Foo {
public:
void someMethod() = 0;
};
になったのだとしたら
文字数的にもバランスがとれた良い追加構文
354デフォルトの名無しさん (ワッチョイ ff6e-5CBX)
垢版 |
2017/12/08(金) 07:14:19.07ID:zfye+4U00
>>353
そこは俺もそう思う
しかし=0;なのにvirtualが必須なのはイヤ
基底指定子にpublicがいちいち必要なのと同じくらいに
2017/12/08(金) 08:40:57.49ID:t5VCrWbM0
ダダこねるな
2017/12/08(金) 10:07:38.22ID:Z3siquAKd
publicが嫌ならstructで宣言しろよ
2017/12/08(金) 10:07:41.82ID:2Zvn0bTbp
>>351
pure virtualだろ?virtual pureってなんだよ
2017/12/08(金) 10:10:30.07ID:vOIFbJvh0
ピュアトゥインクル!
2017/12/08(金) 13:00:32.45ID:PXTxgSdcM
>>357
すまん、そんなアホなところにまで突っ込まないとダメなほど必死だとは思わなかったよ w
2017/12/08(金) 18:17:55.92ID:eC9D+0x50
必死なのはお前だろ
誰と同一人物だと思ったんだw
俺この話に参加したの初めてだぞ
2017/12/08(金) 18:29:46.65ID:eC9D+0x50
ていうか>>349>>345宛てじゃねーの?
それを踏まえて文脈依存うんぬんだと思うが
2017/12/08(金) 20:49:15.62ID:oKg6KkSA0
質問があります。
コンパイラはMicrosoft(R) C/C++ Optimizing Compiler Version 19.12.25830.2 for x86
class A {
public:
explicit A( void ) {}
};
struct B {
A a;
};
int
main( int, char ** )
{
B b;
B b2( {} );
B b3 = {};
B b4{};
return 0;
}
上記のソースをオプション/std:c++latestを付けるとエラー、つけないとエラー無しになります。
対処だけだったらAのコンストラクタからexplicitを取れば良いのですが、
何故エラーになるのかがイマイチ理解できていません。
C++17の波括弧初期化の型推論の新規則あたりがそれっぽいですがその辺を読んでも理解できていません。
(そもそも引数無しのコンストラクタにexplicitを何故付けるのかって突っ込まれそう)
2017/12/08(金) 21:05:07.58ID:5s0/Hyw7d
今時なんで32ビットなんて使うんだろ?
2017/12/08(金) 21:19:10.75ID:t5VCrWbM0
>>362
エラーメッセージ読めねーのか?
2017/12/08(金) 21:25:34.24ID:2vsjK8u+0
ベイトレのatomが32bitという負債
366320 (ワッチョイ b7e3-qmOZ)
垢版 |
2017/12/08(金) 23:32:07.03ID:uQLcRAb10
前にgetter/setterプロパティ書いた者だす
getter/setterは有効な回答得られず

03→17/20でも、例えば
     int& Status() { return m_status; }
const int& Status() { return m_status; } const
の二重定義必要?

おやすみなさい
2017/12/08(金) 23:52:39.34ID:IFoyYnlC0
そんな糞みたいなgetter書くくらいならpublic変数にしたほうがまし
2017/12/09(土) 00:00:04.12ID:jyWlwvil0
>>360
5chは初めてか?
ちょっと肩の力抜けよ
2017/12/09(土) 00:06:55.18ID:CGhksCFV0
プロパティー使いたいならエンバカ
2017/12/09(土) 00:30:19.70ID:/OGT/7c/0
そもそもプロパティをそのまま露出すんなって
371デフォルトの名無しさん (ワッチョイ 5778-T1Xs)
垢版 |
2017/12/09(土) 00:37:11.06ID:t6DuUCjM0
hage.sizeof みたいな書き方があってもいいけど、別になくてもいいからな
話は上がっているんだろうけど、優先順位はかなり低いと思うね
2017/12/09(土) 00:48:53.78ID:/xTkL2Yo0
>>366
constバージョンだけでよくない?
何で内部状態を他人に書き換え許可するのさ。
2017/12/09(土) 02:05:41.93ID:X5cpE3G30
>>368
>>359に言え
2017/12/09(土) 08:40:17.40ID:jyWlwvil0
夜中まで粘着 w
2017/12/09(土) 11:10:57.47ID:VQtjhM8H0
>>367
>>366のgetter/setterの中身はあくまでサンプルなのでは…

>>373
いちいちメソッド呼び出しの度に状態を引数渡しするほうが内部状態の露出として醜悪かもしれん…

つかデータメンバの書き換えはデータメンバの書き換えだからNGというものではなくて、
内部状態の整合性が保たれれば何だって良いんじゃ…
データメンバ直書き換えでなくsetterなら整合性をチェックしたり与えたりするチャンスがある
(あるいは排他制御とかやることもある…まあ慎重に考えたらsetterでやるよりロック回数が少ない方法がたいてい見つかるが、
2017/12/09(土) 11:13:16.09ID:VQtjhM8H0
アンカーミスった、
誤: >>373
正: >>372
2017/12/09(土) 12:28:24.94ID:IHtyR51x0
>>366 の実装はサンプルにしてもありえないだろう。
一度呼ばれて参照を保存されたら、変更を制御できなくなる。

int& status = a.Status();
status = 2;
378デフォルトの名無しさん (ワッチョイ 9780-yV1O)
垢版 |
2017/12/09(土) 13:28:08.16ID:xT8UfS000
>>377
それな。
中身だけでなく外見(インターフェース)も糞。かつそのインターフェースなら例外なく中身も糞になる
2017/12/09(土) 13:40:30.88ID:JczXMZr10
ここでgetter/setter言ってるのは例外なくどうしようもない低能だから無視してあげて下さい
2017/12/09(土) 14:04:38.96ID:Mc+Fg8lHd
int mydata() const; // getter
void mydata(int data); // setter

こういう感じの下駄瀬田は道南?
2017/12/09(土) 14:29:29.91ID:VQtjhM8H0
>>366のgetterの&を見落としていたorz
m_dataへのmutableなポインタを返すのではm_dataのgetterとは言えぬ
2017/12/09(土) 16:16:46.64ID:85CJr7Ot0
メンバ変数hogeにgetHoge,setHogeなんて名前の下駄雪駄を
機械的に作ろうとしてる事自体が間違いの可能性を考えろ

class Window
{
 int width, height;
 ...
 
 //まちがい
 int getWidth() const;
 int getHeight() const;
 void setWidth(int w);
 void setHeight(int h);

 //せいかい
 Size getCurrentFrameSize() const;
 void resize(int width, int height);
};
2017/12/09(土) 16:31:11.01ID:eDExTF/q0
>>382
>>320は、C#の機能があると便利ですねー。セッター/ゲッターが毎回定義するの?っていうお題じゃねーの?
どっからWindowやら、Sizeが出てきた?
2017/12/09(土) 16:38:09.40ID:85CJr7Ot0
クラス内部状態の変更は意味のある操作単位として外部に公開すべきであって
むやみに内部の変数を下駄雪駄として露出すんなっていうつもりだったんだが難しかったかな?
2017/12/09(土) 16:56:33.96ID:eDExTF/q0
>>384
そんな分かりきったことを議論することではないだろ。
C++の規格が新しくなってsetter/getterは従来道理なの?が質問。
set/getするときは、直の変数の読み書きの代用だけではななく、何かの処理をしたりして公開/制限付き公開するものじゃねーの?
2017/12/09(土) 17:16:31.79ID:rvn5Lgi+M
>>383
だからプロパティ単体で読み書きするのが常に正しい訳じゃないでしょってこと

> どっからWindowやら、Sizeが出てきた?
一例だってことわからないの?
387デフォルトの名無しさん (ワッチョイ 9780-yV1O)
垢版 |
2017/12/09(土) 17:25:01.50ID:xT8UfS000
>>385
従来通りだよ。
何がしたいのかはっきりさせないからこうなるんだよ。
メンバーへの代入のような記述でメンバー関数呼び出ししたいということか?
2017/12/09(土) 18:54:12.14ID:WISiBPL1d
昔どっかで下駄雪駄をクラスにして公開する方法が書いてあったな。
面白そうだったけと使おうとした事はなかった。
389デフォルトの名無しさん (ワッチョイ 9780-yV1O)
垢版 |
2017/12/09(土) 19:16:55.95ID:xT8UfS000
単にデータメンバー指定したらgetter setter相当のメンバー関数を自動生成するような機能が欲しいというなら他のやつが言うように思考停止したバカしか欲しがらない機能
EなんとかとかいうIDEには付いてるらしいが
2017/12/09(土) 20:17:03.24ID:FTIoFrRr0
理想はわかるけど、ある程度の規模のコードを書けば何だかんだでsetter/getterはけっこう書くだろ
2017/12/09(土) 20:17:55.36ID:qp4HeFcwM
.netのPropertyは実際のオブジェクトがバッキングフィールドってとこに完全隠蔽されることがメリット
C++では自動実装は不可能、同じ効果を得るならばpimplパターンでオブジェクトを隠蔽は可というのが答えではないだろうか
2017/12/09(土) 20:18:50.11ID:qp4HeFcwM
>>390
getterはともかくsetterは書かない
2017/12/09(土) 20:26:30.08ID:VQtjhM8H0
setter/getter批判論者は何を批判しているのかいまいちわからん…
class SomeWidget { // GUIのパーツか何か
 Color m_FgColor; // 前景色
 Color m_BgColor; // 背景色
 ...
};
とゆークラスがあったとして、
 void SomeWidget::setFgColor(Color color) { m_FgColor = color; }
 void SomeWidget::setBgColor(Color color) { m_BgColor = color; }
というのはsetterだからダメで、意味的にまとまりのある
 void SomeWidget::setColor(Color fgColor, Color bgColor) { m_FgColor = color; m_BgColor = color; }
とかにしないとダメだとかそーいう主張?

スゲーいらんお世話な気が…
2017/12/09(土) 20:43:02.98ID:X5cpE3G30
setter/getter自体を批判してんじゃなくて
自動生成をC++に求めるのを間違いだと言ってるだけだと思うが
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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