C++相談室 part154

■ このスレッドは過去ログ倉庫に格納されています
2021/01/08(金) 17:54:00.55ID:0DW9z0rL
※前スレ
C++相談室 part153
https://mevius.5ch.net/test/read.cgi/tech/1602339500/

テンプレここまで
239デフォルトの名無しさん
垢版 |
2021/01/27(水) 17:43:27.13ID:nPuTGnvU
C++例外のスタック情報がとれないのはC++の欠点。
例外でスタック情報を使えるJava/C#/Python/Perlはエライ。
2021/01/27(水) 21:51:38.91ID:NT655YPf
おまえは二度とC++使うな
2021/01/27(水) 23:04:53.57ID:TqcnYSNG
>>239
スタックフレーム作ればイケるってば
2021/01/28(木) 09:07:27.76ID:dmDIUcy2
>>235
例えば誰?
2021/01/28(木) 10:23:46.51ID:vBYpvnJx
>>239
gdb にアタッチしたことないんか?

C++23 には stacktrace が入るから
デバッガを使いこなせなくても少し楽にトレースできるかもな。
244デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:52:39.05ID:dNWrUHbO
>>223
フグは豚肉に触感似てるけどフグの方が美味い
245デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:54:00.53ID:dNWrUHbO
>>228
日本で感染爆発が起きてないのは以前からジビエが流行してたからか
246デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:55:14.42ID:dNWrUHbO
>>230-231
白菜は外の皮じゃなくて中の芯から先に食べろと言われている
2021/01/28(木) 11:40:01.79ID:eLxqvNeX
>>200
ユニコ時代だからAPLよりずっと先行ってるぞ
組み込み演算子で∩∉とか集合論の記号採用してたりアトミックな演算子は⚛++とか洒落効いてたりする
一方で古代perlのプレフィックスは緩和されてる
2021/01/28(木) 11:51:37.25ID:eLxqvNeX
∅∘∩ ⊍∪ ⊖ ⊎ ∖≅ ∈ ∉ ∋ ∌ ≡
≢ ⊂ ⊄ ⊃ ⊅ ⊆ ⊈ ⊇ ⊉ ≼ ≽.«»≠␤
他組み込みではこんな感じか
>= やらよりmずっと可読性高いと思う、エディタもvimとか高機能なのなら問題なかろう
␤文字を表示してくれるのは特に便利
2021/01/28(木) 11:58:59.45ID:kskG1wa2
>>245
さすがにコウモリはどこの地方でも食わんだろ
2021/01/28(木) 17:23:15.04ID:8Al9oSyF
なんでプリミティブ型って継承できんの?
2021/01/28(木) 17:29:22.44ID:vBYpvnJx
>>250
やりたいときってあるか?
2021/01/28(木) 17:41:41.73ID:GsoT0xyU
クラスAのオブジェクトをクラスBのメンバにするときってどうやってAのコンストラクタ呼ぶの?

