_INSTANTIATING CODE PATTERNS_ by Fred Wild Listing Two # Create the header file ... # :$$NEWFILE .hxx : :#ifndef _H :#define _H : :// Forward references for each class : .EAch_obj :class ; .ENd : :$$EXECMODULE emit_class_decls : :#endif : # Create the body file ... # :$$NEWFILE .cxx : :#include ".hxx" : :$$EXECMODULE emit_class_bodies : ################################################################### # Module to emit class declarations # .MOdule emit_class_decls .EAch_obj : :// :// Class -------------------------------- :// : :class \ :: \ .EAch_parent :\ :, : .ENd :{ :$$EXECMODULE emit_member_variables : : public: : : (); : (const & obj); : *makeCopy() const ; : virtual ~(); : : &operator=(const &rhs) ; : :$$EXECMODULE emit_attr_access_ftn_decls : :} ; .ENd .ENd ################################################################### # Modules to emit class member variable declarations # .MOdule emit_member_variables .EAch_attr : <30> m_ ; : <30> *m_ ; .ENd .ENd ################################################################### # Module to emit attribute access function declarations # .MOdule emit_attr_access_ftn_decls .EAch_attr :$$EXECMODULE emit_get_decl :$$EXECMODULE emit_set_decl : .ENd .ENd ################################################################### # Module to emit get functions for an attribute # .MOdule emit_get_decl : <35>Get () const ; : const & <35>Get () const; : const * <35>Get () const; .ENd ################################################################### # Module to emit set functions for an attribute # .MOdule emit_set_decl : void <35>Set(const val); : void <35>Set(const & val); : void <35>Set( *val) ; : void <35>Clear () ; .ENd ################################################################### # Module to emit the bodies of member functions for each class # .MOdule emit_class_bodies .EAch_obj : :////////////////////////////////////////////////////////// :// class :$$EXECMODULE emit_class_default_ctor :$$EXECMODULE emit_class_copy_ctor :$$EXECMODULE emit_class_destructor :$$EXECMODULE emit_assignment_op_body :$$EXECMODULE emit_get_and_set_ftn_bodies .ENd .ENd ################################################################### # Module to create a class' default constructor # .MOdule emit_class_default_ctor : :::() :{ .EAch_attr : m_ = NULL; : m_ = ; .ENd :} .ENd ################################################################### # Module to create a class' copy ctor and 'makeCopy' function # .MOdule emit_class_copy_ctor : :::(const & obj) : : \ .EAch_parent :(obj)\ :, : \ : .ENd :{ .EAch_attr : m_ = obj.m_; : m_ = obj.m_; : m_ = obj.m_->makeCopy(); .ENd :} : : *::makeCopy() const :{ : return new (*this); :} .ENd ################################################################### # Module to create a class' destructor # .MOdule emit_class_destructor : :::~() :{ .EAch_attr : delete m_ ; .ENd :} .ENd ################################################################### # Module to create a class' assignment operator # .MOdule emit_assignment_op_body : : & :::operator=(const &rhs) :{ : if (this == &rhs) return *this ; : // No changes if assignment to self : .EAch_parent : (( &) (*this)) = rhs ; : // Assign base class members of .ENd .EAch_attr : m_ = rhs.m_; : m_ = rhs.m_; : m_ = rhs.m_->makeCopy(); .ENd : : return *this ; :} .ENd ################################################################### # Module to create class member functions that access single valued member vars # .MOdule emit_get_and_set_ftn_bodies .EAch_attr :$$EXECMODULE emit_get_ftn_body :$$EXECMODULE emit_set_and_clear_ftn_bodies .ENd .ENd ################################################################### # Module to create a 'Get' function body for accessing an attribute # .MOdule emit_get_ftn_body : Get () const :const & Get () const :const * Get () const :{ : return m_ ; :} .ENd ################################################################### # Module to create a 'Set' and 'Clear' function bodies # .MOdule emit_set_and_clear_ftn_bodies :void Set (const val) :void Set (const & val) :void Set ( *val) :{ : = val ; : if ( != NULL) delete ; : = val ; :} : : :void Clear () :{ : if ( != NULL) delete ; : = NULL ; :} .ENd .ENd