C++设计模式之相互包含的类
实际情况中,经常会用到两个相互访问的类,当然这种情况最好能避免,但有时候是必须的。
一种情景:Manager要安排一些任务给Worker,但Worker工作起来是异步模式的(Manager安排完任务就去忙别的事情了,不会等待Worker工作完成),Worker需要在任务完成后通知Manager以便Manager能够掌握公司的总体运营情况。
技术实现:如果是窗口的话,可以给各自关联的句柄SendMessage,但大多数情况下,Manager和Worker都是功能类,没有句柄的。
如果头文件相互包含,编译器会报错的。
耍点小聪明吧:
Manager.h中包含Worker.h 并且Manager的成员包括几个Worker
Worker.h中 前向声明 class Manager(这时候如果编译,编译器会报错:Manager类声明了但是没有实现),然后在Worker.cpp中包含Manager.h(.cpp文件时不会被include的)
同时因为Worker在JobDone后反馈给Manager,因此Manger在OrderWork的时候要传进来一个本身的线索,这样Worker才能找到Manager的办公室啊:)
+PS+: 后来又想到一种方法,使用第三方的一个类。将两个对象都传递给第三方的一个对象,也可以。
Manager.h:
#pragma once #include "Worker.h" class CManager { public: CManager(char* name); ~CManager(void); void OrderWork(); void Roger(); public: CString m_name; CWorker* m_worker; };
Manager.cpp:
#include "Manager.h" #include "stdafx.h" CManager::CManager(char* name) { m_name = name; m_worker = new CWorker("Peter"); } CManager::~CManager(void) { } void CManager::OrderWork() { CString str; str = "I'm Manger "; str += m_name.GetBuffer(); str += ". Now i give some work to Peter(my worker): "; wcout<<str.GetBuffer()<<endl; m_worker->DoJob(this); } void CManager::Roger() { CString str; str = "I'm Manager "; str += m_name.GetBuffer(); str += ". i just received a job-done report from Peter."; wcout<<str.GetBuffer()<<endl; }
Worker.h:
#pragma once #include "stdafx.h" class CManager; //forward declaration class CWorker { public: CWorker(char* name); ~CWorker(void); void DoJob(CManager* who2report); void JobIsDone(CManager* who2report); private: CString m_name; };
Worker.cpp:
#include "Worker.h" #include "stdafx.h" #include "Manager.h" CWorker::CWorker(char* name) { m_name = name; } CWorker::~CWorker(void) { } void CWorker::DoJob(CManager* who2report) { CString str; str = "I'm "; str += m_name.GetBuffer(); str += ". And now i'm doing my job.."; wcout<<str.GetBuffer()<<endl; int last = 100000; while(last--); JobIsDone(who2report); } void CWorker::JobIsDone(CManager* who2report) { CString str; str = "I'm "; str += m_name.GetBuffer(); str += ". My job is done."; wcout<<str.GetBuffer()<<endl; who2report->Roger(); }
测试代码:
#include "stdafx.h" #include "Manager.h" void main() { CManager man1("Boss1"); man1.OrderWork(); cout<<endl; CManager man2("Boss2"); man2.OrderWork(); system("pause"); }
运行结果:
I'm Manger Boss1. Now i give some work to Peter(my worker):
I'm Peter. And now i'm doing my job..
I'm Peter. My job is done.
I'm Manager Boss1. i just received a job-done report from Peter.
I'm Manger Boss2. Now i give some work to Peter(my worker):
I'm Peter. And now i'm doing my job..
I'm Peter. My job is done.
I'm Manager Boss2. i just received a job-done report from Peter.
请按任意键继续. . .

浙公网安备 33010602011771号