博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++设计技巧(一)之两个类互相拥有对方的对象指针
阅读量:4165 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
linux内核引导参数解析及添加
查看>>
长短期记忆人工神经网络(LSTM)及其tensorflow代码应用
查看>>
长短期记忆人工神经网络(LSTM)网络学习资料
查看>>
运行网络中搜寻到的python程序代码——以长短期记忆人工神经网络(lstm)python代码为例
查看>>
闪存文件系统(Flash File System)
查看>>
WinMIPS64工具进行MIPS指令集实验(一)
查看>>
WinMIPS64工具进行MIPS指令集实验(二)
查看>>
Linux上快速入门英特尔Optane DC Persistent Memory Module的配置与使用
查看>>
Intel Optane DC Persistent Memory Module (PMM)详解
查看>>
Ubuntu 18.04安装英特尔Optane DC Persistent Memory Module配置工具ipmctl
查看>>
NUMA架构下的CPU拓扑结构
查看>>
如何判断变量在内存中如何放置的?低位在前还是高位在前
查看>>
c语言中通过指针将数值赋值到制定内存地址
查看>>
64位与32位linux c开发时默认字节对齐值
查看>>
malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)
查看>>
初始化时共享内存的key值和信号量初始化的key值可以一样
查看>>
linux创建线程之pthread_create
查看>>
pthread_attr_init线程通俗举例讲解与线程属性
查看>>
进程和线程的区别
查看>>
int main(int argc,char* argv[])详解,以及与int main()有什么区别
查看>>