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