icubic library reference
iCubicオブジェクトの作成
概要
iCubicObjectはiCubicLibraryのオブジェクトモデルです。オブジェクトの作成と解放、リファレンス、インターフェースを提供します。iCubicObjectは参照カウンタ方式を使用しています。オブジェクトを循環参照すると解放されません。循環参照したい場合は、リファレンスを使用してください。

使用方法
ユーザーオブジェクトの定義
ユーザーオブジェクトを定義します。オブジェクトはobject_baseをvirtualで継承していなくてはなりません。

//ユーザーオブジェクトの定義
class Test : pubic virtual object_base
{
private:
    int m_value;
};


インターフェースの定義
インターフェースを定義します。インターフェースはGUIDで識別するために新しいインターフェースのためのGUIDも定義します。GUIDはインターフェースを作成するたびに新しく生成してください。iTestはITestインターフェースにアクセスするためのオブジェクトハンドル、rTestはリファレンスハンドルになります。インターフェースの呼び出し規約はcb_callになります。

//インターフェースを定義します
cb_guid_define( ITest_IID , 0x41EB2B97 , 0x924F4e8a , 0x805B07B5 , 0x34B140FF );
class ITest;
typedef icubic::iface_object< ITest , ITest_IID > iTest;
typedef icubic::iface_reference< ITest , ITest_IID > rTest;
class ITest
{
public:
    virtual
    int cb_call TestFunc() = 0;
};


Queryの設定
ユーザー定義オブジェクトにインターフェースのQueryを設定します。これによりITestインターフェースがQuery可能になります。
1) ITestの継承
2) queryの実装
3) 関数の実装

//Queryを設定する
class Test : public ITest , pubic virtual object_base
{
//Queryの実装
    query_begin();
    iface_hook( ITest , ITest_IID )
    query_end( object_base );

//関数の実装
void cb_call TestFunc( int v )
{
    printf("TestFunc(%d)\n",v);
}
};


インスタンスの作成
オブジェクトのインスタンスを作成するにはinstance<>クラスを使用します。コンストラクト時に自動的にインスタンスが作成されます。

//インスタンスの作成
void main()
{
    instance<Test>  test;
}


オブジェクトの使用
objectはiCubicObjectの一般的な型になります。全てのiCubicObjectはobjectに変換できます。

//オブジェクトに変換
void main()
{
    instance<Test>  test;
    object   obj = test;
}


インターフェース関数の実行
先ほど定義したITestのTestFuncを実行します。Queryに失敗した場合はNULLハンドルを返すのでtest==falseになります。

//オブジェクトに変換
void main()
{
    object   obj = instance<Test>();
    iTest    test=(iTest)object;
    if( test==false)
        return;
    test->TestFunc( 0 );   
}


リファレンス
リファレンスからオブジェクトを得るにはlock()を実行します。リファレンス先が破棄されたらNULLハンドルを返します。

//オブジェクトに変換
void main()
{
    object   obj = instance<Test>();
    refrence ref = obj;
    {
        iTest  t=(iTest)ref.lock();
        if( t==true )
           t->TestFunc( 0 );
    }
         //オブジェクトを解放
    obj.release();
    {
        iTest  t=(iTest)ref.lock();
        if( t==true )
           t->TestFunc( 1 );
    }
}

出力結果:
TestFunc(0)

サンプル
サンプルファイル


#include "iCubic.h";
using namespace icubic;

//インターフェースを定義
cb_guid_define( ITest_IID , 0x41EB2B97 , 0x924F4e8a , 0x805B07B5 , 0x34B140FF );
class ITest;
typedef icubic::iface_object< ITest , ITest_IID > iTest;
typedef icubic::iface_reference< ITest , ITest_IID > rTest;
class ITest
{
public:
    virtual
    int cb_call TestFunc() = 0;
};
//オブジェクトの定義
class Test : public ITest , pubic virtual object_base
{
    query_begin();
    iface_hook( ITest , ITest_IID )
    query_end( object_base );

void cb_call TestFunc( int v )
{
    printf("TestFunc(%d)\n",v);
}
};
//実行
void main()
{
    object   obj = instance<Test>();
    refrence ref = obj;
    {
        iTest  t=(iTest)ref.lock();
        if( t==true )
           t->TestFunc( 0 );
    }
    obj.release();
    {
        iTest  t=(iTest)ref.lock();
        if( t==true )
           t->TestFunc( 1 );
    }
}

出力結果:
TestFunc(0)
Copyright(C) 2008 fanzo. 更新日 20081120