13.1.18 Implementing Operations
The signature of an implementation member function is the mapped
signature of the OMG IDL operation. Unlike the client side, the
server-side mapping requires that the function header include the
appropriate exception (throw
) specification. This
requirement allows the compiler to detect when an invalid exception
is raised, which is necessary in the case of a local C++-to-C++
library call (otherwise, the call would have to go through a
wrapper that checks for a valid exception). For example:
// IDL
interface A
{
exception B {};
void f() raises(B);
};
// C++
class MyA : public virtual POA_A
{
public:
void f() throw(A::B, CORBA::SystemException);
...
};
Since all operations and attributes may throw CORBA system
exceptions, CORBA::SystemException
must appear in all
exception specifications, even when an operation has no
raises
clause.
Within a member function, the “this” pointer refers to the implementation object’s data as defined by the class. In addition to accessing the data, a member function may implicitly call another member function defined by the same class. For example:
// IDL
interface A
{
void f();
void g();
};
// C++
class MyA : public virtual POA_A
{
public:
void f() throw(SystemException);
void g() throw(SystemException);
private:
long x_;
};
void
MyA::f() throw(SystemException)
{
this->x_ = 3;
this->g();
}
However, when a servant member function is invoked in this
manner, it is being called simply as a C++ member function, not as
the implementation of an operation on a CORBA object. In such a
context, any information available via the POA_Current
object refers to the CORBA request invocation that performed the
C++ member function invocation, not to the member function
invocation itself.
Parent topic: Mappings