class B{
 A a;

public:
 B(){
  // この辺でAのコンストラクタを呼びたい
 }
};
2021/01/28(木) 17:48:00.82ID:WrE+/6so
>>252
メンバのコンストラクタの方が先に呼ばれる。だからそこでは既にAは構築済み。
どうしてもBのコンストラクタ内でAのコンストラクタ呼びたいなら、メンバ変数はポインタで持つ
254デフォルトの名無しさん
垢版 |
2021/01/28(木) 18:07:20.07ID:IHrlZHr2
>>243
gdbはおいとくとして、Visual StudioってC++例外のスロー位置を追跡できたっけ?
2021/01/28(木) 18:50:38.47ID:Hqj+H5f7
>>252
初期化リストを使う
B() : a(hoge, piyo)
2021/01/28(木) 18:54:30.61ID:IHrlZHr2
あとで再初期化したくなること多いから、結局コンストラクタの実装を別の関数に分離すること多いよね。
コンストラクタの種類が増えたら使いまわしたくなるし。
2021/01/28(木) 19:24:37.48ID:q3mIN91/
>>243
デバッガ使いこなせないとか話にならんだろ・・
258デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:28:49.13ID:IHrlZHr2
デバッガやシンボルがない環境でもスタックトレースできたほうが良いと思うけどね。
後発言語の生産性の高さはこの辺の充実ぶりにあるでしょ。
259デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:42:24.27ID:IHrlZHr2
他プロセスと連携するシステムにはデバッガを当てにくい事が多い。
タイミング依存の不具合を追跡する場合、デバッガがまったく役に立たない。
2021/01/28(木) 20:25:47.81ID:eBfsAdOM
>>258
その手の生産性と成果物の効率はトレードオフでどっちを重視するかが違うだけでしょ
2021/01/28(木) 20:36:13.14ID:IHrlZHr2
デバッガ使いこなすとか言って悦に入ってる人と会話が噛み合わないんだが。
262デフォルトの名無しさん
垢版 |
2021/01/28(木) 20:36:14.66ID:yp+dwtvR
>>258
だよね
むしろデバッガをアタッチできる環境ならスタックトレースはなくてもなんとかなる
ユーザー環境でスタックトレースがテキストファイルに落ちるようになってるとトラブルシューティングがしやすい
2021/01/28(木) 21:29:31.41ID:oPlwADge
>>261
ここほとんどアマチュアの人だから許してやろうやw
2021/01/28(木) 21:48:11.74ID:q3mIN91/
>>261, >>263
悪いがプロだよ
IDEの機能を使いこなせてない初心者が、先に学ぶべきことから逃げて言語だけでどうにかさせようとするような
(いつものことだが)はちみつのミスリードに釘を刺しただけだ
2021/01/28(木) 21:51:13.66ID:q3mIN91/
>>261
あと、流れを読む限り俺の発言が気に入らなくてファビョってるのは君の方だよね、俺1行しか書いてなかったし(しかも大した内容じゃない)w
何が気に障ったんだ?
2021/01/28(木) 21:51:23.69ID:oPlwADge
いやごめん、俺は流れは一切追ってなくて他意はないよ
茶化したかっただけ
気にしないで
2021/01/28(木) 23:50:09.41ID:g6qVZG7L
発狂やないかw
Perlの人かな
2021/01/28(木) 23:53:15.94ID:RfcrpqT0
>>253,255
じゃあ、Bを構築してしばらく経ってからわかる情報を使ってAを構築したいとき、Aのインスタンスをメンバとして持つのは不可能ということですか?
ポインタで持つ以外の方法はない (想定されてない?) のでしょうか

constなメンバ変数を初期化するときも近いことを思います
269デフォルトの名無しさん
垢版 |
2021/01/29(金) 00:10:27.15ID:ZIYbfTXe
>>268
そういうコンストラクタ制約を持つクラスはけっこう多い。
WindowsのC++向けGDI+ライブラリのクラス群はまさにこれが当てはまる。
広範に存在している以上は受け入れるしかない。
今時は標準でshared_ptrなどの共有ポインタクラスを使えるので、さほど問題にならないでしょ。
2021/01/29(金) 00:19:48.35ID:SRnp44iw
>>268
Aに引数なしのコンストラクタ、コピーorムーブ代入演算子があるなら、後で作って代入でもいいけど
まぁ特に理由なければ(スマート)ポインタで持った方が無難だし楽

constはどうしようもない
2021/01/29(金) 00:22:16.89ID:MWSZTtHp
>>268
「Bを構築してしばらく経ってからわかる情報」を返すヘルパー関数を作って初期化リストの中で呼べばいいじゃない
2021/01/29(金) 07:49:13.10ID:/axUqcOX
データメンバをconstってあんまりやらないな
publicに晒すとかじゃなきゃメンバ関数を
constにするだけで足りるから

