SophiaFramework UNIVERSE 5.3 |
SFORefObject クラスは、 参照カウンタ機能を備えており、 SFXRefObjectPointer クラスのパラメータにすることにより、 スマートポインタとして機能します。
SFMTYPEDEFREFOBJECT マクロを用いてクラス宣言を行えば、 SFXRefObjectPointer<MyRefObject> 型の別名として、 MyRefObjectSmp が定義され、 簡便にスマートポインタの機能を使用できるようになります (MyRefObject は、SFORefObject クラスを継承するクラス)。
例 784. SFORefObject クラスを継承する MyRefObject クラスの実装例
// 参照カウントオブジェクトクラス名とそれに付随する型宣言を行うマクロ SFMTYPEDEFREFOBJECT(MyRefObject) class MyRefObject: public SFORefObject { // コピー禁止マクロ SFMSEALCOPY(MyRefObject) // 参照カウントオブジェクトクラスの継承関係を記述するマクロ SFMREFOBJECTINSTANTIATEONE(MyRefObject, SFORefObject) public: // インスタンスを生成する関数 static MyRefObjectSmp NewInstance (SFCErrorPtr exception = null); protected: explicit MyRefObject (Void); virtual ~MyRefObject (Void); // エラーが発生する可能性のある初期化関数 virtual SFCError Initialize (Void); }; // コンストラクタ MyRefObject::MyRefObject(Void) { } // デストラクタ MyRefObject::~MyRefObject(Void) { } // インスタンスを生成する関数 MyRefObjectSmp MyRefObject::NewInstance(SFCErrorPtr exception) { return static_pointer_cast<MyRefObject>(Factory(::new MyRefObject, exception)); } // エラーの発生する可能性のある初期化関数 // Factory() 関数内から呼び出される SFCError MyRefObject::Initialize(Void) { SFCError error; // 親クラスの初期化関数を呼び出す if ((error = SFORefObject::Initialize()) == SFERR_NO_ERROR) { // MyRefObject 固有の初期化処理 error = // (..省略..); } return error; }
このクラスの内部実装は、以下の通りです。
#include <SFXPointer/SFXRefObjectPointer.h.hpp> #include <SFXPointer/SFARefObjectCounter.f.hpp> SFMTYPEDEFREFOBJECT(SFORefObject) class SFORefObject { SFMSEALCOPY(SFORefObject) private: UInt32 _telomere; protected: explicit SFORefObject (Void); virtual ~SFORefObject (Void); protected: static SFORefObjectSmp Factory (SFORefObjectPtr object, SFCErrorPtr exception); virtual SFCError Initialize (Void); private: Void Retain (Void); Void Release (Void); friend class SFARefObjectPointer; friend class SFARefObjectCounter; }; /*protected */SFORefObject::SFORefObject(Void) : _telomere(1) { }// SFORefObject::SFORefObject // /*protected virtual */SFORefObject::~SFORefObject(Void) { }// SFORefObject::~SFORefObject // /*protected static */SFORefObjectSmp SFORefObject::Factory(SFORefObjectPtr object, SFCErrorPtr exception) { SFCError error(SFERR_NO_ERROR); SFORefObjectSmp result; if (object != null) { if ((error = object->Initialize()) == SFERR_NO_ERROR) { result.Set(object, false); } } else { error = SFERR_NO_MEMORY; } if (exception != null) { *exception = error; } return result; }// SFORefObject::Factory // /*protected virtual */SFCError SFORefObject::Initialize(Void) { return SFERR_NO_ERROR; }// SFORefObject::Initialize // /*private */Void SFORefObject::Retain(Void) { ++_telomere; return; }// SFORefObject::Retain // /*private */Void SFORefObject::Release(Void) { if (--_telomere == 0) { ::delete this; } return; }// SFORefObject::Release //
コンストラクタ/デストラクタ |
---|
SFORefObject( Void ) SFORefObject クラスのコンストラクタです。
|
~SFORefObject( Void ) SFORefObject クラスのデストラクタです。
|
プロテクト関数 | |
---|---|
static SFORefObjectSmp |
Factory(
SFORefObjectPtr object
, SFCErrorPtr exception
) NewInstance 関数の実装を補助します。
|
SFCError |
Initialize( Void ) 初期化を行います。
|
[ protected, explicit ] SFORefObject(Void);
このコンストラクタは、 内部で保持している参照カウントを 1 に初期化します。
この関数の内部実装は以下の通りです。
/*protected */SFORefObject::SFORefObject(Void) : _telomere(1) { }// SFORefObject::SFORefObject //
[ protected, virtual ] ~SFORefObject(Void);
このデストラクタは、 何も行いません。
この関数の内部実装は以下の通りです。
/*protected virtual */SFORefObject::~SFORefObject(Void) { }// SFORefObject::~SFORefObject //
[ protected, static ] SFORefObjectSmp Factory( SFORefObjectPtr object // インスタンス SFCErrorPtr exception // エラー値 );
new 演算子を用いて新しく生成したインスタンスを設定します。
内部で発生したエラー値を返します。
この関数は、 新しい具象参照カウントクラスを作成するときに必要となる NewInstance() 関数の実装を補助します。
この関数を利用して具象参照カウントクラスの NewInstance() 関数を実装できます。
注意 | |
---|---|
この関数は内部で SFORefObject::Initialize 関数を呼び出して初期化を行います。 SFORefObject::Initialize 関数内にはエラーが発生する可能性のある初期化コードを記述します。 |
static_pointer_cast 演算子 | |
---|---|
SFORefObject::Factory 関数は SFORefObjectSmp 型を返すので、 static_pointer_cast 演算子を使用して 新しく生成する参照カウントクラスの型にダウンキャストする必要があります。 |
以下は、MyTableCellReactor クラスの NewInstance() 関数と Initialize() 関数を実装するコードです。
/*public */MyTableCellReactor MyTableCellReactor::NewInstance(SFCErrorPtr exception) { return static_pointer_cast<MyTableCellReactor>(Factory(::new MyTableCellReactor, exception)); }// MyTableCellReactor::NewInstance // /*protected virtual */SFCError MyTableCellReactor::Initialize(Void) { SFCError error; // 親クラスの Initialize() 関数を呼び出す if ((error = SFOTableCellReactor::Initialize()) == SFERR_NO_ERROR) { // エラーが発生する可能性のある初期化コード // ..(省略).. } return error; }// MyTableCellReactor::Initialize //
この関数の内部実装は以下の通りです。
/*protected static */SFORefObjectSmp SFORefObject::Factory(SFORefObjectPtr object, SFCErrorPtr exception) { SFCError error(SFERR_NO_ERROR); SFORefObjectSmp result; if (object != null) { if ((error = object->Initialize()) == SFERR_NO_ERROR) { result.Set(object, false); } } else { error = SFERR_NO_MEMORY; } if (exception != null) { *exception = error; } return result; }// SFORefObject::Factory //
[ protected, virtual ] SFCError Initialize(Void);
SFERR_NO_ERROR。
この関数は、 (エラーが発生する可能性のある)初期化を行います。
デフォルトの実装では、 何も行わず、常に SFERR_NO_ERROR が返ります。
注意 | |
---|---|
この関数は SFORefObject::Factory 関数内で呼ばれます。 具象クラス固有の初期化コードがあり、エラーが発生する可能性がある場合、 オーバーライドする必要があります。 継承するクラスでこの関数をオーバーライドして実装する場合、 親クラスの Initialize() 関数を先に呼び出します。 |
SFORefObject::Factory の使用例を参照してください。
この関数の内部実装は以下の通りです。
/*protected virtual */SFCError SFORefObject::Initialize(Void) { return SFERR_NO_ERROR; }// SFORefObject::Initialize //
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |