/////////////////////////////////////////////////// // MT3Q7b.cpp - Node Destruction template Policy // // w/ template template parameter // // // // Jim Fawcett, CSE687 - Midterm, Spring 2010 // /////////////////////////////////////////////////// #include #include template class DP> class MNode { public: MNode(T t); ~MNode(); void addChild(MNode* pNode); T& value(); private: // won't define copy or assignment so make private MNode(const MNode& node); MNode& operator=(const MNode& node); std::vector*> children; T t_; }; template class DP> MNode::MNode(T t) : t_(t) {} template class DP> MNode::~MNode() { std::cout << "\n MNode destructor called"; for(size_t i=0; i >::GoodBye(children[i]); } template class DP> void MNode::addChild(MNode* pNode) { children.push_back(pNode); } template class DP> T& MNode::value() { return t_; } template class DeallocPolicy { public: static void GoodBye( T* pNode) { std::cout << "\n deleting MNode"; delete pNode; } }; template class NoDeallocPolicy { public: static void GoodBye(T* pNode) { std::cout << "\n not deleting MNode as it is on the stack"; } }; void main() { std::cout << "\n MT3Q7b Demonstration"; std::cout << "\n ======================"; MNode node1(1); MNode node2(2); MNode node3(3); MNode node4(4); MNode node5(5); node1.addChild(&node2); node1.addChild(&node3); node1.addChild(&node4); node1.addChild(&node5); MNode* pNode1 = new MNode< int, DeallocPolicy >(1); MNode* pNode2 = new MNode< int, DeallocPolicy >(2); MNode* pNode3 = new MNode< int, DeallocPolicy >(3); MNode* pNode4 = new MNode< int, DeallocPolicy >(4); MNode* pNode5 = new MNode< int, DeallocPolicy >(5); pNode1->addChild(pNode2); pNode1->addChild(pNode3); pNode1->addChild(pNode4); pNode1->addChild(pNode5); delete pNode1; std::cout << "\n"; }