あ、staticメンバのconstはよくやるけどね
2021/01/29(金) 08:02:53.38ID:1V7SRlCX
>>251
ある
実装は同じunsigned longでも意味が違うから別クラスとして扱いたいときとか
private継承できたらナア……
現状(C++03)はプリミティブ型と同じ演算子(のうちの当座のアプリケーションで使うやつ)をいちいち実装したクラスを作って
NDEBUGマクロで実装を切り替えるみたいな涙ぐましい努力が要る
2021/01/29(金) 08:05:13.74ID:1V7SRlCX
訂正orz
誤: private継承
正: public継承かつoperator unsigned long()はprivateかつunsigned longからの構築はexplicit
2021/01/29(金) 08:08:37.91ID:1V7SRlCX
メンバをconstにして代入演算子を定義せずにいるとデフォルトの代入演算子をが定義できないとコンパイラに文句を言われる俺環、
2021/01/29(金) 09:20:50.39ID:koPyq8om
>>273
それ、継承できたとして式の中で混在しても区別されないんじゃね?
テンプレートの型引数で区別するような使い方くらいしか思いつかないが。
2021/01/29(金) 12:20:22.74ID:c2S2Mocm
メンバ変数のconstはポインタ型ならすることあるけど、値で持つメンバ変数はあんまり意味なくない?
constなくても勝手に外部から書き換えられないように、ちゃんと隠蔽しとけばいいだけでしょ
2021/01/29(金) 12:35:16.78ID:2DekME/2
>>277
class内の処理においても変更しないつもりだ、変更されることはない、と明示することで意識しておかなければならないことを少し軽減できるのだから、無駄ではないと思う。
手間をかけずにconstにできるならしておけばいいし、逆に無理して複雑なことをしてまでconstにする必要はないという程度のことかと思う。
2021/01/29(金) 12:55:03.34ID:c2S2Mocm
>>278
たしかにconst付いてればコンストラクタで設定した値がずっと変わらないことが
明示的になるから無意味ではないか
2021/01/29(金) 14:10:30.45ID:heeNhc25
>>273
そういう用途なら opaque alias という提案だけは出てるけど
どう見てもグダグダなんで、場当たり的な方法のほうがマシだと思うよ。
281デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:04:20.47ID:5pIDnM+S
>>251
3値のboolean作るときってboolean継承すべき?
282デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:07:44.73ID:5pIDnM+S
>>256
言いたいことは判るが
コピーコンストラクタやムーブコンストラクタが勝手に使われるから
デフォルトに任せてると何が起こるかは判ってた方が良い
283デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:10:21.66ID:5pIDnM+S
>>259
COMサーバーというかDX用にフィルタ書いてると訳判らなくなった
284デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:56:37.48ID:RxAp4EkX
>>281
3値のbooleanを作って何するの?
boolへのポインタにしてtrue / false / nullptr の3値でなんとかならんか?
2021/01/29(金) 17:20:59.69ID:ADFs+h5F
boostにtriboolってのがあるな
2021/01/29(金) 17:23:22.91ID:t7wU8l8M
>>281
仮に真偽値型を継承可能であったとして、三値型が真偽値型を継承するのはおかしいだろう。
場合によって柔軟な判断が必要な場合はあるものの、
継承は is-a 関係を表したいときに限ったほうがよろしいというのが一般的な設計原則だと思うが。
2021/01/29(金) 17:25:47.23ID:GtDK4kd8
nullableか、DBのフィールド値?
2021/01/29(金) 18:57:54.24ID:ZIYbfTXe
はちみつ餃子「スタックトレースできないならデバッガ当てればいいじゃない」
2021/01/29(金) 19:41:08.91ID:rAmh2V0K
典型的な円楕円問題だな
2021/01/29(金) 19:56:26.71ID:ZIYbfTXe
テンプレートを使えば、クラス継承に依存しない記述が可能。
iostreamが黒歴史扱いである現実を踏まえての話。
2021/01/29(金) 21:24:08.77ID:WFMo+mcm
とりあえずiostream批判しとけば訳知り顔ができた気に浸れる浅はかなやつ
2021/01/29(金) 21:35:39.96ID:nnAlz0gZ
c++ニワカあるあるだよなw
iostreamとりあえず批判奴w
2021/01/29(金) 21:39:11.47ID:ZIYbfTXe
iostreamは使いもしないメンバ変数を継承することを強要される悪い手本でしょ。
2021/01/29(金) 22:16:38.63ID:WFMo+mcm
何も説得力を示さずに突然「悪い」と言い出す
2021/01/30(土) 01:56:51.26ID:SJAC6oP5
iostreamはクソなのは正解だが別に批判するようなことでもない
なぜなら使わなければいいだけの話だからだ
2021/01/30(土) 02:06:50.03ID:OHt9F1SU
無理にクラス継承を使わずオーバーライド関数とそれを使うテンプレート関数を充実させたほうが幸せになれる。
2021/01/30(土) 02:41:04.49ID:PJvUkb6d
別に無理して継承を使っているわけではない
どっかの馬の骨が気に入らんからといって
あれを使うなこれを使うなと言われるほうが無理そのものだ
2021/01/30(土) 02:53:37.72ID:OHt9F1SU
例えば、ファイルに書き込む処理があったとする。
ファイルハンドルとして有名な型としては、int型、FILE*型、iostream型、Win32APIのHANDLE型などがあげられる。
これらを派生クラスに閉じ込めて抽象化するよりも、関数名が同じになるオーバーライド関数を作ってテンプレート関数から呼んだ方がはるかに楽。

int WriteBuffer(int fp, const char* buffer);
int WriteBuffer(FILE* fp, const char* buffer);
int WriteBuffer(ostream& fp, const char* buffer);
int WriteBuffer(HANDLE fp, const char* buffer);

