In Object Oriented languages there is no _wrapObj method exposed to the user. Instead, the same functionality is achieved simply by calling ``new'' on the Impl class. Interestingly, this means the constructor functionality is NOT placed in a Babel ctor method, but is, instead, actually in the default object constructor.
Here is the private data definition from wrapper_Data_Impl.hxx:
namespace wrapper {
class Data_impl : public virtual ::wrapper::Data
....
public:
char* d_string;
int d_int;
char* d_ctorTest;
....
}; // end class Data_impl
} // end namespace wrapper
Here is the client code from wraptest.cxx. Notice wrapper_Data_Impl
is included.
#include "wrapper_User.hxx"
#include "wrapper_Data.hxx"
#include "wrapper_Data_Impl.hxx"
int main(int argc, char **argv) {
wrapper::Data_impl data;
wrapper::User user = wrapper::User::_create();
ASSERT( data.d_ctorTest == "ctor was run");
/* Test the data setting*/
user.accept(data);
ASSERT( data.d_string == "Hello World!");
ASSERT( data.d_int == 3);
return 0;
}
Finally, the Impl code from wrapper_Data_Impl.cxx, notice where the
constructor code is placed.
// speical constructor, used for data wrapping(required).
// Do not put code here unless you really know what you're doing!
wrapper::Data_impl::Data_impl() : StubBase(reinterpret_cast<
void*>(::wrapper::Data::_wrapObj(this)),false) , _wrapped(true) {
// DO-NOT-DELETE splicer.begin(wrapper.Data._ctor2)
d_ctorTest = "ctor was run";
// DO-NOT-DELETE splicer.end(wrapper.Data._ctor2)
}
void wrapper::Data_impl::setString_impl (
/* in */const ::std::string& s ) {
// DO-NOT-DELETE splicer.begin(wrapper.Data.setString)
d_string = "Hello World!";
// DO-NOT-DELETE splicer.end(wrapper.Data.setString)
}
void wrapper::Data_impl::setInt_impl (
/* in */int32_t i )
{
// DO-NOT-DELETE splicer.begin(wrapper.Data.setInt)
d_int = 3;
// DO-NOT-DELETE splicer.end(wrapper.Data.setInt)
}