2016-11-03 18 views
0

私はこのような抽象クラスを持っている:movementPathはそれ自身の抽象クラスである抽象クラスの抽象メンバを正しく処分するにはどうすればよいですか?

class IMovable { 
protected: 
    MovementPath *movementPath; 

public: 
    IMovable(); 
    virtual ~IMovable(); 
    void setMovementPath(MovementPath *movementPath); 
}; 

IMovableの具体的な実装が削除された場合は、movementPath(より正確には、その時点での具体的な実装)とそのメンバーのいずれかを削除する必要があります。

どうすればよいですか?

私は仮想デストラクタを試しましたが、うまくいかなかったかもしれません。具体的な実装でそれを削除すると、間違った、冒涜的で、実行してはいけないプログラムがクラッシュします。

私は何をしますか?

+0

私は質問を得ることはありません。 MovementPathは基本抽象クラスですか? – mkmostafa

+4

あなたは多分、3回のルールに違反したでしょう。所有権セマンティクスを持つ生ポインタの使用をやめてください。もはや1996年ではない。 –

+0

となります。非生の型を認識していませんでした。 – Karlovsky120

答えて

2

IMovableは、あなたがそれを示したように、それ自身の抽象メソッドを持たない抽象クラスではありません。抽象型へのポインタであるデータメンバはカウントされません。いずれの場合においても

は、仮想デストラクタを必要と MovementPathあなたの質問に、答えるために、その後、 IMovableかかわらず、実際に何であるか、それを入力するのは、正しい具体的なデストラクタを呼び出すために delete movementPathを呼び出すことができます。例えば

class MovementPath 
{ 
... 
public: 
    virtual ~MovementPath() { ... } 
... 
}; 

class IMovable { 
protected: 
    MovementPath *movementPath; 

public: 
    IMovable() : movementPath(0) {} 
    virtual ~IMovable() { delete movementPath; } 

    void setMovementPath(MovementPath *newPath) { 
     // whether or not you need to 'delete movementPath' here 
     // depends on your particular requirements... 
     movementPath = newPath; 
    } 
}; 

class MyMovementPath : public MovementPath 
{ 
... 
public: 
    ~MyMovementPath() { ... } 
... 
}; 

class MyMovable : public IMovable 
{ 
... 
public: 
    MyMovable() : IMovable() { ... } 
    ~MyMovable() { ... } 
... 
}; 

MyMovementPath *path = new MyMovementPath; 
MyMovable *movable = new MyMovable; 
movable->setMovementPath(path); 
... 
delete movable; // <-- will delete the path as well... 
+0

これは基本クラスですが、抽象クラスではありません。 – Karlovsky120

関連する問題