ページ 11

[c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

Posted: 2017年12月13日(水) 22:18
by purin52002
こんにちは

インターフェースクラスのポインタをメンバに持つクラスを作ったのですが、
ポインタをデリートする際に型情報がわからないため正しくデリートできません。

Interface.h

コード:

__interface IAho { };
SubClass.h

コード:

#include"Interface.h"
class Baka : public IAho { };
MyClass.h

コード:

#include"interface.h"
struct MyClass
{
    IAho *p_i;
    myClass(IAho* aho) : p_i(aho) { }
    ~MyClass() 
    {
        //メモリリーク
        //delete p_i;

        //このクラスからはp_iがどんな型を継承しているかわからない?
        //delete static_cast<?>(p_i);
    }
}
MyClassにはIAhoを継承したクラス(今回はBaka)を渡したいのですが、
MyClass側でIAhoのポインタをデリートする際に型がわからないのでデリートすることができません。

MyClassをテンプレートクラスにしてテンプレート引数にBakaを渡してそれをもとにデリートしようかと思ったのですが、少し頭の悪い方法のような気がします。
何かいい方法はないでしょうか?

Re: [c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

Posted: 2017年12月13日(水) 23:52
by 25130
絶対に__interfaceを使用したい場合は分かりませんが、
素直に仮想デストラクタを持つclassとして宣言するのが一番手っ取り早そうです…。

(一応調べては見たもののどうしようもなさそうですよね)

Re: [c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

Posted: 2017年12月14日(木) 00:12
by 25130
一応コード例です。

INantokable.h

コード:

struct INantokable {
    virtual ~INantokable() = default;
};
Nanika.h

コード:

#include "INantokable.h"
class Nanika : public INantokable { };
Yay.h

コード:

#include "Nanika.h"
class Yay {
private:
    INantokable* pNantokable;

public:
    Yay(INantokable* pNantokable) : pNantokable(pNantokable) {}
    virtual ~Yay() {
        delete pNantokable;
    }
};

Re: [c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

Posted: 2017年12月14日(木) 00:24
by 25130
Yay.h内でNanika.hをインクルードしていますが、INantokable.hの間違いです。

Re: [c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

Posted: 2017年12月14日(木) 15:39
by purin52002
とりあえずDestroyableインターフェースを継承させることで一応は動くようになりました。

interface.h

コード:

__interface Destroyable
{
    void Destroy();
};

__interface IAho : public Destroyable { } ; 
MyClass.h

コード:

struct MyClass
{
     IAho *p_i;
    ~MyClass()
    {
        p_i->Destroy();
    }
}
これでIAhoの派生クラスのデストラクタをprivateとかにしておけば安全?

なんか違和感が少しあります^^;
ほかに何かいい方法はないでしょうか?
[hr]
25130さん

回答ありがとうございます。

__interfaceを絶対に使いたい!、、、というわけではないのですが、
せっかく新しく覚えたので積極的に使いたい、という感じです^^;
コードまで挙げていただきありがとうございます^^