template<typename FILE_OBJECT>
void WriteContent(FILE_OBJECT o)
{
WriteBuffer(o, "write test1");
WriteBuffer(o, "write test2");
}
2021/01/30(土) 03:53:39.52ID:ULcRPxme
ドヤってるところすまんがそれオーバーライドじゃない
2021/01/30(土) 04:01:05.04ID:PJvUkb6d
プゲラ
301デフォルトの名無しさん
垢版 |
2021/01/30(土) 05:45:11.84ID:SLqQC90z
フリー関数とクラスメンバでは、インテリセンスが効くか効かないかの違いもある。
2021/01/30(土) 05:52:17.44ID:OHt9F1SU
そんなあなたに名前空間
303デフォルトの名無しさん
垢版 |
2021/01/30(土) 06:06:53.60ID:SLqQC90z
クラスの場合、名前空間を書かなくても、インテリセンスが効く。
2021/01/30(土) 06:47:43.00ID:budoESfZ
コンストラクタの初期化リストで
class A{
 int x;

public:
 A(int x) : x(x) {}
};
みたいにしたとき、ちゃんとメンバのxがコンストラクタの引数のxで初期化されますよね?
メンバの x と同名の引数の x が同一のスコープに同居しているようで紛らわしいかなと思ったのですが、こういう書き方を避ける慣習はありますか
2021/01/30(土) 07:04:07.72ID:ULcRPxme
自分は普通にその書き方してる
避ける人も居るっぽいけど好きなようにすればいい
2021/01/30(土) 09:09:49.20ID:PHKUCpSE
iostreamマンセーバカってのは型安全ならどんな仕様でも良いと思ってるカスが多いからな。
型安全は評価する一項目に過ぎないってのに。
2021/01/30(土) 09:29:38.23ID:vDjChjwr
iostreamは整形のための情報をわざわざ状態として持たされるのがクソ
当時は状態が邪悪だっていう考え方が一般的じゃなかったからしょうがないけど
2021/01/30(土) 09:38:20.91ID:2pTx0la6
でも状態もってなかったら記述が煩雑になりすぎない?
HTMLのマークアップとまでは言わんまでも
2021/01/30(土) 09:59:20.80ID:OHt9F1SU
整形設定を記憶する変数インスタンスをiostreamインスタンスと分離すべきって話でしょ。
必要に応じて差し替えできるように参照渡しするか、逆にiostreamを参照渡しするとか色々やれたはず。
2021/01/30(土) 10:06:40.70ID:OHt9F1SU
というか他のオブジェクト指向言語だと整形情報がFormatterクラスとかに分離されているのが普通だし。
2021/01/30(土) 10:32:05.24ID:PJvUkb6d
FORTRANのFORMAT文が好きな人をどうこうしようとは思わない
2021/01/30(土) 10:40:52.47ID:hVJYorL3
初歩的な質問なのですが、stringクラスの内部バッファはデストラクタで破棄されるため自分では一切管理しなくていいという認識で良いのでしょうか?
313デフォルトの名無しさん
垢版 |
2021/01/30(土) 11:17:24.76ID:SLqQC90z
アロケータによるけど、普通は管理しなくて良いのでは?
314デフォルトの名無しさん
垢版 |
2021/01/30(土) 12:47:13.80ID:EWZvTk3z
>>308
状態持ってても無駄に煩雑(複雑ではない)
2021/01/30(土) 12:57:10.51ID:8FYOnD7D
iostream 型安全なのはいいけど、char/signed char/unsigned char ぜんぶ文字扱いするのはやめて欲しかった。
316デフォルトの名無しさん
垢版 |
2021/01/30(土) 13:18:35.30ID:SLqQC90z
単項プラスで。
2021/01/30(土) 13:18:38.04ID:4OMKN/Z4
>>309
入出力を直接的に司るバッファクラス (basic_streambuf) と
書式制御を司るストリームクラスを分離したデザインになっているし、
必要に応じて差し替えることも出来るよ。

