C++相談室 part153

レス数が950を超えています。1000を超えると書き込みができなくなります。
2020/10/10(土) 23:18:20.00ID:i4F+i14Y
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
※前スレ
C++相談室 part152
https://mevius.5ch.net/test/read.cgi/tech/1594528940/

テンプレおしまい
2020/12/27(日) 18:23:25.49ID:tp3tetyk
>>893
知らんよ。
普通かどうかなんて気にしてどうするの?ここで名無しの誰かに yes/no 答えてもらって何か意味ある?
2020/12/27(日) 18:33:52.26ID:7Rx7y5wp
>>893
STLのクラスを継承して階層構造を実現するテクは応用編って感じがする
もっと基本的なやり方をするならデザパタのcompositeパターンを使う
とかかね
2020/12/27(日) 18:47:54.32ID:7Rx7y5wp
設計を学ぶならデザパタはひと通り見ておいて損はないぞ
897デフォルトの名無しさん
垢版 |
2020/12/27(日) 18:49:43.74ID:QkMmRpj8
ヘネパタ、パタヘネ、デザパタ。
898デフォルトの名無しさん
垢版 |
2020/12/27(日) 22:11:00.35ID:QkMmRpj8
newのコストは気にされますが、deleteのコストは見逃されがちです。
2020/12/28(月) 02:23:23.12ID:ibU6N4ur
あるクラスのコンストラクタのデフォルト引数を変更するときってどうしたらいいの?
オーバーロードすれば良い?
2020/12/28(月) 07:27:12.64ID:7Z4wU2qk
単純に変更じゃダメな理由は?
他のライブラリ?
2020/12/28(月) 07:33:40.98ID:pesKZps1
stlコンテナを継承するのはアウトだろ。
うまくやらないとデストラクタが呼ばれなくなっちゃうぞ
902デフォルトの名無しさん
垢版 |
2020/12/28(月) 09:00:44.26ID:i4NtF28F
じゃあうまくやりましょうや。
2020/12/28(月) 09:44:51.94ID:bVWPeYFg
そもそもC++ではデストラクタを仮想にしてないってことは「継承すんなよ」って宣言だからなぁ
904デフォルトの名無しさん
垢版 |
2020/12/28(月) 09:55:45.06ID:W/k+iOkV
なんで継承しないようにしたか意見表明文みたいなモンはどっかにあるのか?
2020/12/28(月) 10:20:49.88ID:ErVwTltE
仮想関数化するとしない場合に比べて余分なコストがかかるから、必要な理由がない限り基本的にそれは避けるということじゃないかな
2020/12/28(月) 10:32:20.80ID:4OiRlqvR
C++は1クロックでも速く動作させるために非仮想関数をデフォルトにしたのは理解できる
Javaは動作速度よりもオブジェクト指向の継承動作の一貫性を重視してすべて仮想関数にした、これも時代を考えれば理解できる
C#もJavaと同じくデフォルトを仮想関数にしておいて欲しかったのだが、C#はC++を尊重してデフォルト非仮想関数なんだよね
これはちょっと残念
2020/12/28(月) 11:33:10.90ID:s2RdB6EU
継承して機能追加っていうのがオブジェクト指向的にもどうかと思うね
2020/12/28(月) 12:34:23.27ID:QmdcnH/3
finalキーワードがこの時代にあれば間違いなく付けただろうな
文句言ってる奴はガイジ
2020/12/28(月) 12:42:44.62ID:UEnoPUHl
>>903
継承すんな、は言いすぎ。
private継承なら問題ないと思うけど。実際たまに使われているし。
2020/12/28(月) 13:19:25.85ID:N6A7dpOQ
デストラクタが仮想ではないものを継承したときの具体的な問題は
スライシングが起こりうるということと、
起こってもコンパイラが (少なくともコンパイル時には) 捕捉できないことが多いということにあって、
スライシングが起こらないように使う分には問題はない。

設計的に綺麗かどうかはまた別の話だけど。

