トップページ > プログラム > 2016年12月05日 > oh/e0eB5

書き込み順位&時間帯一覧

1 位/222 ID中時間01234567891011121314151617181920212223Total
書き込み数20100000011130000003162223



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
263
C++相談室 part128 [無断転載禁止]©2ch.net

書き込みレス一覧

C++相談室 part128 [無断転載禁止]©2ch.net
263 :デフォルトの名無しさん[]:2016/12/05(月) 00:19:06.63 ID:oh/e0eB5
>>262
そういうもの、とはどういう意味ですか?
やはりコンパイルエラーが出るEASTLが間違っているということでしょうか。
C++相談室 part128 [無断転載禁止]©2ch.net
265 :263[]:2016/12/05(月) 00:33:53.91 ID:oh/e0eB5
>>264
代替的な解決策のご提示、ありがとうございます。
正直、クラスのnew/deleteオーバーライドを警告なしに無視することが make_shared() の仕様であるとは思いたくないです。
C++相談室 part128 [無断転載禁止]©2ch.net
267 :263[]:2016/12/05(月) 02:11:52.64 ID:oh/e0eB5
>>266
警告くらいは出してもいい気がしますが。
list<shared_ptr<T>> を使えばクラスのnew/deleteオーバーライドを呼ぶよう対処可能だけど、
そのshared_ptr<T>インスタンスをmake_shared<T>()で作ると要素をshared_ptrでラップした意図も台無しになる。
C++相談室 part128 [無断転載禁止]©2ch.net
271 :263[]:2016/12/05(月) 09:14:32.56 ID:oh/e0eB5
>>270
> 何のためにクラスのnew deleteをオーバーロードしてるのか知らんけどスタックに構築するのはいいの?

ん?オーバーロードじゃなくてオーバーライドの話してるんだけど。

Win32APIのGDI+ のクラスはすべてGdiplusBaseを基底クラスとして持っていて、
GdiplusBaseのnew/deleteオーバーライドがヘッダーファイル GdiPlusBase.h に定義されている。
何のためにオーバーライドしてるのかこっちが聴きたいくらい。
C++相談室 part128 [無断転載禁止]©2ch.net
273 :263[]:2016/12/05(月) 10:33:28.39 ID:oh/e0eB5
>>272
ここはC++相談室スレだから、憶測のデタラメな回答はやめましょう。
雑談はよそのスレでどうぞ。
C++相談室 part128 [無断転載禁止]©2ch.net
276 :263[]:2016/12/05(月) 11:42:41.49 ID:oh/e0eB5
new 演算子がヘッダーに書かれているのに dllの中で new するなどとデタラメなこと書いてるから門前払いさせてもらった。
このスレは、質問者の想定する前提条件を勝手に変更する読解力のない人がちょくちょく来るんだけど、何なの?
ほかのスレにこんな人いないよ。
C++相談室 part128 [無断転載禁止]©2ch.net
280 :263[sage]:2016/12/05(月) 12:17:58.38 ID:oh/e0eB5
>>279
基底クラスが newやdeleteをオーバーロードすることの説明になってない。
あなたの言っていることは根本的にズレているんだが。
あなたが自分で書いた>>270の質問に自分で回答してみたらどうか。
C++相談室 part128 [無断転載禁止]©2ch.net
283 :263[sage]:2016/12/05(月) 12:35:24.21 ID:oh/e0eB5
>>282
頼むからデタラメ書いてスレを荒らすのをやめてもらえないか。
C++相談室 part128 [無断転載禁止]©2ch.net
286 :263[sage]:2016/12/05(月) 12:54:28.05 ID:oh/e0eB5
Bitmapはコピーコンストラクタがprivateになってるのでvector<Bitmap>を使えない。結果的にnew/deleteの問題を起こせないようになってた。

Bitmapをコンテナで使うには、生ポでいれるかshared_ptrでくるんで入れるしか選択肢がない。
前にも書いたが、stdやboostの場合、shared_ptrをmake_sharedで作るとnew/deleteの不整合問題が暗黙のうちに発生する。
C++相談室 part128 [無断転載禁止]©2ch.net
292 :263[]:2016/12/05(月) 19:02:40.60 ID:oh/e0eB5
>>290
>newのオーバーライドなんてできたっけ??

newはオーバーライドできる。さらに独自にクラス内でオーバーロードもできる。

世間では オーバーロード が使われることが多いが、オーバーライド を使うのが正しい。
オーバーライドは、 異なるクラスの同名メソッド
オーバーロードは、 同じクラスの引数違いの同名メソッド

new /delete を引数違いで複数定義すればオーバーロードになる。
多くの場合、newした場所を特定するデバッグ手段としてオーバーロードしているため、誤用が広まった。
C++相談室 part128 [無断転載禁止]©2ch.net
295 :263[]:2016/12/05(月) 19:18:05.98 ID:oh/e0eB5
「コンテナに入れるクラスの実装を変えろ」という意見はごもっともだが、他から提供されたクラスなので勝手に書き換えできないケースも想定するべきだろう。

