///////////////////////////////////////////////////////////////////// // Executive.cpp - directs execution of all program tasks // #include "Executive.h" #include <iostream> /*----< implicitly calls constructors for composed members >-------*/ Executive::Executive() { std::cout << "\n Executive starting up"; } /*----< implicitly calls destructiors for composed members >-------*/ Executive::~Executive() { std::cout << "\n Executive shutting down"; } /*----< directs execution of application >-------------------------*/ void Executive::doWork() { std::cout << "\n Executive doing a small amount of work"; safeInvoke(t1, &Task1::doWork, __LINE__); safeInvoke(t2, &Task2::doWork, __LINE__); safeInvoke(t3, &Task3::doWork, __LINE__); ////////////////////////////////////////////////////////// // could use the calls, below, but that // won't trap exceptions that could be thrown // t1.doWork(); // t2.doWork(); } /*----< defines ATest's pure virtual test method >-----------------*/ bool Executive::test() { return t1.testPackage() && t2.testPackage(); } /*----< private test application test class focused on test >------*/ /* * often test class will do some test specific initialization */ class TestExecutive : public ATest { public: TestExecutive() { std::cout << "\n Testing Executive"; std::cout << "\n ==================="; } /*----< invokes executive testPackage >--------------------------*/ /* * - Executive::testPackage() invokes the testPackage function * for each composed member, e.g., Task1 and Task2. * - This causes a chaining of tests for the entire application. */ bool test() { Executive ex; return ex.testPackage(); } }; ///////////////////////////////////////////////////////////////////// // Cosmetic struct simply ensures that program output text // ends with two newlines struct Cosmetic { ~Cosmetic() { std::cout << "\n\n"; } }; /*----< application entry point >----------------------------------*/ int main(int argc, char* argv[]) { Cosmetic cos; // first object constructed is last to be destroyed std::cout << "\n Demonstrating Executive"; std::cout << "\n ========================="; Executive ex; ex.doWork(); std::cout << "\n"; TestExecutive te; if (te.test()) std::cout << "\n--Executive and its minions passed their tests"; else std::cout << "\n--Executive or at least one of its minions failed their tests"; }