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を設定します。これによりITestインターフェースがQuery可能になります。
1) ITestの継承
2) queryの実装
3) 関数の実装 |
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);
}
};
|
オブジェクトのインスタンスを作成するには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 );
}
}
|
|
#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 );
}
}
|
|
|