前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFORefObject
参照カウンタ機能を備えたオブジェクトクラスです。
#include <SFORefObject.h.hpp>
class SFORefObject;
SFMTYPEDEFREFOBJECT(SFORefObject)
        

継承図

SFORefObject クラスの継承図

解説

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 //

参照

SFXRefObjectPointer

メンバ

コンストラクタ/デストラクタ
SFORefObject( Void )
SFORefObject クラスのコンストラクタです。
~SFORefObject( Void )
SFORefObject クラスのデストラクタです。
プロテクト関数
static
SFORefObjectSmp
Factory( SFORefObjectPtr object , SFCErrorPtr exception )
NewInstance 関数の実装を補助します。
SFCError Initialize( Void )
初期化を行います。

SFORefObject::SFORefObject
SFORefObject クラスのコンストラクタです。
[ protected, explicit ]
SFORefObject(Void);

解説

このコンストラクタは、 内部で保持している参照カウントを 1 に初期化します。

内部実装

この関数の内部実装は以下の通りです。

/*protected */SFORefObject::SFORefObject(Void) : _telomere(1)
{
}// SFORefObject::SFORefObject //

SFORefObject::~SFORefObject
SFORefObject クラスのデストラクタです。
[ protected, virtual ]
~SFORefObject(Void);

解説

このデストラクタは、 何も行いません。

内部実装

この関数の内部実装は以下の通りです。

/*protected virtual */SFORefObject::~SFORefObject(Void)
{
}// SFORefObject::~SFORefObject //

SFORefObject::Factory
NewInstance 関数の実装を補助します。
[ protected, static ]
SFORefObjectSmp Factory(
    SFORefObjectPtr object   // インスタンス
    SFCErrorPtr exception    // エラー値
);

引数

object

new 演算子を用いて新しく生成したインスタンスを設定します。

exception

内部で発生したエラー値を返します。

戻り値

  • 成功したとき: null 以外のポインタ
  • 失敗したとき: null ポインタ

解説

この関数は、 新しい具象参照カウントクラスを作成するときに必要となる NewInstance() 関数の実装を補助します。

この関数を利用して具象参照カウントクラスの NewInstance() 関数を実装できます。

[Note] 注意

この関数は内部で SFORefObject::Initialize 関数を呼び出して初期化を行います。 SFORefObject::Initialize 関数内にはエラーが発生する可能性のある初期化コードを記述します。

[Caution] 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 //

参照

SFORefObject::Initialize


SFORefObject::Initialize
初期化を行います。
[ protected, virtual ]
SFCError Initialize(Void);

戻り値

SFERR_NO_ERROR。

解説

この関数は、 (エラーが発生する可能性のある)初期化を行います。

デフォルトの実装では、 何も行わず、常に SFERR_NO_ERROR が返ります。

[Note] 注意

この関数は SFORefObject::Factory 関数内で呼ばれます。

具象クラス固有の初期化コードがあり、エラーが発生する可能性がある場合、 オーバーライドする必要があります。

継承するクラスでこの関数をオーバーライドして実装する場合、 親クラスの Initialize() 関数を先に呼び出します。

実装例

SFORefObject::Factory の使用例を参照してください。

内部実装

この関数の内部実装は以下の通りです。

/*protected virtual */SFCError SFORefObject::Initialize(Void)
{
    return SFERR_NO_ERROR;
}// SFORefObject::Initialize //

参照

SFORefObject::Factory