iostream においてそれがわかりやすいか、良いデザインであるかは別として、
ちゃんと分離したデザインになってる。
2021/01/30(土) 14:53:52.50ID:L1O2TNoD
>>304
私は馬鹿なのでメンバ変数とコンストラクタ引数を x, _x というふうに書き分けています、馬鹿が感染るかもしれないのでお勧めはしません
2021/01/30(土) 15:08:20.24ID:S5wIZr5N
C++でのメンバ変数は、標準的には m_xと書く。
2021/01/30(土) 16:04:40.96ID:0ahE8ZR3
>>319
何処信者だよ
ダッサw
321デフォルトの名無しさん
垢版 |
2021/01/30(土) 16:41:05.48ID:SLqQC90z
MicrosoftとAdobeがその書き方多いですね。
2021/01/30(土) 17:13:12.28ID:S5wIZr5N
なお、_x は、命名規約上、禁止。先頭が _ の名前はコンパイラなどの
システム予約なため。
2021/01/30(土) 17:14:26.98ID:2r/QlSUC
そうだったっけ?
2021/01/30(土) 17:19:55.79ID:4OMKN/Z4
>>304
>>318-319
命名規約の方法論は色々なのでプレフィクスを付けるルールが定めてある場合もあるし、
むしろ一致させていくようにしているものもある。
私自身は、少なくともメンバに値を設定するだけの単純なコンストラクタである場合には
名前を一致させていくスタイルで書く。

C++ を使う上でのガイドラインとしてよく参照されているのはグーグルのスタイルガイドで、
データメンバの名前は最後にアンダースコアを付けるようにルールを定めている。
https://google.github.io/styleguide/cppguide.html#Variable_Names

その一方では C++ の設計者である Stroustrup は型やスコープを変数名に含めるのは好ましくない
(しかし部分的に便利な場合もあることは認めている) と書いている。
https://stroustrup.com/bs_faq2.html#Hungarian

どちらの習慣が圧倒的優勢ということはないと思う。

>>322
グローバル変数としてはアンダースコアで始まる名前は予約されているけど、
そうでない場合には問題ない。

ただし、

・ アンダースコアで始まって大文字が続く名前
・ アンダースコアが連続 (名前の先頭部分以外でも) する名前

は名前の種類やスコープにかかわらずどこでも予約されている。
2021/01/30(土) 17:30:01.20ID:2r/QlSUC
互いの信仰を侵害してはならないがチーム内では統一されている必要がある
規約の背景は明確である必要がある
326デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:08:50.99ID:OHt9F1SU
>>317
まず、FILE*とostreamが一対一対応していないのがダメ。
せっかくC言語でファイル、パイプ、標準IOがFILE*型としてで統合化・抽象化されていたのに、
C++でostreamとfstreamで分離される劣化が起きた。
2021/01/30(土) 18:30:25.89ID:PJvUkb6d
ios_baseで統一する形に変わっただけ
それをFILE*がどうたらと駄々こねるのは
頭が堅すぎる実年齢に無関係の老害だ
328デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:36:35.02ID:OHt9F1SU
パイプ処理をostream系で書く奇特な人ってどのくらいいるの?
329デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:41:09.24ID:OHt9F1SU
pythonは定数がないから全部大文字の変数は定数のようにみなしましょう的な談合がある。
2021/01/30(土) 19:00:34.72ID:0ahE8ZR3
定数というか型もない
2021/01/30(土) 19:09:23.04ID:L1O2TNoD
>>322
束縛領域が狭いローカル変数とかには、_x を使ってもいいのではないか?と考えていますが‥‥
2021/01/30(土) 20:32:34.21ID:PJvUkb6d
data_
size_
2021/01/31(日) 03:18:57.87ID:6QCY/vGM
>>331
実は#defineマクロの中で使われるケースがあってね。
_xが、アプリの中で使われてない事を前提にしないとマクロが作れない
場合とか。
334デフォルトの名無しさん
垢版 |
2021/01/31(日) 06:52:18.40ID:gXTMTlGe
HTTPサーバーのサンプルで、関数型言語がCを凌駕して、C実装の作者が??になってるやり取りをどこかで見たのですが、わかる方いらっしゃいませんか?

おそらくC++は簡単に勝てるはずなんですが。
2021/01/31(日) 07:27:56.74ID:fCVb5Gn/
dmrが?
2021/01/31(日) 09:14:46.77ID:bSEeGU13
>>333
c++実装者がユーザから参照可能な形でそれやってるの見たことあるの?
2021/01/31(日) 09:22:03.74ID:fCVb5Gn/
>>333
#define A(_x) (std::cout << #_x)

int main()
{
int _x = 5;
A(_x);
std::cout << _x;
}
何か問題でも?
338デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:19:42.43ID:BqL9JwJS
ひどいな
https://qiita.com/threecups/items/75a4b9ca1298270c5c62
339デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:23:16.43ID:BqL9JwJS
>>331
_で始めると激しくコンパイラ依存になる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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