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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: [c++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

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

#5

by purin52002 » 3年前

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

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

#4

by 25130 » 3年前

Yay.h内でNanika.hをインクルードしていますが、INantokable.hの間違いです。

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

#3

by 25130 » 3年前

一応コード例です。

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++]インターフェースクラスのポインタをメンバに持つクラスのデストラクタ

#2

by 25130 » 3年前

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

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

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

#1

by purin52002 » 3年前

こんにちは

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

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を渡してそれをもとにデリートしようかと思ったのですが、少し頭の悪い方法のような気がします。
何かいい方法はないでしょうか?

ページトップ