///////////////////////////////////////////////////////////////////////// // Display.cpp #include #include #include "HelpNode.h" using namespace VSHelpS09; /////////////////////////////////////////////////////////////////// // To do: convert private Display class to public Tree class /////////////////////////////////////////////////////////////////// // Visit nodes, display their values, clean up visitation marks class Display { public: virtual ~Display() {} virtual void show(Node* pParent, Node* pChild)=0; // makes abstract void walk(Node* pNode); void clearMarks(); private: std::vector nodes; }; //-- visit nodes in "tree" void Display::walk(Node* pParent) { nodes.push_back(pParent); Node* pChild; for(size_t i=0; isize(); ++i) { pChild = pParent->nextUnmarkedChild(); if(pChild != 0) { show(pParent,pChild); walk(pChild); } } } //-- unmark all nodes to prepare for next visitation void Display::clearMarks() { for(size_t i=0; iisMarked() = false; } ///////////////////////////////////////////////////////////////// // Specialize Display class TestDisplay : public Display { public: virtual void show(Node* pParent, Node* pChild) { std::cout << "\n " << (pChild->value()).c_str(); std::cout << " with Parent " << (pParent->value()).c_str(); } }; void main() { std::cout << "\n Testing Display class"; std::cout << "\n =======================\n"; TestDisplay td; Node root("root"); Node child1("child1"); Node child2("child2"); Node grandchild11("grandchild11"); child1.add(&grandchild11); root.add(&child1); root.add(&child2); std::cout << "\n walking connected nodes"; td.walk(&root); td.clearMarks(); Node grandchild21("grandchild21"); Node grandchild22("grandchild22"); child2.add(&grandchild21); child2.add(&grandchild22); std::cout << "\n\n walking connected nodes"; td.walk(&root); std::cout << "\n\n"; }