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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

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

#1

投稿記事 by purin52002 » 6年前

こんにちは

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

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を渡してそれをもとにデリートしようかと思ったのですが、少し頭の悪い方法のような気がします。
何かいい方法はないでしょうか?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

25130
記事: 4
登録日時: 6年前

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

#2

投稿記事 by 25130 » 6年前

絶対に__interfaceを使用したい場合は分かりませんが、
素直に仮想デストラクタを持つclassとして宣言するのが一番手っ取り早そうです…。

(一応調べては見たもののどうしようもなさそうですよね)
-- Let's enjoy programming !!

25130
記事: 4
登録日時: 6年前

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

#3

投稿記事 by 25130 » 6年前

一応コード例です。

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;
    }
};
-- Let's enjoy programming !!

25130
記事: 4
登録日時: 6年前

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

#4

投稿記事 by 25130 » 6年前

Yay.h内でNanika.hをインクルードしていますが、INantokable.hの間違いです。
-- Let's enjoy programming !!

アバター
purin52002
記事: 235
登録日時: 7年前
連絡を取る:

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

#5

投稿記事 by purin52002 » 6年前

とりあえず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を絶対に使いたい!、、、というわけではないのですが、
せっかく新しく覚えたので積極的に使いたい、という感じです^^;
コードまで挙げていただきありがとうございます^^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

返信

“C言語何でも質問掲示板” へ戻る