idl2cppコンパイラは,コードサンプル9-1に示すように_tie_Accountテンプレートクラスを自動的に生成します。POA_Bank_Account_tieクラスは,オブジェクトサーバが実体化して,AccountImplのインスタンスで初期化します。POA_Bank_Account_tieクラスは,受信するオペレーション要求すべてを実際のインプリメンテーションであるAccountImplに任せます。このサンプルでは,AccountImplクラスはPOA_Bank::Accountクラスを継承しません。
. . .
template <class T> class POA_Bank_Account_tie :
public POA_Bank::Account {
private:
CORBA::Boolean _rel;
PortableServer::POA_ptr _poa;
T *_ptr;
POA_Bank_Account_tie(const POA_Bank_Account_tie&) {}
void operator=(const POA_Bank_Account_tie&) {}
public:
POA_Bank_Account_tie (T& t): _ptr(&t), _poa(NULL),
_rel((CORBA::Boolean)0) {}
POA_Bank_Account_tie (T& t, PortableServer::POA_ptr poa):
_ptr(&t),
_poa(PortableServer::_duplicate(poa)),
_rel((CORBA::Boolean)0) {}
POA_Bank_Account_tie (T *p, CORBA::Boolean release = 1) :
_ptr(p), _poa(NULL),_rel(release) {}
POA_Bank_Account_tie (T *p, PortableServer::POA_ptr poa,
CORBA::Boolean release = 1)
: _ptr(p), _poa(PortableServer::_duplicate(poa)),
_rel(release) {}
virtual ~POA_Bank_Account_tie() {
CORBA::release(_poa);
if (_rel) {
delete _ptr;
}
}
T* _tied_object() { return _ptr; }
void _tied_object(T& t) {
if (_rel) {
delete _ptr;
}
_ptr = &t;
_rel = 0;
}
void _tied_object(T *p, CORBA::Boolean release=1) {
if (_rel) {
delete _ptr;
}
_ptr = p;
_rel = release;
}
CORBA::Boolean _is_owner() { return _rel; }
void _is_owner(CORBA::Boolean b) { _rel = b; }
CORBA::Float balance() {
return _ptr->balance();
}
PortableServer::POA_ptr _default_POA() {
if ( !CORBA::is_nil(_poa) ) {
return _poa;
} else {
return PortableServer_ServantBase::_default_POA();
}
}
};