私は派生クラスを削除する最良の方法をここで決定するのに非常に苦労しています。私は現在、次のようなレイアウトを持っている:どこを削除しますか?
class Tag {
// Stuff
// [...]
void releaseMemory(Tag *t);
};
class TagByte : public Tag { /* [...] */ };
class TagShort : public Tag { /* [...] */ };
Tag::releaseMemory(Tag *t) {
switch (t->getType()) {
case TAG_BYTE: delete (TagByte *)t; return;
case TAG_SHORT: delete (TagShort *)t; return;
// [...] many more
}
}
は、私がこれをやっている理由は、異なる種類のタグが含まれていますTagCompound
のようなより複雑なタグがあるということです、そして、それらのすべてがTag *
として保存されます。デストラクタの内部~TagCompound
、~TagList
のdelete
はTag
を解放するだけで、実際のTagWhatever
は解放されず、メモリリークが発生するため、すべてのタグでTag::releaseMemory();
を呼び出します。
私が考えていたもう1つの選択肢は、すべての派生クラスに新しい仮想メソッドを追加することでした。したがって、Tag
のすべての子は、スーパークラスに1つではなくreleaseMemory()
であることになります。
は、その後、私はこのため、私はまた、より良い解決策を見つけることができませんでしたヒープ対象である複合型TagCompound
とTagList
に渡されたすべてのものを想定して、私はすでに設計レベルでの不良をオフ始めているかどうかを疑問に思いました
TAG_Compound("Root"): 4 entries
{
TAG_String("Name"): Test
TAG_Short("SomeNumber"): 21
TAG_Double("..."): 9000.5
TAG_Compound("Eek!"): 2 entries
{
TAG_String("Marco"): Polo
TAG_List("Names"): 3 entries of type String
{
TAG_String: Hello
TAG_String: World
TAG_String: Segfault
}
}
}
そして、実行時に動的にスタック上のインスタンスとうまく再生されないことを読んだ:全体の構築物は、(単にバイナリおよびなど冗長ではない)、このようなもののためのパーサーの一部です。
私はこれを行うために何ができますか...わかりません..エレガントですか?
なぜ、オーバーレイされたreleaseMemoryメンバー関数を使用しないのですか?私はあなたの質問が正しいとすればそれで十分だろうと思う。 – Arunmu