⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frame_step06.txt

📁 用什么语言能编制出好的程序
💻 TXT
字号:
//*****************************************************
//		Step 6   
//		
//  Desc: 1) 定义Picture类的拷贝构造函数和赋值操作等函数,可
//	     考虑采用采用深复制(如使用虚克隆函数),还是使用引用计数。
//	  2) 本例使用引用计数
//	  3) 添加了AddRef() 和 ReleaseRef() 两个私有函数
//	  4) 在Node类中加私有use计数变量,为了AddRef()和Release()中
//	     访问use,让Picture类成为Node类的友员类。
//	  5) 实例化时,保证初始化use为1。
//	  6) 本例中,声明Picture时,还没有具体声明,应将Picture中
//            的定义放在类外。
//*****************************************************

//------------------  Pictures.cpp  ---------------------
#include "Pictures.h"

Picture::Picture(char ** array,int wd, int ht)
:pt(new DataPic(array,wd,ht)) 
{
}

Picture::~Picture()		
{
	ReleaseRef();
}
Picture::Picture(const Picture& rhs)
{
	pt=rhs.pt;
	AddRef();
}
Picture& Picture::operator=(const Picture& rhs)
{
	if (this==&rhs) return (*this);
	ReleaseRef();
	pt=rhs.pt;
	AddRef();
	return (*this);
}

int	 Picture::Width() const
{ 
	return pt->Width(); 
} 
int  Picture::Height() const
{
	return pt->Height();
}

void Picture::AddRef()
{
	++pt->use;
}
void Picture::ReleaseRef()
{
	if (--pt->use==0)
		delete pt;
}







//------------------  Pictures.h  ---------------------
#ifndef PICTURESH
#define PICTURESH

#include <iostream.h>
class Node;

class Picture
{
public:
	Picture(char ** array,int wd, int ht);
	~Picture();
	Picture(const Picture& rhs);
	Picture& operator=(const Picture& rhs);
	void Display() const;
public:
	void Display() const;
	int  Width() const;
	int  Height() const;
private:
	void AddRef();
	void ReleaseRef();	
private:
	Node *  pt;
};
//-------------------------------------------------------
class Node
{
	friend class Picture;
public:
	Node():use(1)   {}		//modified
	virtual ~Node()	{}
	virtual  void Display() const=0;
	virtual  int  Width()  const=0;
	virtual  int  Height() const=0;
protected:	
	static int max(int a,int b) {return a>b?a:b;}
private:
	int  use;
};
//------------------------------------------------------
class DataPic:public Node
{
public:
	DataPic(char ** array,int wd, int ht):w(wd),h(ht)
	{	
		data=new char[w*h];
		for (int i=0;i<h;i++)
			for (int j=0;j<w;j++)
				data[i*w+j]=array[i][j];

	}
	~DataPic()	{delete[] data;}
public:
	int		Width() const	{return w;}
	int		Height() const	{return h;}
private:
	DataPic(const DataPic& rhs);		//no define
	DataPic& operator=(const DataPic& rhs);	//no define
private:
	int		w;
	int		h;
	char *	data;
};
//------------------------------------------------------
class FramePic:public Node
{
public:
	FramePic(const Picture& rhs):kernel(rhs) {}  
	~FramePic() {}
	int Width() const	{return kernel.Width()+2;}
	int Height() const	{return kernel.Height()+2;}
private:
	Picture	kernel;
};
//------------------------------------------------------
class HCatPic:public Node
{
public:
	HCatPic(const Picture& lpic,const Picture& rpic)
		:left(lpic),right(rpic) {}	
	~HCatPic() {}

	int Width() const    {return left.Width()+right.Width();}
	int Height() const   {return max(left.Height(),right.Height());}
private:
	Picture		left;
	Picture		right;
};
//------------------------------------------------------
class VCatPic:public Node
{
public:
	VCatPic(const Picture& tpic,const Picture& bpic)
		:top(tpic),bottom(bpic) {}	
	~VCatPic() {}

	int Width() const  {return max(top.Width(),bottom.Width());}
	int Height() const {return top.Height()+bottom.Height();}
private:
	Picture		top;
	Picture		bottom;
};
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -