diff options
Diffstat (limited to 'ACE/examples/Smart_Pointers/Gadget_Part_Impl.h')
-rw-r--r-- | ACE/examples/Smart_Pointers/Gadget_Part_Impl.h | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/ACE/examples/Smart_Pointers/Gadget_Part_Impl.h b/ACE/examples/Smart_Pointers/Gadget_Part_Impl.h new file mode 100644 index 00000000000..bcacb84f0c9 --- /dev/null +++ b/ACE/examples/Smart_Pointers/Gadget_Part_Impl.h @@ -0,0 +1,64 @@ +/* -*- C++ -*- */ +//============================================================================= +/** + * @file Gadget_Part_Impl.h + * + * $Id$ + * + * @author Christopher Kohlhoff <chris@kohlhoff.com> + */ +//============================================================================= + +#ifndef GADGET_PART_IMPL_H +#define GADGET_PART_IMPL_H + +#include "Gadget_Part.h" +#include "Gadget.h" + +/** + * @class Gadget_Part_Impl + * + * @brief An implementation of the Gadget_Part interface. + */ +class Gadget_Part_Impl : public Gadget_Part +{ +public: + /// Constructor. + Gadget_Part_Impl (Gadget_ptr owner, const char* name, int size); + + /// Destructor. + virtual ~Gadget_Part_Impl (void); + + /// Ask the part to print information about itself. + virtual void print_info (void); + + /// Ask the part to remove itself from the gadget that contains it. + virtual void remove_from_owner (void); + +private: + /// The gadget that contains this part. + /// + /// Some things to note about the choice of ACE_Weak_Bound_Ptr (from the + /// typedef for Gadget_ptr): + /// - We cannot use an ACE_Strong_Bound_Ptr (Gadget_var) since that would + /// result in circular ownership. + /// - If we use a raw pointer we have no circular ownership problems, but we + /// are unable to guarantee the lifetime of the owner object for the + /// duration of the remove_from_owner call. This may not be a problem in + /// this limited example, but in multithreaded programs remove_from_owner + /// may be called from a different thread to the thread which manages the + /// owner's lifetime. + /// - ACE_Weak_Bound_Ptr (Gadget_ptr) has no ownership semantics, so we have + /// no circular ownership problems. Weak pointers can also be converted + /// back into strong ones, so it is possible to guarantee the lifetime of + /// the owner object for the duration of the remove_from_owner call. + Gadget_ptr owner_; + + /// The name of this part. + char *name_; + + /// The size of this part. + int size_; +}; + +#endif /* GADGET_PART_IMPL_H */ |