本文共 3655 字,大约阅读时间需要 12 分钟。
1、在实际的运用中我们也会用到如下的类关系:
class B;class A{int i;B *lpb;}class B{int i;A* lpa;}
注意:一般来说,两者的定义,至少有一方是使用指针,或两者都使用指针,但是决不能两者都定义实体对象。
这样的实现,通俗地来说是 “你中有我,我中有你 ”,那么在具体运用时,我们可以将两个类所实现的含义联系起来,比如我们说A类的对象为一个一个的请求,B类对象表示会话(会话有相应的操作接口),此时只要A类和B类拥有对方的对象指针,如上代码所示,我们就可以将一个请求和一个会话,一一对应起来,当我们得到一个请求后,我们也就能得到这个请求对应的会话操作。
2、测试用例
class EventDownloadSession;class OpenModelEventDownload //该类我们可以提供给外部使用{public: OpenModelEventDownload(): bSynchronization(true) { } virtual ~OpenModelEventDownload() { } virtual void dealloc() { delete this; } static OpenModelEventDownload * alloc() { OpenModelEventDownload * lpValue = new OpenModelEventDownload(); lpValue->AddRef(); return lpValue; } inline void setFilePath(const char * value) { filePath = value; } inline const char * getFilePath() { return filePath.c_str(); } inline void setFileSize(size_t value) { fileSize = value; } inline size_t getFileSize() { return fileSize; } inline void setFileSeek(size_t value) { fileSeek = value; } inline size_t getFileSeek() { return fileSeek; } inline void setDownloadUrl(const char * value) { downloadUrl = value; } inline const char * getDownloadUrl() { return downloadUrl.c_str(); } inline void setDownloadProcess(int32_t value) { downloadProcess = value; } inline int32_t getDownloadProcess() { return downloadProcess; } inline void setSynchronization(bool value) { bSynchronization = value; } inline bool getSynchronization() { return bSynchronization; }//注意如下的两个接口 inline OpenCloud::EventDownloadSession * getEventDownloadSession() { return downloadSession; } inline void setEventDownloadSession(OpenCloud::EventDownloadSession *lpSession) { downloadSession = lpSession; }private: std::string filePath; size_t fileSize; size_t fileSeek; bool bSynchronization; std::string downloadUrl; int32_t downloadProcess; //[0,100] EventDownloadSession * downloadSession; //下一个对象指针};//基类class EventDownloadSession {public: EventDownloadSession(OpenCloud::OpenModelEventDownload *lpOpenModelEventDownload) :kOpenModelEventDownload(lpOpenModelEventDownload) {} virtual ~EventDownloadSession() {} virtual int stopSession() = 0;public: OpenCloud::OpenModelEventDownload *kOpenModelEventDownload; //上一个类的对象指针};//派生类class EventOperationDownloadSession : public EventDownloadSession{public: EventOperationDownloadSession(OpenCloud::OpenModelEventDownload *lpOpenModelEventDownload):EventDownloadSession(lpOpenModelEventDownload) { } virtual ~EventOperationDownloadSession() {} virtual void dealloc(void * ref) { delete this; } static EventOperationDownloadSession * alloc(OpenCloud::OpenModelEventDownload *lpOpenModelEventDownload) { EventOperationDownloadSession *lpEventOperationDownloadSession = new EventOperationDownloadSession(lpOpenModelEventDownload); return lpEventOperationDownloadSession; } virtual int Init(void * conf) { //do something return 0; } virtual int Close() { //do something return 0; } virtual int stopSession() { //do something return 0; }public: };int main(){ int iSsuccess =0; OpenModelEventDownload *lpOpenModelEventDownload = OpenModelEventDownload::alloc(); lpOpenModelEventDownload->setFilePath("/tmp/123456.mp4"); EventOperationDownloadSession *lpEventOperationDownloadSession = EventOperationDownloadSession::alloc(lpOpenModelEventDownload ); download->setEventDownloadSession(lpEventOperationDownloadSession); iSsuccess = lpEventOperationDownloadSession->Init(nullptr); //do something return 0;}
转载地址:http://hcqxi.baihongyu.com/