[過去ログ] 【初心者歓迎】C/C++室 Ver.106【環境依存OK】 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
923: 2022/02/08(火)08:24 ID:vXrgdSa9(1) AAS
デストラクタだけ書いてあってムーブできないクラスをメンバ変数にすると色んな所でコンパイルエラーが出て困りました
値ではなくポインタで持つか、自分のクラスででムーブコンストラクタを書いたらとりあえずはエラーが出なくなったのですが、
こういうクラスは一体どう使われるのを想定して実装したんでしょうか?
924: 2022/02/08(火)18:34 ID:SQWxHGFm(1/2) AAS
基底クラスからたくさん派生クラスを作りました。
基底クラスの1つのvirtualメソッドを、各派生クラスでoverrideしました。
基底クラスを指す箱から、派生クラスのメソッドを呼ぶ方法を教えてください。
多少スタイルを変えても実現する方法があればお願いします。
ただし、場合分けやインデックスで対応するのは(派生クラスが増えたときに修正箇所が分散するので)厳しいです。
コンパイラは最近のvisual studioのC++を使っています。
struct Basic{
virtual void work(){cout<<"Basic";}
};
struct B1:public Basic{
省10
925(2): 2022/02/08(火)19:25 ID:WarIH046(1) AAS
Basicの配列にはBasicのオブジェクトしか入らないから、b30もコピーしたときにBasicになってしまったからだよ
Basic*の配列にするかvector<uniq_ptr<Basic>>を使えば
926: 2022/02/08(火)19:56 ID:SQWxHGFm(2/2) AAS
>>925
ポリモーフィズム成功しました。基底クラスのポインタを使って解決しました。
また、基底クラスの変数にコピーすると派生クラス独自のメンバが全て無くなることが理解できました。
ありがとうございました。
void main(){
Basic*basic_array[9];
basic_array[0]=&b30;
basic_array[0]->work();//B30のメソッドが呼ばれた。
}
927: 2022/02/11(金)14:30 ID:/nAwqwYv(1) AAS
>>925
> vector<uniq_ptr<Basic>>を使え
動的にインスタンスを作り始めた途端に、コンテナとスマートポインタが必要になりました。
見事すぎる回答に改めて感謝します。
928(2): 2022/02/18(金)10:16 ID:+V9f8lU9(1/5) AAS
例外で飛んじゃうと後始末ができなくてメモリリークしちゃうんだけど
クラスでラップしてデストラクタっていちいちやる感じ?
929: 2022/02/18(金)10:30 ID:+V9f8lU9(2/5) AAS
try~catchで囲えば処理できるけど
すべての例外が出る可能性のあるコード全部try~catchしちゃっていい?
930: 2022/02/18(金)11:08 ID:v7utSHD9(1/2) AAS
>>928
「いちいちやる」っていうか、同種のリソースを扱うときはいつも必要になる対応だからデストラクタでいいんだよ。
大抵はunique_ptrとか標準にあるもので済むし。
931(1): はちみつ餃子 ◆8X2XSCHEME 2022/02/18(金)11:40 ID:fowo2HBL(1/2) AAS
>>928
いちいち個別対応したくないからクラス定義に押し込めるんだよ。
932(2): 2022/02/18(金)12:17 ID:+V9f8lU9(3/5) AAS
>>931
今回のとこちょっとなんだけどなぁ
例外発生するとこ全部でやらなあかんやんコレ
クソ杉ちゃう?
933: 2022/02/18(金)12:21 ID:mVeDXtSU(1) AAS
なにいってんの
934(1): 2022/02/18(金)12:27 ID:+V9f8lU9(4/5) AAS
えー、わからんのー?
つまり例外が発生しうるとこすべてで
尻切れトンボされる可能性があって
以前のようにmalloc-freeのコードが混じってるとそいつらは問答無用でメモリリークしちゃうって話よ
935: 2022/02/18(金)12:47 ID:YFQd7auv(1) AAS
malloc/freeなら検出できるやん
936: はちみつ餃子 ◆8X2XSCHEME 2022/02/18(金)12:48 ID:fowo2HBL(2/2) AAS
>>932
対処する必要があるところで catch して解放するだけだろう。
それがどうして出来ないんだ?
937: 2022/02/18(金)13:19 ID:+V9f8lU9(5/5) AAS
まあ、それよ
そういう対応が必要になるって話よ
追加するやつ全部trycatchで包むか
mallocfreeをクラスで包むか
入れたのは20行程度なのにルーチンの流れまで変える必要があったりなかったりで(# ゚Д゚) イラッ!
938: 2022/02/18(金)13:39 ID:v7utSHD9(2/2) AAS
>>934
malloc-freeしてる既存コードに例外発生する処理を混ぜるなんて特殊状況ならしょうがない。
面倒な状況なのはわかる。あきらめて心を殺してtry catchするか小さいRAII用クラスを作るか。
あるいはmalloc-freeしてるところも標準コンテナやunique_ptrに置き換えていけばすっきりするかもね。
939: 2022/02/19(土)09:00 ID:AlOKsuc0(1) AAS
>>932
クソすぎかもしれないが、それは必要だし普通だろ
940: 2022/02/19(土)10:43 ID:MFjncly/(1) AAS
メモリ解放以外にデストラクタでやることはあるわけだしな
集約して定義しとけよという
941: 2022/03/09(水)22:51 ID:wIy/pNxS(1) AAS
LinuxでyyyyMMddhhmmss.fffを出力する
一番簡単な方法を教えて下さい
942: 2022/03/09(水)23:05 ID:w9Xuob20(1) AAS
printf("yyyyMMddhhmmss.fff");
上下前次1-新書関写板覧索設栞歴
あと 60 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.016s