自定义实现IStream


// IStream.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include
  
  
   
   
#include
   
   
    
    
using namespace std;
class hInstance:public IStream
{
private:
	ULONG m_AddRef;
	char* m_buf;//缓冲区指针
	ULONG m_cur_position;//当前缓冲区的当前位置
public:
	hInstance()
	{
		m_AddRef=0;
		m_buf=NULL;
		m_cur_position=0;
	}
	~hInstance()
	{
		;
	}
public:
	ULONG _stdcall AddRef()
	{
		m_AddRef++;
		return m_AddRef;
	}
	ULONG _stdcall Release()
	{
		m_AddRef--;
		if(0==m_AddRef)
		{
			delete []m_buf;
			m_buf=NULL;
			delete this;
		}
		return m_AddRef;
	}
	STDMETHOD( QueryInterface)(REFIID riid,void** pUnk)
	{
		if(riid==IID_IUnknown)
		{
			*pUnk=(IUnknown*)reinterpret_cast
    
    
     
     (this);
			reinterpret_cast
     
     
      
      (this)->AddRef();			
			return S_OK;
		}
		else if(riid==IID_IStream)
		{


			*pUnk=(IStream*)reinterpret_cast
      
      
        (this); reinterpret_cast 
       
         (this)->AddRef(); return S_OK; }else return E_NOINTERFACE; } /// //函数名称:Seek //函数描述:定位内存操作 //函数参数:... //返回 值:HRESULT / STDMETHOD( Seek)( /* [in] */ LARGE_INTEGER dlibMove, /* [in] */ DWORD dwOrigin, /* [annotation] */ __out_opt ULARGE_INTEGER *plibNewPosition) { if(dwOrigin==STREAM_SEEK_SET) { //说明起始位置在开头dlibMove必须大于0 if(dlibMove.LowPart>strlen(m_buf)) { plibNewPosition=NULL; return E_INVALIDARG; } m_cur_position=dlibMove.LowPart; return S_OK; }else if(dwOrigin==STREAM_SEEK_CUR) { //说明起始位置在当前所指 plibNewPosition=NULL; if(dlibMove.LowPart+m_cur_position>strlen(m_buf)) { m_cur_position=0; return E_INVALIDARG; }else { m_cur_position+=dlibMove.LowPart; return S_OK; } }else if(dwOrigin==STREAM_SEEK_END) { //说明起始位置在末尾,dlibMove必须小于0 plibNewPosition=NULL; if(dlibMove.LowPart+m_cur_position>strlen(m_buf)) { m_cur_position=0; return E_INVALIDARG;; }else { m_cur_position+=dlibMove.LowPart; return S_OK; } } else return E_INVALIDARG; } //函数结束 /// //函数名称:Write //函数描述:向缓冲区中写入 //入口参数:无 //返回 值:HRESULT /// STDMETHOD(Write)( /* [annotation] */ __in_bcount(cb) const void *pv, /* [in] */ ULONG cb, /* [annotation] */ __out_opt ULONG *pcbWritten) { int str_len=0; char* tmp_buf=NULL; if(m_buf!=NULL) { str_len=strlen(m_buf); tmp_buf=new char[str_len+1]; memset(tmp_buf,0,str_len+1); strncpy(tmp_buf,(char*)pv,str_len); } int sum_len=str_len+strlen((char*)pv); delete m_buf; m_buf=NULL; m_buf=new char[sum_len+1]; memset(m_buf,0,sum_len); strncpy(m_buf,tmp_buf,str_len); strncpy(m_buf+str_len,(char*)pv,sum_len-str_len); delete tmp_buf; tmp_buf=NULL; return S_OK; } //函数结束 /// //函数名称:Read //函数描述:向缓冲区中写入 //入口参数:无 //返回 值:HRESULT /// STDMETHOD( Read)( /* [annotation] */ __out_bcount_part(cb, *pcbRead) void *pv, /* [in] */ ULONG cb, /* [annotation] */ __out_opt ULONG *pcbRead) { strncpy((char*)pv,m_buf,cb); return S_OK; } //函数结束 /// //函数名称:SetSize //函数描述:重新调整缓冲区大小 //入口参数:无 //返回 值:HRESULT /// STDMETHOD( SetSize)( /* [in] */ ULARGE_INTEGER libNewSize) { if(strlen(m_buf)>libNewSize.LowPart) { //要将缓冲区截断 m_buf[libNewSize.LowPart]='\0'; } else { //扩大缓冲区 char* tmp_buf=new char[strlen(m_buf)+1]; memset(tmp_buf,0,strlen(m_buf)+1); strcpy(tmp_buf,m_buf); delete m_buf; m_buf=NULL; m_buf=new char[libNewSize.LowPart]; strcpy(m_buf,tmp_buf); delete tmp_buf; tmp_buf=NULL; } return S_OK; } //函数结束 /// //函数名称:CopyTo //函数描述:将缓冲区的内容copy到pstm //入口参数:无 //返回 值:HRESULT /// STDMETHOD(CopyTo)( /* [unique][in] */ IStream *pstm, /* [in] */ ULARGE_INTEGER cb, /* [annotation] */ __out_opt ULARGE_INTEGER *pcbRead, /* [annotation] */ __out_opt ULARGE_INTEGER *pcbWritten) { return pstm->Write(m_buf,strlen(m_buf),NULL); } //函数结束 /// //函数名称:Clone //函数描述:将缓冲区的内容copy到pstm //入口参数:无 //返回 值:HRESULT /// STDMETHOD(Clone)( /* [out] */ __RPC__deref_out_opt IStream **ppstm) { return S_OK; } //函数结束 STDMETHOD( Commit)( /* [in] */ DWORD grfCommitFlags) { return S_OK; } STDMETHOD( Revert)( void) { return S_OK; } STDMETHOD( UnlockRegion)( /* [in] */ ULARGE_INTEGER libOffset, /* [in] */ ULARGE_INTEGER cb, /* [in] */ DWORD dwLockType) { return S_OK; } STDMETHOD( Stat)( /* [out] */ __RPC__out STATSTG *pstatstg, /* [in] */ DWORD grfStatFlag) { return S_OK; } STDMETHOD( LockRegion)( /* [in] */ ULARGE_INTEGER libOffset, /* [in] */ ULARGE_INTEGER cb, /* [in] */ DWORD dwLockType) { return S_OK; } }; int _tmain(int argc, _TCHAR* argv[]) { hInstance *tmp=new hInstance(); IStream*pstm=NULL; HRESULT hr=tmp->QueryInterface(IID_IStream,(void**)&pstm); hr=pstm->Write("dasdasd",strlen("dasdasd"),NULL); pstm->Release(); return 0; } 
        
      
     
     
    
    
   
   
  
  

以上就是我自定义实现的IStream接口,在windows控制台下即可实现,在此过程中多次出现不能实例化基类,其根本原因是有的虚函数你还没有实现!!,好了就到这了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现有两个类 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现的矩阵类 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、类型定死为double,原来作业是模板类,由于vc6对模版支持不好,另矩阵计算double类比较理想、整型几乎只能作加减 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator+=(const CVector & );//重载+=算符,向量加上向量 CVector operator-(const CVector & )const;//重载+运算符,向量加上向量 CVector& operator-=(const CVector & );//重载+=算符,向量加上向量 CVector operator+(const double α)const;//重载+运算符,向量加上实数alpna CVector& operator+=(const double α);//重载+=算符,向量加上实数alpha BOOL operator==(const CVector &)const;//重载==运算符 BOOL operator!=(const CVector &)const;//重载!=运算符 CMatrix //构造函数 CMatrix(); virtual ~CMatrix(); CMatrix(const CMatrix&);//拷贝构造函数 CMatrix(const size_t& n);//产生n阶单位阵 CMatrix(const size_t& nrow, const size_t& ncol);// CMatrix(const size_t& nrow, const size_t& ncol,const CVector& xdata);//产生nrow行,ncol列矩阵数据由xdata初始化 CMatrix(const size_t& nrow, const size_t& ncol,const double*const pData); CMatrix(const size_t& nrow, const size_t& ncol,const float* const pData); CMatrix(const size_t& nrow, const size_t& ncol,const int* const pData); //公开的成员函数 double At(const size_t& xr,const size_t& xc) const;//这个只能作为右值 CMatrix Trans()const;//A.T()返回矩阵A的转置副本 CVector diag()const;//矩阵上三角化后的对角向量//以此求矩阵的秩,矩阵的行列式等 double det()const;//求矩阵行列式 size_t rank()const;//矩阵的秩 CMatrix Inv()const;//求逆矩阵 inline BOOL IsNullMatrix()const{ return (BOOL)(m_nRowlen==0 || m_nCollen == 0);};//是否是空矩阵 BOOL IsSingularMatrix()const;//是否是奇异矩阵//即行列式为0 友函数 //科学计数法输出//想看较精确的数据的时候 friend void void PrintOut(const CMatrix& M,const size_t& nprecision = 6,std::ostream& os = std::cout); //产生的随机方阵,一般会是非异阵,供测试用 friend CMatrix randMatrix(const size_t &uSize;,int MAX);//随机产生n阶的方阵 //--------------------------重载部分-Overloaded Part---------------------------------- CMatrix& operator=(const CMatrix &);//重载=赋值运算符 double& operator()(size_t xr,size_t xc);//重载()运算符,A(i,j)即矩阵A的i行j列的元素, friend std::ostream & operator<<(std::ostream & ,const CMatrix &);//重载<<,可用cout输出矩阵 friend std::ostream & operator<<(std::ostream & ,const CVector&);//重载<<,可用cout输出向量 friend std::istream & operator>>(std::istream & CMatrix &);//重载>>,可用cin输入矩阵 CMatrix operator*(const double α)const;//重载*运算符,矩阵乘以实数alpha CVector operator*(const CVector &)const;//重载*运算符,矩阵乘以向量 CMatrix operator*(const CMatrix &)const;//重载*运算符,矩阵相乘 CMatrix& operator*=(const CMatrix &);//重载*=运算符 CMatrix operator^(const int α)const;//重载^幂运算符,A^alpha,alpha可以为负整数 CMatrix operator+(const CMatrix &)const;//重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==(const CMatrix &)const;//重载==运算符,判断矩阵是否相等 BOOL operator!=(const CMatrix &)const;//重载!=运算符,判断矩阵是否不相等 CVector operator/(const CVector &)const;//重载/除运算符,向量左除矩阵,求Ax=b的x向量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值