Modern C++ API: Don’t Declare Entities As Pointers
Entities, such as the DomainParticipant or the DataReader should never be created as pointers (i.e. using new
). They already implement reference semantics and behave like a shared_ptr
. A DomainParticipant
(or any other reference type in the API) is a wrapper of shared_ptr<DomainParticipantImpl>
.
Whenever you declare an Entity, as a class member, a local variable, etc., declare it as a regular variable, for example:
1 2 3 4 5 6 7 8 9 10 11 | class MyClass { ... // Correct declaration: DomainParticipant my_participant; // Don’t do this: // DomainParticipant * my_participant; // nor this: // shared_ptr<DomainParticipant> my_participant; }; |
This may force you to call a DomainParticipant
constructor in the constructors of MyClass
, for example:
1 2 3 4 5 6 7 8 9 | class MyClass { public : MyClass( int domain_id) : my_participant(domain_id) { } private : DomainParticipant my_participant; }; |
But if for some reason you can’t create the object right there, you can use the constructor that receives dds::core::null
(or nullptr
in C++11) and create the actual DomainParticipant
later:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class MyClass { public : MyClass() : my_participant(nullptr) { } int create_participant( int domain_id) { // Creates the DomainParticipant and assigns the reference // to my_participant. After this assignment, this DomainParticipant's // reference count is 1. my_participant = DomainParticipant(domain_id); } private : DomainParticipant my_participant; }; |
Note that the DomainParticipant
will be automatically deleted by MyClass
's implicit destructor, since we are not holding any other references to it other than my_participant
.