shared_ptr が (デストラクタが仮想でなくても) 元の型のデストラクタを呼んでくれたりするんで、
場合によってはそういう設計もアリということなんだと思う。
2020/12/28(月) 14:12:57.70ID:02+J4aSB
>>910
デストラクタが仮想なものを継承してもスライシングは起こりうるよね?そこは関係なくね?
https://en.wikipedia.org/wiki/Object_slicing
> In C++ programming, object slicing occurs when an object of a subclass type
> is copied to an object of superclass type: the superclass copy will not have
> any of the member variables defined in the subclass. ...
2020/12/28(月) 17:31:09.93ID:V+A6vVBD
C++自由すぎてしんどいな
後方互換性と引き換えに払った代償か
2020/12/28(月) 17:46:19.93ID:N6A7dpOQ
>>911
スライシング自体は起こるけど、それで予想外のことやメモリ管理の矛盾は起こり難い。
914デフォルトの名無しさん
垢版 |
2020/12/28(月) 17:50:37.04ID:i4NtF28F
自由に羽ばたける翼。
2020/12/28(月) 18:06:08.49ID:V+A6vVBD
自由すぎて困る部分はLinterを併用することで勝手に回避しろってことかな
2020/12/28(月) 18:37:15.29ID:v+s+VlFU
だってCの設計思想が「人間を信用する」だもん
セキュリティが重視される現代的な言語のベースとしては致命的に合ってないんだよね
2020/12/28(月) 18:40:02.12ID:02+J4aSB
>>913
やっぱり関係がわからない。
デストラクタが仮想ではないものを継承したときに限ってスライシングが予想外のことや
メモリ管理の矛盾につがなる例をひとつでいいから見えてもらえない?
2020/12/28(月) 18:40:41.01ID:02+J4aSB
s/見えてもらえない?/見せてもらえない?/
2020/12/28(月) 19:07:39.46ID:bVWPeYFg
A <|- B, C みたいなときにB, CをnewしてA*として管理しようとすると破棄の時にAのデストラクタしか呼ばれない
2020/12/28(月) 19:09:58.26ID:UEnoPUHl
>>911
仮想でないデストラクタが話題のスコープなのに、スライシングにスコープを移したら議論にならないでしょ。

911) デストラクタが仮想なものを継承する→スライシングになるものが存在する
という命題は
910) デストラクタが仮想ではないものを継承する→スライシングになるものが存在する
という命題と矛盾するわけではない(両立する)ので、その議論はあんまり意味がない。
921デフォルトの名無しさん
垢版 |
2020/12/28(月) 19:14:08.97ID:i4NtF28F
スライシング・オプティマイザーとかどうよ?
2020/12/28(月) 19:36:49.42ID:02+J4aSB
>>910
> スライシングが起こらないように使う分には問題はない。
ここもおかしいんだよね。

デストラクタが仮想ではないものを継承して派生クラスのオブジェクトを new で作って
基底クラスのポインタを通して delete したら未定義動作になるわけだけど、
これはスライシングを起こしていなくても問題になる。

「派生クラスのオブジェクトを new で作って基底クラスのポインタを通して delete」のことを
「スライシング」と呼んでる気配もあるんだけど、それは明らかに誤りだろうし。
2020/12/28(月) 19:43:43.44ID:592FfNkQ
>>900
変更ってどうやるの?
毎回好きな引数を与えよってこと?
面倒なので、自分の好きな引数を自分のコードの中ではデフォルトにできれば良いのにと思ったのだが、こういう考えは間違っていますか
2020/12/28(月) 19:51:33.62ID:7Z4wU2qk
>>923
make関数作るのはダメなん?
2020/12/28(月) 19:59:11.40ID:v+s+VlFU
デストラクタはpublic仮想かprotected非仮想かpublic非仮想finalのどれかにしろ
っていう一般的結論でよくね
2020/12/28(月) 21:21:17.65ID:sYj4+JXZ
>>925
自分で書くときはそう
標準のコンテナのように既存のクラスがそうでなかったら?が発端だからなぁ

個人的には仮想デストラクタがなければ継承はしない
(一部のイディオムを除けば)private継承にするくらいなら委譲する。
2020/12/28(月) 21:54:56.73ID:wzipnhb8
デストラクタがprotected:であっても非仮想なら継承したらアウトなんじゃ…
派生クラスの破棄時に基底クラスのデストラクタが呼ばれない
的な意味で
2020/12/28(月) 21:57:44.66ID:dWPs/bUX
>>924
オブジェクトを作るための関数を作ってはどうかという意味ですか?
確かにそれで良いのでそうします
929デフォルトの名無しさん
垢版 |
2020/12/29(火) 07:11:18.52ID:2gsaGKLd
相称型プログラミング。
930デフォルトの名無しさん
垢版 |
2020/12/29(火) 07:28:15.94ID:2gsaGKLd
いま私大事なこと言いましたよ。
2020/12/29(火) 07:37:07.18ID:H8QGk97F
プログラミング学びには来ないだろ
こんな途上国に
932デフォルトの名無しさん
垢版 |
2020/12/29(火) 07:38:50.44ID:2gsaGKLd
【CSS規格、読書感想文】
CSSがアイデアであった段階からスクリプト言語で実装され、初の大規模採用であったネットスケープにおいてもJavascriptによって実装されていたため、規格そのものがC/C++で効率的になるよう設計されていない。※
現行の規格に対して効率的な実装を施したとしても、将来の規格バージョンで維持できると限らないため、結局、スクリプト言語と同様の非効率を許容することになる。
これはつまり、ほとんどのシンボルを動的に確保することを意味する。

