3

参照カウントを実装するには、 のIUnknownようなインターフェイスとスマート ポインター テンプレート クラスを使用します。インターフェイスには、以下を含むすべての参照カウント メソッドの実装がありますRelease()

void IUnknownLike::Release()
{
   if( --refCount == 0 ) {
       delete this;
   }
}

スマート ポインター テンプレート クラスには、生のポインターを受け入れるコピー コンストラクターと代入演算子があります。したがって、ユーザーは次のことができます。

 class Class : public IUnknownLike {
 };

 void someFunction( CSmartPointer<Class> object ); //whatever function
 Class object;
 someFunction( &object );

そして、プログラムは未定義の動作を実行します。オブジェクトは参照カウント 0 で作成され、スマート ポインターが構築されて 1 にバンプされます。その後、関数が戻り、スマート ポインターが破棄され、スタックに割り当てられた変数が呼び出さRelease()れます。delete

ユーザーは次のこともできます。

struct COuter {
    //whatever else;
    Class inner;// IUnknownLike descendant
};
COuter object;
somefunction( &object.Inner );

また、で作成されていないオブジェクトnewdeleted です。最高の未定義の動作。

ユーザーが派生したすべてのオブジェクトを作成するためにIUnknownLike強制的に使用するようにインターフェイスを変更する方法はありますか?newIUnknownLike

4

3 に答える 3

1

Baseクラスのデストラクタを保護し、スマートポインタクラスを彼の友達にすることができます。

したがって、ユーザーはスタック上にクラスのインスタンスを作成できなくなります。彼らはnew、releaseとdeleteを呼び出すoperatorとsmart_pointerクラスを使用する必要があります。

于 2010-05-14T11:57:23.177 に答える
1

コンストラクターを非公開にし、new を使用する静的メンバー関数を記述します。

class IUnknownLike{
public:
  static IUnknownLike * createIUnknownLike(); { return new IUnknownLike(); }

private:
  IUnknownLike (); // private ctor
};

IUnknownLike* obj = createIUnknownLike();
于 2010-05-14T11:38:37.497 に答える
0

非常に多くのクラスに対してこれを行うことに本当に意図がある場合は、マクロを使用してファクトリ メソッドを作成します。何かのようなもの:

#define FACTORY(NAME) protected: NAME();\
public: static NAME* create ## NAME(){ return new NAME(); }

コンストラクターにパラメーターを渡したい場合は、より手の込んだものにする必要があります。

もう 1 つの方法は、COM の残りの部分を実装し、各クラスにファクトリ関数を中央のオブジェクト作成システムに登録させることです。興味深い演習ですが、これはすべてひどいアイデアのように思えます。

于 2010-05-14T13:59:22.013 に答える