Gduplusは、MFCやと違ってcyginやmingw向けにもクラスライブラリが提供されている。皮肉交じりに言えば、
意のままにならない他社製クラスをC++のコンテナやテンプレートで扱うためのスキルを磨くのに、Gdiplusのクラスが一役買うかもしれない。

>>293
何を対象として話しているか曖昧になるので、オーバーロードの誤用は控えるべき。ヘッダーを見ればすぐわかることだが、
そもそもGdiplusBaseはサイズ引数1つだけをとる基本の new, new[], delete, delete[] がオーバーライドされているだけであり、オーバロードはされてない。
C++相談室 part128 [無断転載禁止]©2ch.net
300 :263[sage]:2016/12/05(月) 19:35:38.93 ID:oh/e0eB5
>>297
同一クラス内で operator+ がひとつだけならオーバーライド。
同一クラス内で operator+ が複数あればオーバーロード。

オーバーロードという語を誤用しても普通は問題ない。
誤用すると混乱する話題だからあえて指摘した。
C++相談室 part128 [無断転載禁止]©2ch.net
307 :263[sage]:2016/12/05(月) 20:25:56.28 ID:oh/e0eB5
例えると、インターネットとイントラネットの違いみたいな感じ。
override = inter-
overload = intra-

内と外の境界をどこに置くかで定義が変わる。
C++相談室 part128 [無断転載禁止]©2ch.net
312 :263[sage]:2016/12/05(月) 21:15:20.00 ID:oh/e0eB5
>>311
抽象的なoverrideの話は、言語仕様に依存する static や virtual といった属性と何の関係もない。
あなたが、既定のグローバルな new や delete がどのように定義されているかさえ知らないってのはよくわかった。
C++相談室 part128 [無断転載禁止]©2ch.net
315 :263[sage]:2016/12/05(月) 21:27:27.80 ID:oh/e0eB5
特定の言語仕様ではなく、厳格なオーバーライドとオーバーロードの定義の話をしている。

<new> をインクルードして グローバルな new や delete を置き換えるのはオーバーロード。
グローバルなnew や deleteを呼ばないようクラスのnew deleteで置き換えるのはオーバーライド。
さらにそのクラスでnew や deleteの引数違いなメソッドを複数提供すればオーバーロード。
C++相談室 part128 [無断転載禁止]©2ch.net
316 :263[sage]:2016/12/05(月) 21:32:31.98 ID:oh/e0eB5
>>314
グローバルの new, delete は暗黙の基底クラスの静的メソッド扱い。名前なしだからそう見えないだけ。
C++相談室 part128 [無断転載禁止]©2ch.net
319 :263[sage]:2016/12/05(月) 21:43:39.81 ID:oh/e0eB5
オーバロードを誤用するのは別に構わないが、「new. deleteはオーバライドできない」というのは明らかな間違いだから訂正した方がいい。
オーバライドすることなくクラスの new delete を規定の名前なしグローバルのnew, deleteから置き換えることなどできないからだ。
オーバロードとオーバライドの定義をちゃんと理解せずに回答するのはもうやめてもらえるか?
C++相談室 part128 [無断転載禁止]©2ch.net
324 :263[sage]:2016/12/05(月) 21:54:33.97 ID:oh/e0eB5
>>320
オーバーロードでは、静的な型推論の優先付けできない。
オーバーライドすることにより、はじめて静的な型推論の優先付けが成立する。
まず自分のメソッドを、なければ親のメソッドを辿って探す型推論の優先付け。
C++相談室 part128 [無断転載禁止]©2ch.net
326 :263[sage]:2016/12/05(月) 21:58:11.44 ID:oh/e0eB5
>>322
少なくともオーバーライドである事は確か。親子関係による優先付けが発生するから。
オーバロードの誤用も可。
C++相談室 part128 [無断転載禁止]©2ch.net
328 :263[sage]:2016/12/05(月) 22:16:44.60 ID:oh/e0eB5
各言語仕様としての厳格な定義と、オブジェクト指向における定義が混在している。
C++相談室 part128 [無断転載禁止]©2ch.net
332 :263[sage]:2016/12/05(月) 22:32:43.25 ID:oh/e0eB5
ざっくりいうと、メソッド推論の優先付けを伴わないのがオーバーロード。
親子関係などによるメソッド推論の優先付けを伴うのがオーバーライド。

オーバーライドとオーバーロードは同時に成立しうる。排他的ではない。
C++相談室 part128 [無断転載禁止]©2ch.net
351 :263[sage]:2016/12/05(月) 23:31:31.40 ID:oh/e0eB5
>>350
釣ってなどいない。
オーバーロードが既存のメソッドを置き換えできるのは、オーバーライドが行われたから。

>>347
失礼。<new>は必要ない。nothrowの制御と勘違いしてた。
C++相談室 part128 [無断転載禁止]©2ch.net
353 :263[]:2016/12/05(月) 23:56:17.43 ID:oh/e0eB5
日付変わる前に勝利宣言しとくわ。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。