※HTML5規格は、C/C++で効率的に実装できるように仕組まれている。
2020/12/29(火) 07:48:03.75ID:UwKcs/oz
なるほどねー
そもそもCSSのCって要る?
もはやスタイルシートってサイト作成者が決めるものになっているよね
ユーザースタイルシートをカスケード適用できる機能もなくせばさらに効率よくできそう
2020/12/29(火) 07:49:27.20ID:oaU8v0Mt
>>927
なんで?~Derived()が~Base()を呼ばない場合なんて存在しないぞvirtualの有無関係なく
2020/12/29(火) 08:05:44.29ID:vWMLZNcx
>>927
型消去とsmart ptr実装で調べるよろし。
2020/12/29(火) 09:18:16.16ID:qLyTNuLW
定期的に話題になるけど、基底のデストラクタにvirtualが必要なのは
基底型のポインタでdeleteするときだけな
末端のデストラクタさえ呼べれば、次に呼ぶ基底の型は分かりきってるからね

別の言い方をすれば、常に末端の型のポインタをdeleteする分には、virtualなデストラクタなんか要らんということ
2020/12/29(火) 11:55:36.33ID:So4DneUg
ポリモーフィズムの旨味が消えるw
938デフォルトの名無しさん
垢版 |
2020/12/29(火) 12:13:46.12ID:2gsaGKLd
ポリリズムから出汁をとったみたいないい方しますね。
2020/12/29(火) 13:15:00.89ID:m86wB2y9
まあ普通は末端の型を意識しなくて済むからこそ派生の旨味がある訳で
2020/12/29(火) 14:33:08.60ID:kdP0thHS
>>936
その点については誰もが一度は通る勘違いだよなw
最初はわけも分からず機械的にvirtualつけて回ってたわ
2020/12/29(火) 20:19:15.83ID:EiaQ+UBu
うっせえ知っとったわ素でまちがえただけじゃわ!ヽ(`Д´)ノウワーン
2020/12/31(木) 05:29:21.52ID:/Sdg/sCQ
struct A { virtual void Delete() { delete this; } };
struct B : A { void Delete() { delete this; } };
こうなってりゃ別にいらんな
943デフォルトの名無しさん
垢版 |
2020/12/31(木) 11:50:06.55ID:zS3i4lwe
>>795 の同期とか奇妙な質問に思うけど、Javaからくるとそうなるんだな。
2020/12/31(木) 12:23:37.15ID:3Es5+lkr
javaにだって非同期でメモリ確保するコンテナなんてないでしょ
2020/12/31(木) 13:41:11.66ID:lvvsunYH
>>942
おとなしく virtual ~A() とするのにくらべて何のメリットも無いな。
946デフォルトの名無しさん
垢版 |
2020/12/31(木) 13:43:11.73ID:zS3i4lwe
deleteのコストは、ほんと気にされないな。
2020/12/31(木) 15:24:44.84ID:eCxLbtN/
「a=1 かつ b=1 以外なら実行」って条件式はどう書くの?
2020/12/31(木) 15:31:08.20ID:7G3T5w7B
>>947
母語で曖昧さの無い表記ができますか?
2020/12/31(木) 15:40:19.22ID:+0BPso5e
>>950

> 「a=1 かつ b=1 以外なら実行」って条件式はどう書くの?

「「a=1 かつ b=1」以外なら実行」なら、
if (!(a == 1 && b == 1)) { 実行(); }

「a=1 かつ「b=1以外」なら実行」なら、
if (a == 1 && b != 1) { 実行(); }
2020/12/31(木) 15:47:49.87ID:eCxLbtN/
>>949
THX
「a=1 かつ b=1」以外なら実行、でした。
私が950でレスするのもお見通しですか?w
2020/12/31(木) 18:57:49.39ID:/Sdg/sCQ
>>945
ただの押しつけだな
うるせーバカ
952デフォルトの名無しさん
垢版 |
2021/01/01(金) 05:08:27.95ID:FlWhKtLF
CSSは規格の著者がサンプル実装してるというので見に行ったら、Javascriptだった。
あからさまに動的言語向けに規格が書かれているのは、そういうことでしたか。
これは辛い。
2021/01/01(金) 18:05:25.39ID:a5HWfmXn
>>792
それはちょっと古臭いお馬鹿な手法でしょう

正しいやりかたは、
・呼び出し側が呼び出され側に格納エリアを提供する‥‥@
・呼び出し側が確保するべきサイズは@の前に別途問い合わせする
2021/01/01(金) 18:33:17.97ID:1DPP279V
いずれにしろ面倒
955デフォルトの名無しさん
垢版 |
2021/01/02(土) 00:08:04.41ID:f21yM1/d
CにはCで
#define APPBUFSZ (十分でかい整数値)
void foo() {
  char buf[APPBUFSZ];     // buf[]はスタック上にとられる配列(重要
  if (!func(buf, sizeof(buf))) {  // 第2引数は要素数の意味とするならsizeof(buf) / sizeof([0])
    バッファサイズ不足等のエラー
  }
}
という黄金パターンあるんじゃー
これは原始的な見かけほど不合理というわけではない
956デフォルトの名無しさん
垢版 |
2021/01/02(土) 00:11:12.76ID:f21yM1/d
CSSはDOMの一部でありかつ意味と表記の分離の必要からCSSになった
DOMはWebページのあらゆる要素へのコントロールの実現を目的としている
という印象
2021/01/02(土) 00:53:58.35ID:wp0Bo1A/
>>955
kwsk
ちょっとよくわからない‥
2021/01/02(土) 02:21:09.41ID:dR/zQLwh
>>955
Cってこのパターンでクソほど無駄なバッファ取るから全然効率的じゃないよな
2021/01/02(土) 09:15:42.80ID:hdbwvBU0
>>955
何が黄金なのかさっぱりわからんが…
どこでそれが黄金パターンとされているかの出典だけでも頼む
2021/01/02(土) 09:25:20.55ID:TBL/2gAq
定番は>>953だろう。
事前にサイズを求めるコストがバカにならないという場合だけ別案を検討するくらいで。
2021/01/02(土) 10:59:35.93ID:dR/zQLwh
大抵の場合は「事前にサイズを求める」=やり直しになりそうなんだけど
962デフォルトの名無しさん
垢版 |
2021/01/02(土) 11:29:31.77ID:f21yM1/d
>>958
左様よほど意図しない事象でも起きない限りエラー処理に行かないぐらい大き目にとる
スタック上に領域をとる場合、時間コストも空間コストもゼロとみなせるからそれで構わない
再帰呼び出しのようなきわめて深い関数呼び出し階層になるときぐらいしか問題は生じない
というわけで、プログラミングしたいこと/すべきことに対するちょっとした洞察と
アーキテクチャーに関する理解さえあれば、言うほど非効率でも不合理でもないことがわかるはず…
2021/01/02(土) 11:39:10.82ID:YOqoG5bU
>953
確保すべきサイズを問い合わせたときと確保して呼び出した時に必要サイズが変わっていないか気になって夜しか眠れない
(リトライしてもリトライ回数が適切かどうか気になって布団以外で眠れない)
2021/01/02(土) 19:19:34.45ID:TRpAMVE2
std::make_sharedにインターフェースクラスを継承したクラスを渡したいんですがエラーになりました
これは生ポインタ使えと言うことでしょうか?
https://ideone.com/QUYTgX
2021/01/02(土) 19:28:29.87ID:VBbIup1J
>>964
https://programming-place.net/ppp/contents/cpp/language/029.html#pure_virtual_destractor
2021/01/02(土) 19:32:19.38ID:TRpAMVE2
>>965
デストラクタとコンストラクタの定義書いたらコンパイルできました
どうもありがとう
967デフォルトの名無しさん
垢版 |
2021/01/03(日) 08:55:49.95ID:tz0lNZPE
chromiumのソースみると全面的にstd::unique_ptrを使ってるので、少なくともC++11 以降。
968デフォルトの名無しさん
垢版 |
2021/01/03(日) 09:00:31.13ID:tz0lNZPE
レンダリングコアチーム29名中3名が日本人。
2021/01/03(日) 14:01:40.32ID:A/6DePqP
newしたクラスをdeleteすればクラス内で保持した変数のメモリも自動的に解放されるのでしょうか? 
2021/01/03(日) 14:08:46.33ID:I3Vvl19p
>>969
「クラス内で保持」の仕方による。
deleteに伴って各メンバ変数のデストラクタが呼び出されるので、自動的に解放されるようにすることはできる。
2021/01/03(日) 14:31:09.41ID:A/6DePqP
ポインタの参照先は解放されないとかですかね?
2021/01/03(日) 15:46:52.70ID:ytOMOpf7
所有してるメモリなら解放されて欲しいけど借用してるメモリは解放されちゃ困るででょ
973デフォルトの名無しさん
垢版 |
2021/01/04(月) 03:53:19.91ID:wIiDK2+4
借りてる金を誰かが返してくれるなら良いお話では?
2021/01/04(月) 06:10:53.50ID:FFXfDp9J
>>971
スマポ使ったら?
975デフォルトの名無しさん
垢版 |
2021/01/04(月) 19:46:23.01ID:0C4iSsrn
めちゃくちゃ初歩的な質問で申し訳ないのですが文字で「"」を出力したい場合はどうするのですか?
cout<<"これ→"←"<<endl;
とすると出力したい文字が「これ→」までだと認識されエラーが発生しますよね…
2021/01/04(月) 19:50:08.29ID:0tciJGtx
えすけぇぷ
2021/01/04(月) 19:52:06.94ID:RRkyDjZk
バックスラッシュor
半角の円記号
を使う
2021/01/04(月) 19:53:04.44ID:SE/uzuCD
>>975
https://ideone.com/X6MCOB
2021/01/05(火) 02:42:04.01ID:GBNfOfsJ
https://ideone.com/37sNvH
バックスラッシュではうまくいったのに半角の円記号ではうまくいきません!
2021/01/05(火) 02:46:08.54ID:SOx0PxdD
>>979
https://ideone.com/pxsVp1
2021/01/05(火) 07:30:58.94ID:rKfNNjQV
>>975
cout << R"(cout<<"これ→"←"<<endl;)";
2021/01/05(火) 08:35:13.05ID:JJaPBKYs
cout << R"fuckU(cout<<"これ→"←"<<endl;)fuckU";
ただしC++11以降な
2021/01/05(火) 09:02:10.14ID:x+1hwr2M
>>979
macでよくハマるw
984デフォルトの名無しさん
垢版 |
2021/01/06(水) 09:32:04.26ID:UTmmPnLW
HTML5は規格通りに実装できるけど、CSSは規格通りに実装できないな。
Chromiumは、Blink以前はBison使ってたけど、Blink以降は手書きパーサになってる。
もはや、クラス名や属性名を見て処理をわけないと衝突を解決できない。
985デフォルトの名無しさん
垢版 |
2021/01/07(木) 01:07:21.92ID:DfoUdJtt
次スレ下さい。
986デフォルトの名無しさん
垢版 |
2021/01/07(木) 14:22:12.51ID:Oosx0PB6
c++で出力出来ない文字とかあるんですか?
>>981
この書き方ならなんでも出力出来るんですかね?
cout<<"これ→"←"endl;)と出力したい時
cout << R"(cout<<"これ→"←"<<endl;))";
でもいけるんですか?
)が気になりますが…
2021/01/07(木) 15:10:50.98ID:9QJGSme0
>>986
それを言ってるのが>>982だよ
988デフォルトの名無しさん
垢版 |
2021/01/07(木) 19:34:55.01ID:5FPBrit1
>>987
すいません出来ました
fuckという単語なので嘘かと思ってスルーしていました
>>982
ありがとうございます
2021/01/08(金) 03:01:05.78ID:cNGMO0JS
>>947
cppは論理演算子が少ないからに優しくないから先のレスのようにチマチマ等価な冗長な論理を書くしかないのが面倒だよね…
not-andなんだからnand演算子(=joint denial(↑)、論理用語)で書けりゃいいのに(もちろん裸cppで
2021/01/08(金) 05:11:49.99ID:wkJPfkff
C++界隈のオッサンは普通に4文字とか猥語とかバンバン使ってちゃんとした説明するから気をつけろ
2021/01/08(金) 05:14:48.68ID:gKD5AY0L
template <typename A, typename B>
inline constexpr
bool nand(A&& a, B&& b)
{
return !(A == 1 && B == 1);
}
992デフォルトの名無しさん
垢版 |
2021/01/08(金) 08:15:42.48ID:lmjqKHzd
プリプロセッサで演算子増やせないかな?
無理かな?
2021/01/08(金) 08:24:11.24ID:gKD5AY0L
マクロの識別子は英数字下線だけだかんな
あ、でも英数字下線の演算子もどきならできるね

template <typename R, typename A>
R Static_cast(A&& a) { return a; }
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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