!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part164
https://mevius.5ch.net/test/read.cgi/tech/1683600652/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part165
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ efda-9b8G)
2023/10/31(火) 07:37:38.52ID:+ZyYyqMO0100デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 05:42:41.89ID:3ksfrMrT0 >>99
>int x, y;
>cin >> x >> y;
おk
スマンカッタorz
エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい?
https://blog.emattsan.org/entry/20110819/1313743195
ここまでは分かった気がするが、
ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合
どうやってエラーを呼び出し元に通知したらええんじゃ……
>int x, y;
>cin >> x >> y;
おk
スマンカッタorz
エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい?
https://blog.emattsan.org/entry/20110819/1313743195
ここまでは分かった気がするが、
ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合
どうやってエラーを呼び出し元に通知したらええんじゃ……
101デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 05:50:37.02ID:3ksfrMrT0 クラスFooの入力ストリーム演算子の中で整数を2個読むとして、
std::istream& operator>>(std::istream& os, Foo& obj) {
int x, y;
os >> x >> y;
if (!os.goot()) {
return os; // エラー発生時は単純にreturn os; でおk?
}
obj.m_x = x;
obj.m_y = y;
return os;
}
std::istream& operator>>(std::istream& os, Foo& obj) {
int x, y;
os >> x >> y;
if (!os.goot()) {
return os; // エラー発生時は単純にreturn os; でおk?
}
obj.m_x = x;
obj.m_y = y;
return os;
}
102はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 43c3-KM86)
2023/12/30(土) 08:47:16.28ID:XV37Te4m0103デフォルトの名無しさん (ワッチョイ de63-J7+h)
2023/12/30(土) 13:48:41.88ID:3ksfrMrT0 わかりた
ていうかエラー判定(eofbit以外のビットのセットを判定)なら!os.good()や!os.goot()ではなくて
os.failed()か!osですたね……orz
これらに関して追加の質問が出たら初心者スレに書くわサーセン;;;
ていうかエラー判定(eofbit以外のビットのセットを判定)なら!os.good()や!os.goot()ではなくて
os.failed()か!osですたね……orz
これらに関して追加の質問が出たら初心者スレに書くわサーセン;;;
104デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2023/12/31(日) 20:09:05.68ID:tpduSr4A0 class A{
char buf_[size];
}
このbuf_に任意のオブジェクトをplacement newして使用するのだけど
このオブジェクトをコピーしたりムーブする場合、単純にコピー元のbuf_からコピー先のbuf_にmemcopyしてしまって大丈夫ですか?
char buf_[size];
}
このbuf_に任意のオブジェクトをplacement newして使用するのだけど
このオブジェクトをコピーしたりムーブする場合、単純にコピー元のbuf_からコピー先のbuf_にmemcopyしてしまって大丈夫ですか?
105デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2023/12/31(日) 20:44:02.18ID:bvEcnWMM0 全く大丈夫じゃない
初心者スレからどうぞ
初心者スレからどうぞ
106デフォルトの名無しさん (ワッチョイ 8101-KEYj)
2023/12/31(日) 20:54:11.90ID:NNsdlVTY0 構造体から派生させれば出来るよ
107デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2023/12/31(日) 21:04:16.47ID:bvEcnWMM0 せめてPODと言おう
初心者スレからどうぞ
初心者スレからどうぞ
108はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg)
2024/01/01(月) 00:18:02.48ID:6hyMwo3D0 POD は削除された。
trivially copyable の要件を満たすならその型は memcpy でコピーしてもよい。
std::is_trivially_copyable で判定できるのでどこかに制約を入れておけば安心かもね。
trivially copyable の要件を満たすならその型は memcpy でコピーしてもよい。
std::is_trivially_copyable で判定できるのでどこかに制約を入れておけば安心かもね。
109デフォルトの名無しさん (ワッチョイ 656a-R/a6)
2024/01/01(月) 00:36:03.09ID:an53Mx2V0 削除されたんですか?(バージョンいくつで?)
c++20 で非推奨になった、てのはすぐ調べられたんだけどその先が分からんです
c++20 で非推奨になった、てのはすぐ調べられたんだけどその先が分からんです
110はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 0904-OTTg)
2024/01/01(月) 00:46:07.42ID:6hyMwo3D0 >>109
規格の文面としては C++20 で POD はもう削除されていて POD の概念を使わない形で再編されてる。
std::is_pod はまだある (非推奨) からこれが POD の定義だという意味ではまだあるとも言えるけど。
規格の文面としては C++20 で POD はもう削除されていて POD の概念を使わない形で再編されてる。
std::is_pod はまだある (非推奨) からこれが POD の定義だという意味ではまだあるとも言えるけど。
111デフォルトの名無しさん (ワッチョイ 06a2-M+UX)
2024/01/01(月) 00:46:34.65ID:l/ylj5kb0 アライメント忘れてるぞ
112デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/01(月) 03:01:35.02ID:5pNbZa2B0113デフォルトの名無しさん (ワッチョイ 8101-KEYj)
2024/01/01(月) 03:14:22.37ID:8zoq4UeO0 オワコン名称出してマウント。プークスクス
114はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 03:40:47.98ID:hmX3WjmM0 POD が削除されたかどうかは重要ではなくて、 POD より弱い制約 (trivially copyable) で memcpy が許されるというのが主旨。
その点は C++11 からそうなってる。
その点は C++11 からそうなってる。
115はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 04:06:49.46ID:hmX3WjmM0 「構造体」ってのも C++ 用語的にはイケてないと思うよ。
116デフォルトの名無しさん (ワッチョイ d24b-WshQ)
2024/01/01(月) 04:55:26.71ID:e5pnn2Xx0 アライメントは基本型のどれかと同じアライメント制約に合わせれば良いいということなら
使おうとしているうちで最も厳しいアライメント制約に一致する基本型を含むunionで解決するというのがC言語における伝統的な手法という印象、
C++でunionにしたら(それが可能なメンバのみなら) memcpyは安全とかにはならない?
使おうとしているうちで最も厳しいアライメント制約に一致する基本型を含むunionで解決するというのがC言語における伝統的な手法という印象、
C++でunionにしたら(それが可能なメンバのみなら) memcpyは安全とかにはならない?
117はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/01(月) 05:30:52.12ID:hmX3WjmM0 >>116
コンストラクタや代入演算子がトリビアルであることなどの制約を守れば共用体も trivially copyable になりうる。
(C++ の共用体はコンストラクタやメンバ関数を定義できるがそこらが制限されることになる。)
コンストラクタや代入演算子がトリビアルであることなどの制約を守れば共用体も trivially copyable になりうる。
(C++ の共用体はコンストラクタやメンバ関数を定義できるがそこらが制限されることになる。)
118デフォルトの名無しさん (ワッチョイ 65e8-QK8A)
2024/01/01(月) 14:24:55.17ID:kge3DGj60 char* と long* のコピーは?
119はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-slPv)
2024/01/01(月) 15:31:30.97ID:hmX3WjmM0 ポインタも含めてスカラ型は Trivially copyable
https://timsong-cpp.github.io/cppwp/n4861/basic.types#9
https://timsong-cpp.github.io/cppwp/n4861/basic.types#9
120デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/03(水) 23:34:38.84ID:w4EAqTeZ0 >>112
とりあえず書いてみたけどどうですかね?
template<std::size_t buf_size>
struct A {
private:
struct base_ {
virtual ~base_() {};
};
template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
};
base_* p_;
alignas(alignof(std::max_align_t)) uint8_t buf[buf_size]={0};
public:
A() :p_(nullptr) {};
template <typename F>
void assign(F f) {
if (p_ == nullptr) {
p_ = ::new (buf) derived_<F>{std::move(f)};
}
}
//コピーコンストラクタ
A(A& src) {
p_ = ::new (buf) decltype(src.*p_); //ここが怪しい
};
};
とりあえず書いてみたけどどうですかね?
template<std::size_t buf_size>
struct A {
private:
struct base_ {
virtual ~base_() {};
};
template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
};
base_* p_;
alignas(alignof(std::max_align_t)) uint8_t buf[buf_size]={0};
public:
A() :p_(nullptr) {};
template <typename F>
void assign(F f) {
if (p_ == nullptr) {
p_ = ::new (buf) derived_<F>{std::move(f)};
}
}
//コピーコンストラクタ
A(A& src) {
p_ = ::new (buf) decltype(src.*p_); //ここが怪しい
};
};
121デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 00:44:07.87ID:/FDyuY0i0 decltype(src.*p_)ってbase_なのでダメだろう
122デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/04(木) 00:58:18.81ID:ECF9R1Fj0 ていうか、decltypeで型指定してるだけだからコピーもなにもされてないぞソレ
123デフォルトの名無しさん (ワッチョイ 0644-M+UX)
2024/01/04(木) 02:28:40.49ID:oZapr/U70 std::anyのコードでも読んだほうが早い
124デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 09:11:56.12ID:/FDyuY0i0 A::base_に以下を足してA::derived_で実装し
Aのコピーコンストラクタから呼べば?
virtual base_ *clone (void *p) = 0;
Aのコピーコンストラクタから呼べば?
virtual base_ *clone (void *p) = 0;
125デフォルトの名無しさん (ワッチョイ 6564-QK8A)
2024/01/04(木) 13:26:37.40ID:1KQpMTCj0 void*って、ポインターの先のサイズ未知だよなぁ
126デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/04(木) 17:16:40.43ID:ACseOt7T0127デフォルトの名無しさん (ワッチョイ e95f-pFp4)
2024/01/04(木) 21:53:05.60ID:ACseOt7T0 >>124
こんな感じです?
struct base_ {
virtual base_* clone (void *p) = 0;
virtual ~base_() {};
};
template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
base_* clone (void *p_buf){
return new(reinterpret_cast<derived_<F>*>(p_buf))(f_);
}
};
A(A& src) {
p_ = src.clone((void*)buf);
};
こんな感じです?
struct base_ {
virtual base_* clone (void *p) = 0;
virtual ~base_() {};
};
template <typename F>
struct derived_ : base_ {
F f_;
derived_(F f) : f_{ std::move(f) } {}
base_* clone (void *p_buf){
return new(reinterpret_cast<derived_<F>*>(p_buf))(f_);
}
};
A(A& src) {
p_ = src.clone((void*)buf);
};
128デフォルトの名無しさん (ワッチョイ e1f0-JZT3)
2024/01/04(木) 22:19:16.70ID:ECF9R1Fj0 derived_(F f) ←この時点でムダなコピーが1度発生していることには気付いてる?
129デフォルトの名無しさん (ワッチョイ 9901-r6/T)
2024/01/04(木) 22:21:15.81ID:/FDyuY0i0 >>127
書き込む前にコンパイルしなよ
書き込む前にコンパイルしなよ
130デフォルトの名無しさん (ワッチョイ 651a-R/a6)
2024/01/04(木) 22:41:26.61ID:Dv09vJ7A0 バッファの中にオブジェクトを作れたら、それで何をしたいのかが気になる
131デフォルトの名無しさん (ワッチョイ 0644-M+UX)
2024/01/04(木) 23:21:36.86ID:oZapr/U70132はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg)
2024/01/04(木) 23:35:27.70ID:td6kYpbC0 たぶんやりたいことは std::allocator_traits::construct なのかな
133デフォルトの名無しさん (ワッチョイ 7f7c-JApz)
2024/01/11(木) 04:45:44.72ID:wlSOhq+Y0 例外って全部mainで捕捉すべきかな?
調べてみたら例外が捕捉されずにプログラムが終了する場合スタックアンワインドが起こるかは実装定義みたいなんだけど、それじゃグローバルなオブジェクトのデストラクタが呼ばれないんじゃないかって思って試してみたのよ。
https://ideone.com/wSLZfL
やっぱりデストラクタは呼ばれなかったからリソースリークが起こりうるんじゃないかと思うんだけど、例外に対してはどういう態度でいるべきかな?
A. リソースリークはまずい。だから例外は全部捕捉するべき。
B. 例外はロジック上捕捉する必要があるものだけ捕捉して、それ以外はほっといていい。
C. 例外が捕捉されなければstd::abortが呼ばれるので、コアダンプなりで色々調べることもできる。だからmainで例外を全部握りつぶすようなことはすべきではない。
D. 時と場合による。
例外時の挙動とか仕様とか調べてるうちに頭ぐるぐるしてわけわかんなくなってきた
調べてみたら例外が捕捉されずにプログラムが終了する場合スタックアンワインドが起こるかは実装定義みたいなんだけど、それじゃグローバルなオブジェクトのデストラクタが呼ばれないんじゃないかって思って試してみたのよ。
https://ideone.com/wSLZfL
やっぱりデストラクタは呼ばれなかったからリソースリークが起こりうるんじゃないかと思うんだけど、例外に対してはどういう態度でいるべきかな?
A. リソースリークはまずい。だから例外は全部捕捉するべき。
B. 例外はロジック上捕捉する必要があるものだけ捕捉して、それ以外はほっといていい。
C. 例外が捕捉されなければstd::abortが呼ばれるので、コアダンプなりで色々調べることもできる。だからmainで例外を全部握りつぶすようなことはすべきではない。
D. 時と場合による。
例外時の挙動とか仕様とか調べてるうちに頭ぐるぐるしてわけわかんなくなってきた
134デフォルトの名無しさん (ワッチョイ dff7-1VUN)
2024/01/11(木) 08:40:16.50ID:8oRrkiTZ0 そもそもプログラムが終了してリソースリークするのかな?
メモリー、ファイルハンドル、ソケット、ミューテックスなどのリソースはOSが責任持って解放するよね
どのようなリソースがリークしますか?
メモリー、ファイルハンドル、ソケット、ミューテックスなどのリソースはOSが責任持って解放するよね
どのようなリソースがリークしますか?
135デフォルトの名無しさん (ワッチョイ 7f01-2R+Q)
2024/01/11(木) 08:45:02.51ID:ETJgFBFV0 すべてじゃね?
136デフォルトの名無しさん (ワッチョイ 7f01-2R+Q)
2024/01/11(木) 08:46:53.81ID:ETJgFBFV0137デフォルトの名無しさん (ワッチョイ 7f3a-NF1f)
2024/01/11(木) 09:02:22.25ID:dA95iQ6m0 OS管理なリソースはアプリの終了なんか知らないってのもあるからなぁ
得にドライバ関連とかな
得にドライバ関連とかな
138デフォルトの名無しさん (ワッチョイ dfab-acFs)
2024/01/11(木) 15:30:41.76ID:hAXa3uBd0139デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:09:25.46ID:AWAYnmwT0 今どきのOS使ってたらOSリソースはリークしない
まぁプロセスがゾンビになるのはよくあるが
まぁプロセスがゾンビになるのはよくあるが
140デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:09:51.72ID:AWAYnmwT0 >>137
しったかすんな
しったかすんな
141デフォルトの名無しさん (ワントンキン MMdf-7Pe6)
2024/01/11(木) 20:12:29.21ID:h5T3Zf1WM そもそもアプリ的にデータの不整合とか出るから論外だろう
ファイルやなんかの外部データ使わないなら関係ないだろうけど
ファイルやなんかの外部データ使わないなら関係ないだろうけど
142デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:12:30.15ID:AWAYnmwT0 よくあるのは異常終了時にファイルをフラッシュしておきたいとかだろ
汎用的にこれを実現するのは結構むずい
汎用的にこれを実現するのは結構むずい
143デフォルトの名無しさん (ワッチョイ ff11-Nf4k)
2024/01/11(木) 20:14:10.04ID:AWAYnmwT0 あとコアダンプの観点では例外飛ばさずに即死したほうがいい
144デフォルトの名無しさん (ワッチョイ df5a-XokC)
2024/01/11(木) 21:36:53.22ID:40hQdtQK0 エラーだからって一時ファイル山盛り残して放置しないでください
145デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/11(木) 22:44:37.94ID:wlSOhq+Y0 質問した者だけど
確かに近代的なOSであればリソースの始末はよしなにやってくれるだろうし、「絶対にデストラクタが呼ばれなきゃ困る」って状況でもなければいちいちすべての例外を捕捉する必要はないのかな(毎回ボイラープレートコードみたいに書くのもやだし)
確かに近代的なOSであればリソースの始末はよしなにやってくれるだろうし、「絶対にデストラクタが呼ばれなきゃ困る」って状況でもなければいちいちすべての例外を捕捉する必要はないのかな(毎回ボイラープレートコードみたいに書くのもやだし)
146デフォルトの名無しさん (スッップ Sd9f-d+nK)
2024/01/12(金) 01:18:38.26ID:P05ikaaEd 例外処理って、メモリ破壊やファイルシステム破壊みたいな絶望的な状況を想定しなきゃいけないんだよ。
ファイルに何か書き込んだら他のファイルを壊しちゃうかもしれない、みたいな。
だからファイル関連の操作をしていいのは、ファイルシステム周りの無事を確信できるときだけ。
データを上書き保存とかしていいのは、データとファイルシステム両方の無事を確信できるときだけ。
何も確信できないときは、何もせずに墜ちなきゃいけない。
ってことで例外機構はデフォルトで何もせずに異常終了するようになってるんだよ。
ファイルに何か書き込んだら他のファイルを壊しちゃうかもしれない、みたいな。
だからファイル関連の操作をしていいのは、ファイルシステム周りの無事を確信できるときだけ。
データを上書き保存とかしていいのは、データとファイルシステム両方の無事を確信できるときだけ。
何も確信できないときは、何もせずに墜ちなきゃいけない。
ってことで例外機構はデフォルトで何もせずに異常終了するようになってるんだよ。
147はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-Cx9t)
2024/01/12(金) 02:09:19.72ID:Z8/dVhwe0 理想的には全ての例外はキャッチされるべき。 ただ、現実は理想的ではない。
キャッチするのは対処するためなので想定漏れで思ってもなかったような例外が上がってきた (対処が出来てない) ならそれはバグなんだから検証して修正する必要があるわけだし、検証しやすい形で止まったほうがいい。
C++ ではスタックの巻き戻しの途中で例外を送出したときの挙動は未定義なので通例ではデストラクタから例外を投げないように設計される。
つまりデストラクタでの後始末に失敗したらもうそれを (例外機構の仕組みでは) フォローできない。
想定されてない例外が上がってるときに後始末がちゃんとできずにわけのわからない動作を引き起こしたら検証にも支障がある。
キャッチするのは対処するためなので想定漏れで思ってもなかったような例外が上がってきた (対処が出来てない) ならそれはバグなんだから検証して修正する必要があるわけだし、検証しやすい形で止まったほうがいい。
C++ ではスタックの巻き戻しの途中で例外を送出したときの挙動は未定義なので通例ではデストラクタから例外を投げないように設計される。
つまりデストラクタでの後始末に失敗したらもうそれを (例外機構の仕組みでは) フォローできない。
想定されてない例外が上がってるときに後始末がちゃんとできずにわけのわからない動作を引き起こしたら検証にも支障がある。
148デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/12(金) 09:48:31.22ID:1nCpSyqU0 じゃあ「投げられうるすべての例外に適切な対処ができるのが理想的だが、対処しきれない例外は投げられっぱなしにする(そしてプログラムを即座に異常終了させる)方が、思考停止でとりあえず捕捉しておくよりはまだマシ」ってことになるのかな
みんなありがとう
みんなありがとう
149デフォルトの名無しさん (ワントンキン MMdf-7Pe6)
2024/01/12(金) 09:51:15.81ID:Vmsz+UsIM いやいや、ちゃんとデバッグしろよ
こんなやつとは絶対一緒に仕事したくない
こんなやつとは絶対一緒に仕事したくない
150デフォルトの名無しさん (ワッチョイ 5f4e-1VUN)
2024/01/12(金) 09:58:11.40ID:yLdIK4jH0 ライブラリ書くときはライブラリで対処できない例外は握り潰さずに上位で伝搬させろ!と言われてるよね
アプリも同じだと思う
明確に対処すべきことがあるなら例外をキャッチすればいいし
ないならそのままプロセス落としてOSに任せればいいんでない?
アプリも同じだと思う
明確に対処すべきことがあるなら例外をキャッチすればいいし
ないならそのままプロセス落としてOSに任せればいいんでない?
151デフォルトの名無しさん (ワッチョイ 7f7c-acFs)
2024/01/12(金) 10:01:16.79ID:1nCpSyqU0 投げられっぱなしにするって言い方が不適切だったかな、別に例外のせいでプログラムが実際に異常終了するのを見ても知らんぷりするって意味じゃないよ
実際にプログラムが異常終了したんだったらその都度原因は突き止めて修正するし、そもそもすべての例外に網羅的に対処するのが現実的なときは最初からそうするよ
実際にプログラムが異常終了したんだったらその都度原因は突き止めて修正するし、そもそもすべての例外に網羅的に対処するのが現実的なときは最初からそうするよ
152デフォルトの名無しさん (ワッチョイ df09-dvWY)
2024/01/12(金) 10:06:03.47ID:Umd8uX9b0 try {} catch {}
153はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-TQnC)
2024/01/12(金) 17:12:14.63ID:Z8/dVhwe0 想定される状況には対処しているならどこで想定漏れがあるかはやってみないとわからない。
経験を蓄積し続けるしかしょうがないんだよな。
蓄積がテストケースの形などになっているとより良いと思う。
経験を蓄積し続けるしかしょうがないんだよな。
蓄積がテストケースの形などになっているとより良いと思う。
154デフォルトの名無しさん (ブーイモ MM0f-Nf4k)
2024/01/12(金) 17:26:50.90ID:059LeD4FM 自分の知らないライブラリの奥底からいつ投げられるかわからない例外なんて対処しようがない
かつスタックアンワインドしたらデバッグの手がかり消えるだけ
かつスタックアンワインドしたらデバッグの手がかり消えるだけ
155デフォルトの名無しさん (ブーイモ MM9f-2j6O)
2024/01/12(金) 17:44:35.30ID:bUlwQWI8M setjump()/longjump()
156デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 13:54:58.62ID:rNqWj2dY0 やっぱC++の例外は悪……
構造化例外ならwindbgでコアダンプを開いて!analyze -vで発生源を調べられる(仕組みは知らん
がC++の例外は例外オブジェクトが持ち出した情報が全て……
という印象……
構造化例外ならwindbgでコアダンプを開いて!analyze -vで発生源を調べられる(仕組みは知らん
がC++の例外は例外オブジェクトが持ち出した情報が全て……
という印象……
157デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 14:10:21.49ID:rNqWj2dY0 やっぱ例外というブツは、
アプリケーション領域においてプログラミがいろんなリソースを取り扱うようになった結果、
C言語流に関数の戻り値で起こり得る全てのエラーを網羅してチェックする方法が
現実的でなくなってきたから設けられたブツなので
>自分の知らないライブラリの奥底からいつ投げられるかわからない例外(>>154
すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿
起こりえる全ての例外の処置を書かなければ設計とは言えない主義の人(>>149)は
寧ろ例外の使用をやめてC言語的な書き方で全てのエラーをチェックすべき
(他人様が作ったライブラリが例外を飛ばしてくるのは仕方が無いから全てcatchする
アプリケーション領域においてプログラミがいろんなリソースを取り扱うようになった結果、
C言語流に関数の戻り値で起こり得る全てのエラーを網羅してチェックする方法が
現実的でなくなってきたから設けられたブツなので
>自分の知らないライブラリの奥底からいつ投げられるかわからない例外(>>154
すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿
起こりえる全ての例外の処置を書かなければ設計とは言えない主義の人(>>149)は
寧ろ例外の使用をやめてC言語的な書き方で全てのエラーをチェックすべき
(他人様が作ったライブラリが例外を飛ばしてくるのは仕方が無いから全てcatchする
158デフォルトの名無しさん (ワッチョイ df63-+bVA)
2024/01/13(土) 14:15:12.02ID:rNqWj2dY0 つなみにOSの内部ではすべてのリソースをOSが管理する前提なので例外の出る幕は無い
OSの設計に対して想定外の事象がOS内部で起きるとかあり得ないじゃない
レトロな(しかしメジャーな)OSがC++ではなくC言語で書かれ続けるのはそういう理由
OSの設計に対して想定外の事象がOS内部で起きるとかあり得ないじゃない
レトロな(しかしメジャーな)OSがC++ではなくC言語で書かれ続けるのはそういう理由
159はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f3e-TQnC)
2024/01/13(土) 14:21:37.75ID:3bve4IFf0 何が返ってくるかわからん (ドキュメント化されていない) なら返却値の形になっていても正しく対処できないのは同じだろ。
160デフォルトの名無しさん (ワッチョイ ff18-Nf4k)
2024/01/13(土) 14:37:35.65ID:b/trpwza0 例外だとテストしないドキュメントにも書かないというモラルハザードがおきやすいとは言えるだろう
返り値はエラー体系を自分で定義しないといかんからそうはなりにくい
まぁそれでも失敗を安易にfalseに丸めるどアホは多いけど
返り値はエラー体系を自分で定義しないといかんからそうはなりにくい
まぁそれでも失敗を安易にfalseに丸めるどアホは多いけど
161デフォルトの名無しさん (ワッチョイ ffcf-mfjK)
2024/01/13(土) 15:22:27.34ID:o+zGF69d0 >>157
>すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿
それ一般にはリリース後に起きちゃいけないことでは。プロダクトにもよるが防ぐ努力は必要だと思うがね。
>すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿
それ一般にはリリース後に起きちゃいけないことでは。プロダクトにもよるが防ぐ努力は必要だと思うがね。
162デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:01:30.73ID:H7tsxQrq0 >>138
全選択肢を同時に選ぶって意味に捉えられちゃったかな?
そうじゃなくて、その選択肢自体が同時に適用すべきレベルのものじゃないと思うの
例外をキャッチするって決めたなら、そこには目的があるよね?
設計手順としては目的を決めてから例外を使おうって判断になるわけ
その目的次第だよね?っていうのがD
目的がリソースリーク防止ならA
Aのような目的を達成するために、目的範囲内でB
デバッグ目的ならC
製品等で客の目に見せたくないなどの営業目的があるならCはダメで、のべつまくなしBというのもあるかもしれない
全選択肢を同時に選ぶって意味に捉えられちゃったかな?
そうじゃなくて、その選択肢自体が同時に適用すべきレベルのものじゃないと思うの
例外をキャッチするって決めたなら、そこには目的があるよね?
設計手順としては目的を決めてから例外を使おうって判断になるわけ
その目的次第だよね?っていうのがD
目的がリソースリーク防止ならA
Aのような目的を達成するために、目的範囲内でB
デバッグ目的ならC
製品等で客の目に見せたくないなどの営業目的があるならCはダメで、のべつまくなしBというのもあるかもしれない
163デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:06:09.91ID:H7tsxQrq0 大きな目で全工程トータルを考えると全部の選択肢を適用する必要があるし、適用のしどころが違うと思うってのが>>136の真意でした
164デフォルトの名無しさん (ワッチョイ 7291-Qz6p)
2024/01/14(日) 13:12:37.16ID:H7tsxQrq0 >>148
これが正しいかどうかはおいといて、人命に関わらないなら、自分はその考え方に賛成!
完璧にデバッグしろというのは自動車と医療機器など人命にかかわるものだね
重要度に応じて工数のかけ方が変わってくるので、すべてのソフトウエアで一概にこうしなさいとは言えないかな
そういう意味ではD
これが正しいかどうかはおいといて、人命に関わらないなら、自分はその考え方に賛成!
完璧にデバッグしろというのは自動車と医療機器など人命にかかわるものだね
重要度に応じて工数のかけ方が変わってくるので、すべてのソフトウエアで一概にこうしなさいとは言えないかな
そういう意味ではD
165デフォルトの名無しさん (ワッチョイ 4d34-7Ntv)
2024/01/14(日) 15:16:56.65ID:by9QQMRz0166デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 08:10:14.00ID:Y8oMeLNI0 人命にかかわらない場合であっても、末端の関数が投げる例外の種類を見落としただけでプログラム全体が
いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも
無理ゲーに近い。
なので適当なレイヤーごとにざっくり std::exception をキャッチする造りにしてるな。例外の種類で選択したりはしない。
いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも
無理ゲーに近い。
なので適当なレイヤーごとにざっくり std::exception をキャッチする造りにしてるな。例外の種類で選択したりはしない。
167デフォルトの名無しさん (ブーイモ MM22-7+/r)
2024/01/15(月) 11:54:06.38ID:0QYW1wwzM キャッチしてその後どうすんの?
168デフォルトの名無しさん (ワッチョイ 41f0-u9am)
2024/01/15(月) 18:12:26.71ID:FtZTeDOW0 何するか思い付かないならPG辞めろ
貴様には向いてない
貴様には向いてない
169デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 18:20:04.00ID:Y8oMeLNI0 >>167
そのtryブロックの処理が失敗したものとして処理を続ける。
そのtryブロックの処理が失敗したものとして処理を続ける。
170デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 18:42:14.36ID:Lgn9c/GO0 テストケース爆増じゃん
171デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 19:20:39.72ID:Y8oMeLNI0 なんで爆増?
172デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 20:40:13.04ID:Lgn9c/GO0 その失敗する処理の具体例言ってみて
173デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 22:10:56.13ID:Y8oMeLNI0 んでテストケース爆増の話は?処理の具体例次第で話が変わったりするとか?
174デフォルトの名無しさん (ワッチョイ 46ea-7+/r)
2024/01/15(月) 22:45:20.95ID:Lgn9c/GO0 依存関係のあるものに影響あるのは当たり前
原因不明の例外起こっても突き進むんだったら擬似的にそのケース作ってテストするわな普通は
出し渋るなら別にださなくていいよ
参考にならなさそうだし
原因不明の例外起こっても突き進むんだったら擬似的にそのケース作ってテストするわな普通は
出し渋るなら別にださなくていいよ
参考にならなさそうだし
175デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ)
2024/01/15(月) 23:24:57.00ID:Y8oMeLNI0 それはいったい何のテストなんだろう。原因不明の例外を首尾よくキャッチできるかどうかテストしろと言っているんだろうか。
そもそもそういう例外を想定するなら、スルーして影響範囲が広がる方がテストは厄介になると思うがなあ。
そもそもそういう例外を想定するなら、スルーして影響範囲が広がる方がテストは厄介になると思うがなあ。
176デフォルトの名無しさん (ワッチョイ 11fb-5Qxc)
2024/01/15(月) 23:36:35.23ID:rchiNbsm0 たとえば業務用のラベルプリンターでAPIが提供されてるとか
とりあえず try ~ catch して「印刷中に不明なエラーが発生しました」みたいなまとめかたはあるかなー
とりあえず try ~ catch して「印刷中に不明なエラーが発生しました」みたいなまとめかたはあるかなー
177デフォルトの名無しさん (ワッチョイ 2778-EFyZ)
2024/01/23(火) 17:00:13.54ID:kD0da0AW0 すみません。質問させて下さい。次のコードがMinGW-w64 g++ v13.2では --itrでエラーになります。わからないのはVisual studio 2022およびVisual StudioがサポートするClang LLVMでは通って正しく
実行しているように見えます。--itrの仕様がないのはMinGW-w64 g++v13.2が正しいのでしょうか?それともVisual Studioが正しいのでしょうか?
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> us = { 1,2,3,4,5,6 };
for(auto itr = begin(us); itr != end(us); ++itr) cout << *itr << endl;
auto itr = us.begin();
++itr; ++itr;
cout << *itr << endl;
--itr;
cout << *itr << endl;
cin.get();
return 0;
}
MinGW-w64 g++ v13.2のエラー
// error: no match for 'operator--' (operand type is 'std::__detail::_Node_iterator<int, true, false>')
実行しているように見えます。--itrの仕様がないのはMinGW-w64 g++v13.2が正しいのでしょうか?それともVisual Studioが正しいのでしょうか?
#include <iostream>
#include <unordered_set>
using namespace std;
int main()
{
unordered_set<int> us = { 1,2,3,4,5,6 };
for(auto itr = begin(us); itr != end(us); ++itr) cout << *itr << endl;
auto itr = us.begin();
++itr; ++itr;
cout << *itr << endl;
--itr;
cout << *itr << endl;
cin.get();
return 0;
}
MinGW-w64 g++ v13.2のエラー
// error: no match for 'operator--' (operand type is 'std::__detail::_Node_iterator<int, true, false>')
178はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5f3e-G0Zh)
2024/01/23(火) 17:23:45.88ID:MIeJSKFF0 >>177
unordered_set は forward iterator をサポートしているという規定がある。
https://timsong-cpp.github.io/cppwp/n3337/unord.set.overview#1
forward iterator は進めることは出来ても戻ることはできない。
この場合は operator-- がないのが正しい。
拡張してより高機能なライブラリを提供しても仕様に反するってわけではないけど
マイクロソフトのドキュメントでも特に拡張しているという文面は見当たらないから
あんまりあてにしないほうが良さそうには思う。
https://learn.microsoft.com/en-us/cpp/standard-library/unordered-set-class?view=msvc-170#iterator
unordered_set は forward iterator をサポートしているという規定がある。
https://timsong-cpp.github.io/cppwp/n3337/unord.set.overview#1
forward iterator は進めることは出来ても戻ることはできない。
この場合は operator-- がないのが正しい。
拡張してより高機能なライブラリを提供しても仕様に反するってわけではないけど
マイクロソフトのドキュメントでも特に拡張しているという文面は見当たらないから
あんまりあてにしないほうが良さそうには思う。
https://learn.microsoft.com/en-us/cpp/standard-library/unordered-set-class?view=msvc-170#iterator
179デフォルトの名無しさん (ワッチョイ 2778-EFyZ)
2024/01/23(火) 17:34:44.31ID:kD0da0AW0 おお、ありがとうございます。
180デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 11:36:45.25ID:W0uCnQb30 >>173
横やが関数foo()で1つの例外が発生したらその時点のfoo()呼び出しに至る10個かそこらの関数が中断されるわけや
すなわち関数bar()が
処理A→B→C→D→return
の順で処理が進むことを気体しているところに、Bで呼び出している関数baz()がfoo()を呼び出している結果、foo()で例外を生じると
処理A→B→return
という処理順に変更になる。こうなっても大丈夫なようにtry { 処理B } catch ((fooが投げる例外)& e) { (eに対する適切な処置) } を書かねばならず、
これが実は潜在的には処理A、B、C、Dのどこでも起き得るから厳密なことを言えば全てについて書かねばならず、
それがfoo()呼び出しに至る10個かそこらの関数それぞれについて行われねばならない。
検証もそんだけ組み合わせが増える。
横やが関数foo()で1つの例外が発生したらその時点のfoo()呼び出しに至る10個かそこらの関数が中断されるわけや
すなわち関数bar()が
処理A→B→C→D→return
の順で処理が進むことを気体しているところに、Bで呼び出している関数baz()がfoo()を呼び出している結果、foo()で例外を生じると
処理A→B→return
という処理順に変更になる。こうなっても大丈夫なようにtry { 処理B } catch ((fooが投げる例外)& e) { (eに対する適切な処置) } を書かねばならず、
これが実は潜在的には処理A、B、C、Dのどこでも起き得るから厳密なことを言えば全てについて書かねばならず、
それがfoo()呼び出しに至る10個かそこらの関数それぞれについて行われねばならない。
検証もそんだけ組み合わせが増える。
181デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 11:40:58.52ID:W0uCnQb30 というわけでそんなの現実には不可能なので、現実的な処置としては
・ライブラリ製作者はなんか都合が悪い事が起きたら何でも呼び出し元に返す。
第1選択としてはエラーステータスを返すことを検討し、それではコードが煩雑になりすぎる場合は例外を投げて異常を知らせる
・ライブラリを使う人はライブラリが例外を投げない条件で使うことを心掛け、自前のコード内でtry { } catch() { }を極力しない
という処置になるわ
けや
・ライブラリ製作者はなんか都合が悪い事が起きたら何でも呼び出し元に返す。
第1選択としてはエラーステータスを返すことを検討し、それではコードが煩雑になりすぎる場合は例外を投げて異常を知らせる
・ライブラリを使う人はライブラリが例外を投げない条件で使うことを心掛け、自前のコード内でtry { } catch() { }を極力しない
という処置になるわ
けや
182デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 12:02:32.93ID:Gsm093HM0 catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。
その場合の検証が必要だというならどっちも必要だろ。
その場合の検証が必要だというならどっちも必要だろ。
183デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 12:13:11.85ID:W0uCnQb30 >>182
>catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。
それは問題の認識がおかいし
例えば以下のコードにおいて、スレッドのゾンビを生じさせないためにはfuncB()をtry { } catch () { } は必須になる。
void bar() {
funcA(); // スレッドxを起動
funcB(); // 中でbaz() → foo()の呼び出し
funcC(); // スレッドxに停止シグナル発酵
funcD(); // スレッドxの終了待ち
return;
}
このように一般に例外が飛んでくる関数にはcatchするかしないかの選択権など無い
例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
>catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。
それは問題の認識がおかいし
例えば以下のコードにおいて、スレッドのゾンビを生じさせないためにはfuncB()をtry { } catch () { } は必須になる。
void bar() {
funcA(); // スレッドxを起動
funcB(); // 中でbaz() → foo()の呼び出し
funcC(); // スレッドxに停止シグナル発酵
funcD(); // スレッドxの終了待ち
return;
}
このように一般に例外が飛んでくる関数にはcatchするかしないかの選択権など無い
例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
184デフォルトの名無しさん (ワッチョイ 6d63-H5uA)
2024/01/28(日) 12:14:54.75ID:W0uCnQb30 訂正orz
誤:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
正:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外が飛んでくる想定であるならばcatchせねばならない
誤:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない
正:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外が飛んでくる想定であるならばcatchせねばならない
185デフォルトの名無しさん (ワッチョイ 797c-+np5)
2024/01/28(日) 12:19:26.10ID:/bXkl1Cz0 >>183
それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん
funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの?
まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん
funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの?
まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
186デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 12:28:00.13ID:Gsm093HM0187デフォルトの名無しさん (ワッチョイ 5ef3-qitC)
2024/01/28(日) 15:40:48.23ID:JnoCOYDS0 そもそも未知の例外飛んできた時点でそれを通したライブラリの例外安全性が守られてるか怪しいと考えるべき
188デフォルトの名無しさん (ワッチョイ 66cf-5eDQ)
2024/01/28(日) 17:01:39.99ID:Gsm093HM0 例外安全性を守るのに例外の種類やそれが既知か未知かは関係ないだろうが、
仕様に明記した例外以外は堰き止めるのが正解だろうなあ。
仕様に明記した例外以外は堰き止めるのが正解だろうなあ。
189◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/28(日) 20:27:29.75ID:0TnCAHFI0 思い立って結城さんのデザパタ(古いjava で記述)を総称型(テンプレート)もちゃんと使ってC++ に書き直しているけれども、
new/delete からptr::shared_ptr に書きなおすと、もう構造がわかりにくくなってしまってどうしようもない
デザパタ=抽象クラスプログラミングは C++ ではオワコンなの?
Visitor パターン
new/delete: https://ideone.com/6d43LO スッキリ書けてきもちいい
std::shared_ptr: https://ideone.com/oYzkxh 恐ろしい宣言の連発
>std::shared_ptr<Iterator<std::shared_ptr<Entry>>> iterator() { return std::make_shared<VectorIterator<std::shared_ptr<Entry>>>(v); }
なんかもう書いてても意味不明
CONSTRUCTOR(CONSTRUCTOR *p) とかコピコン以外にもみたことのないコンストラクタが要求されるし
new/delete からptr::shared_ptr に書きなおすと、もう構造がわかりにくくなってしまってどうしようもない
デザパタ=抽象クラスプログラミングは C++ ではオワコンなの?
Visitor パターン
new/delete: https://ideone.com/6d43LO スッキリ書けてきもちいい
std::shared_ptr: https://ideone.com/oYzkxh 恐ろしい宣言の連発
>std::shared_ptr<Iterator<std::shared_ptr<Entry>>> iterator() { return std::make_shared<VectorIterator<std::shared_ptr<Entry>>>(v); }
なんかもう書いてても意味不明
CONSTRUCTOR(CONSTRUCTOR *p) とかコピコン以外にもみたことのないコンストラクタが要求されるし
190はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+)
2024/01/28(日) 20:53:25.29ID:hRRbWEE/0 >>189
スマートポインタを使わないバージョンも C++ 的にはすっきりしてない。
動的多態の必要が必要ないのに持つべきメンバ関数を強制するためだけに抽象クラスを使っていて不恰好に見える。
コンセプトの導入がだいぶん後回しになった C++ の問題でもあるんだが……。
設計理念が妥当かどうかはともかくとして、元が Java なら直訳めいた C++ への置き換えがすっきりと書けるはずがない。
スマートポインタを使わないバージョンも C++ 的にはすっきりしてない。
動的多態の必要が必要ないのに持つべきメンバ関数を強制するためだけに抽象クラスを使っていて不恰好に見える。
コンセプトの導入がだいぶん後回しになった C++ の問題でもあるんだが……。
設計理念が妥当かどうかはともかくとして、元が Java なら直訳めいた C++ への置き換えがすっきりと書けるはずがない。
191はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+)
2024/01/28(日) 21:08:52.58ID:hRRbWEE/0 ざっと見た感じだと抽象クラスとして必要なのは Entry だけかな。
ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。
std::visit が C++ での visitor パターンのお手本だよ。
ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。
std::visit が C++ での visitor パターンのお手本だよ。
192デフォルトの名無しさん (ワッチョイ b501-PlwZ)
2024/01/28(日) 22:46:18.85ID:VLKT1lFt0193デフォルトの名無しさん (JP 0Hbd-DQL8)
2024/01/28(日) 23:17:29.01ID:wkb3ctO/H 面白そうだからちょっと書いてみた。大きな変更点はこんな感じ。
・accept が受け取るのは単に Visitor の参照でいい。ここで shared_ptr を使う必要はない。
・Visitor が受け取るのも File や Directory の参照でいい。
・SizeVisitor もいらない。File と Directory はともに Entry の子クラスとして getSize() を実装してるんだから、無理に visitor パターンを使わなくても単に getSize() を呼べばいいだけ。
・iterator() が返すのも VectorIterator の shared_ptr ではなく、単に VectorIterator を返せばいい。
全体的に使う必要がない場面で shared_ptr を使ってるのが目立ったと思う。
https://wandbox.org/permlink/ZBKbF5iMVpb7Looi
だいぶすっきりしたんじゃない?
・accept が受け取るのは単に Visitor の参照でいい。ここで shared_ptr を使う必要はない。
・Visitor が受け取るのも File や Directory の参照でいい。
・SizeVisitor もいらない。File と Directory はともに Entry の子クラスとして getSize() を実装してるんだから、無理に visitor パターンを使わなくても単に getSize() を呼べばいいだけ。
・iterator() が返すのも VectorIterator の shared_ptr ではなく、単に VectorIterator を返せばいい。
全体的に使う必要がない場面で shared_ptr を使ってるのが目立ったと思う。
https://wandbox.org/permlink/ZBKbF5iMVpb7Looi
だいぶすっきりしたんじゃない?
194はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-MxBP)
2024/01/28(日) 23:52:27.85ID:hRRbWEE/0 なんかもうポインタをいじるのが面倒になったので値としてやりとりしていいやという気持ちと
標準ライブラリを積極的に活用することにしたらこうなった。
https://wandbox.org/permlink/BQCNjfdJRKWAR3dg
標準ライブラリを積極的に活用することにしたらこうなった。
https://wandbox.org/permlink/BQCNjfdJRKWAR3dg
195◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 04:35:04.36ID:M6sadnnj0196◆QZaw55cn4c (ワッチョイ 3583-LgJ8)
2024/01/29(月) 05:00:34.95ID:M6sadnnj0197はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-MxBP)
2024/01/29(月) 12:08:36.13ID:WXyC0nMC0 スマートポインタを使うにしても std::shared_ptr って必要?
この場合は std::unique_ptr でよくない?
https://wandbox.org/permlink/dMolraFpQHKzYtF3
設計思想によるけどファイルシステムを表現するという前提だと
ひとつのルートディレクトリに連なる全てのエントリは実質的に一体のデータ構造なので
ルートディレクトリエントリの寿命が尽きれば全て解体ってことにしたほうが簡単でいいと思う。
ハードリンクの表現とかも考えるなら事情が変わってくることもあるだろうけど……。
この場合は std::unique_ptr でよくない?
https://wandbox.org/permlink/dMolraFpQHKzYtF3
設計思想によるけどファイルシステムを表現するという前提だと
ひとつのルートディレクトリに連なる全てのエントリは実質的に一体のデータ構造なので
ルートディレクトリエントリの寿命が尽きれば全て解体ってことにしたほうが簡単でいいと思う。
ハードリンクの表現とかも考えるなら事情が変わってくることもあるだろうけど……。
198デフォルトの名無しさん (ワッチョイ bda8-xxv9)
2024/01/29(月) 21:21:12.23ID:eAAuxXw40 >>189 c++
https://ideone.com/p3li2Y
・https://ideone.com/oYzkxh を元に若干の整理を行った
・他の人と同様shared_ptrを削除
値で持てるところは単に値で持つほうがC++っぽいと思う
ただ「Entry を値で持つのはいやだなあ」とのことなので部分的に残してる
Javaの参照型変数をshared_ptrに置き換えようとして困るのは
size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); }
ここがJavaだと単にvisit(this)で済むからスッキリするんだけど
しかもこれmake_shared(this)だと多重開放するよね??
>>189 c++
https://ideone.com/2uUpwH
・https://ideone.com/p3li2Y を元に若干の整理を行った
・make_shared<File>(this)の多重開放?を修正
std::enable_shared_from_thisを使ってJavaの参照型変数っぽい使用感を得た。
・struct this_is_private {};
これは単にコンストラクタを実質的にprivateにするためだけに使ってる
https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const
このへん参照されたし
https://ideone.com/p3li2Y
・https://ideone.com/oYzkxh を元に若干の整理を行った
・他の人と同様shared_ptrを削除
値で持てるところは単に値で持つほうがC++っぽいと思う
ただ「Entry を値で持つのはいやだなあ」とのことなので部分的に残してる
Javaの参照型変数をshared_ptrに置き換えようとして困るのは
size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); }
ここがJavaだと単にvisit(this)で済むからスッキリするんだけど
しかもこれmake_shared(this)だと多重開放するよね??
>>189 c++
https://ideone.com/2uUpwH
・https://ideone.com/p3li2Y を元に若干の整理を行った
・make_shared<File>(this)の多重開放?を修正
std::enable_shared_from_thisを使ってJavaの参照型変数っぽい使用感を得た。
・struct this_is_private {};
これは単にコンストラクタを実質的にprivateにするためだけに使ってる
https://en.cppreference.com/w/cpp/memory/enable_shared_from_this
https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const
このへん参照されたし
199デフォルトの名無しさん (JP 0Hbd-IHfd)
2024/02/03(土) 04:38:02.47ID:bq1KvR69H https://wandbox.org/permlink/LEl2MT7OdGIlVKC4
なんか「子クラスのコンストラクタに親クラスのオブジェクトを渡して子クラスのメンバを初期化する」(?)みたいなことができちゃってるんだけど、これってどういう仕様でこうなってんの?
Wandbox上だとC++2aではコンパイルできてC++17ではコンパイルできなかったからcpprefjpのC++20の機能の一覧も見てみたけどそれらしいものはなかったし
なんか「子クラスのコンストラクタに親クラスのオブジェクトを渡して子クラスのメンバを初期化する」(?)みたいなことができちゃってるんだけど、これってどういう仕様でこうなってんの?
Wandbox上だとC++2aではコンパイルできてC++17ではコンパイルできなかったからcpprefjpのC++20の機能の一覧も見てみたけどそれらしいものはなかったし
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 国内ホテル、既にキャンセルも 訪日客関連業界、事態見守る ★2 [蚤の市★]
- NHK、受信料の未払い世帯に督促強化へ 民事手続きの新組織を設置 差し押さえなどの強制執行も [1ゲットロボ★]
- 橋下徹氏「この喧嘩は日本の完敗」 台湾有事答弁めぐる外務省局長訪中で指摘「中国に怒られてご説明に伺った日本と見られる」 [muffin★]
- 【日本大使館】中国在留邦人は安全確保を [ぐれ★]
- 日本の立場説明へ…外務省局長が北京到着 “台湾有事”首相答弁に中国反発 ★4 [煮卵★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 高市コイン、155円突破wwwwwwwwww [246620176]
- 俺「中国産レアアースの代替どうするんですか?」 高市「南鳥島にありますよ。ちょっと待って下さいね」 [878970802]
- 最近日本民主の玉木って影薄くね?
- 韓国、泥船から爆速で逃げ出す 「高市…さん…でしたっけ?」 [878970802]
- 高市早苗の中国問題、「オーバーツーリズムが解消されてウザい中国人が消えるから日本の勝ち」という風潮になってしまう [562983582]
- (´・ω・`)よくねえな、どうにも
