六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 39|回复: 0

图像模拟类第2次实现 c++沉思录 第十章

[复制链接]

升级  72.35%

801

主题

801

主题

801

主题

探花

Rank: 6Rank: 6

积分
2447
 楼主| 发表于 2013-1-26 13:45:28 | 显示全部楼层 |阅读模式
<div class="highlighter">

  • /*
  • *=====================================================================================
  • *
  • *Filename:Frame_Pic.h
  • *
  • *Description:
  • *
  • *Version:1.0
  • *Created:2009年01月08日15时57分43秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #ifndef_FRAME_PIC_H
  • #define_FRAME_PIC_H

  • #include<iostream>
  • #include"Picture.h"

  • usingnamespacestd;

  • namespacelwj
  • {

  • classFrame_Pic:publicP_Node
  • {
  • friendclassPicture;
  • friendPictureframe(constPicture&);
  • friendPicturereframe(constPicture&,char,char,char);

  • Frame_Pic(constPicture&,char='+',char='|',char='-');
  • intheight()const
  • {
  • returnp.height()+2;
  • }
  • intwidth()const
  • {
  • returnp.width()+2;
  • }
  • voiddisplay(ostream&,int,int)const;
  • Picturedoreframe(char,char,char);

  • Picturep;
  • charcorner;
  • charsideborder;
  • chartopborder;
  • };

  • Frame_Pic::
  • Frame_Pic(constPicture&pic,charc,chars,chart):
  • p(pic),corner(c),sideborder(s),topborder(t)
  • {}

  • voidFrame_Pic::
  • display(ostream&os,introw,intwd)const
  • {
  • if(row<0||row>=height())//越界
  • pad(os,0,wd);
  • else
  • {
  • if(row==0||row==height()-1)//顶框和底框
  • {
  • os<<corner;
  • inti=p.width();
  • while(--i>=0)os<<topborder;
  • os<<corner;
  • }else//内部行
  • {
  • os<<sideborder;
  • p.display(os,row-1,p.width());
  • os<<sideborder;
  • }
  • pad(os,width(),wd);
  • }
  • }

  • PictureFrame_Pic::
  • doreframe(charc,chars,chart)
  • {
  • returnnewFrame_Pic(reframe(this->p,c,s,t),c,s,t);
  • }


  • Pictureframe(constPicture&pic)
  • {
  • returnnewFrame_Pic(pic);//使用了隐式转型操作符
  • }

  • }

  • #endif
  • /*
  • *=====================================================================================
  • *
  • *Filename:HCat_Pic.h
  • *
  • *Description:
  • *
  • *Version:1.0
  • *Created:2009年01月08日16时00分54秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #ifndefHCAT_PIC_H
  • #defineHCAT_PIC_H

  • #include"Picture.h"


  • namespacelwj
  • {
  • classHCat_Pic:publicP_Node
  • {
  • friendPictureoperator|(constPicture&,constPicture&);
  • friendPicturereframe(constPicture&,char,char,char);

  • HCat_Pic(constPicture&,constPicture&);
  • intheight()const
  • {
  • returnmax(left.height(),right.height());
  • }
  • intwidth()const
  • {
  • returnleft.width()+right.width();
  • }
  • voiddisplay(ostream&,int,int)const;

  • Picturedoreframe(charc,chars,chart)
  • {
  • returnnewHCat_Pic(reframe(left,c,s,t),
  • reframe(right,c,s,t));
  • }

  • private:
  • Pictureleft,right;

  • };

  • HCat_Pic::
  • HCat_Pic(constPicture&l,constPicture&r):
  • left(l),right(r)
  • {
  • }

  • voidHCat_Pic::
  • display(ostream&os,introw,intwd)const
  • {
  • left.display(os,row,left.width());
  • right.display(os,row,right.width());
  • pad(os,width(),wd);
  • }

  • }
  • #endif

  • /*
  • *=====================================================================================
  • *
  • *Filename:Picture2.cpp
  • *
  • *Description:图像处理,实现方案2,cpp沉思录第10章
  • *
  • *Version:1.0
  • *Created:2009年01月08日14时09分56秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #include<iostream>
  • #include<string>

  • #include"Picture.h"

  • usingnamespacestd;
  • usingnamespacelwj;
  • intmain()
  • {
  • constchar*cs[]={"hello","world"};
  • Picturep(cs,2);
  • Pictureq=frame(p);
  • cout<<frame(p|(q&p))<<endl;
  • cout<<endl<<endl;

  • cout<<reframe(frame(p|(q&p)),'^','~','*')<<endl;
  • }
  • /*
  • *=====================================================================================
  • *
  • *Filename:Picture.cpp
  • *
  • *Description:
  • *
  • *Version:1.0
  • *Created:2009年01月08日17时27分18秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */
  • #include"Picture.h"

  • #include"String_Pic.h"
  • #include"Frame_Pic.h"
  • #include"HCat_Pic.h"
  • #include"VCat_Pic.h"

  • namespacelwj
  • {
  • Picture::
  • Picture(constchar*const*str,intn):
  • p(newString_Pic(str,n))
  • {}

  • Picture::
  • Picture(P_Node*p_node):p(p_node)
  • {}

  • Picture::
  • Picture(constPicture&orig):p(orig.p)
  • {
  • orig.p->use++;
  • }

  • Picture::
  • ~Picture()
  • {
  • if(--p->use==0)
  • deletep;
  • }

  • Picture&Picture::
  • operator=(constPicture&orig)
  • {
  • orig.p->use++;
  • if(--p->use==0)
  • deletep;
  • p=orig.p;
  • return*this;
  • }

  • intPicture::
  • height()const
  • {
  • returnp->height();
  • }

  • intPicture::
  • width()const
  • {
  • returnp->width();
  • }

  • voidPicture::
  • display(ostream&o,intx,inty)const
  • {
  • p->display(o,x,y);
  • }


  • ostream&operator<<(ostream&os,constPicture&picture)
  • {
  • intht=picture.height();
  • for(inti=0;i<ht;i++)
  • {
  • picture.display(os,i,picture.width());
  • os<<endl;
  • }
  • returnos;
  • }


  • Picturereframe(constPicture&pic,charc,chars,chart)
  • {
  • returnpic.p->doreframe(c,s,t);
  • }


  • Pictureoperator|(constPicture&l,constPicture&r)
  • {
  • returnnewHCat_Pic(l,r);
  • }



  • Pictureoperator&(constPicture&t,constPicture&b)
  • {
  • returnnewVCat_Pic(t,b);
  • }
  • }
  • /*
  • *=====================================================================================
  • *
  • *Filename:Picture.h
  • *
  • *Description:第二次实现时候,每个类分开写
  • *
  • *Version:1.0
  • *Created:2009年01月08日15时51分33秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #ifndef_PICTURE_H
  • #define_PICTURE_H

  • #include<iostream>

  • usingnamespacestd;

  • namespacelwj
  • {
  • classP_Node;
  • classPicture
  • {
  • friendostream&operator<<(ostream&,constPicture&);
  • friendPictureframe(constPicture&);
  • friendPictureoperator&(constPicture&,constPicture&);
  • friendPictureoperator|(constPicture&,constPicture&);
  • friendPicturereframe(constPicture&,char,char,char);

  • friendclassString_Pic;
  • friendclassFrame_Pic;
  • friendclassHCat_Pic;
  • friendclassVCat_Pic;

  • public:
  • Picture();
  • Picture(constchar*const*,int);
  • Picture(constPicture&);
  • ~Picture();

  • Picture&operator=(constPicture&);

  • private:
  • Picture(P_Node*);
  • intheight()const;
  • intwidth()const;
  • voiddisplay(ostream&o,intx,inty)const;
  • P_Node*p;
  • };


  • classP_Node
  • {
  • friendclassPicture;
  • friendPicturereframe(constPicture&,char,char,char);

  • protected:
  • P_Node():use(1){}
  • virtual~P_Node(){}
  • virtualintheight()const=0;
  • virtualintwidth()const=0;
  • virtualvoiddisplay(ostream&,int,int)const=0;
  • virtualPicturedoreframe(char,char,char)=0;
  • intmax(intx,inty)const
  • {
  • returnx>y?x:y;
  • }
  • intuse;//引用计数,每个P_Node可以对应多个Picture
  • };

  • staticvoidpad(ostream&os,intx,inty)
  • {
  • for(inti=x;i<y;i++)
  • os<<"";
  • }
  • }
  • #endif

  • /*
  • *=====================================================================================
  • *
  • *Filename:String_Pic.h
  • *
  • *Description:
  • *
  • *Version:1.0
  • *Created:2009年01月08日15时55分38秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #ifndef_STRING_PIC_H
  • #define_STRING_PIC_H

  • #include"Picture.h"

  • namespacelwj
  • {
  • classString_Pic:publicP_Node
  • {
  • friendclassPicture;

  • String_Pic(constchar*const*,int);
  • ~String_Pic(){}

  • intheight()const
  • {
  • returnsize;
  • }
  • intwidth()const
  • {
  • intn=0;
  • for(inti=0;i<size;i++)
  • n=P_Node::max(n,strlen(data));
  • returnn;
  • }
  • voiddisplay(ostream&,int,int)const;

  • Picturedoreframe(char,char,char)
  • {
  • use++;
  • returnthis;
  • }

  • char**data;
  • intsize;
  • };

  • String_Pic::
  • String_Pic(constchar*const*p,intn):
  • data(newchar*[n]),size(n)
  • {
  • for(inti=0;i<n;i++)
  • {
  • data=newchar[strlen(p)+1];
  • strcpy(data,p);
  • }
  • }

  • voidString_Pic::
  • display(ostream&os,introw,intwidth)const
  • {
  • intstart=0;
  • if(row>=0&&row<height())
  • {
  • os<<data[row];
  • start=strlen(data[row]);
  • }
  • pad(os,start,width);
  • }

  • }
  • #endif
  • /*
  • *=====================================================================================
  • *
  • *Filename:VCat_Pic.h
  • *
  • *Description:
  • *
  • *Version:1.0
  • *Created:2009年01月08日15时59分07秒
  • *Revision:none
  • *Compiler:gcc
  • *
  • *Author:LiWeiJian(mn),lwj1396@163.com
  • *Company:hunanuniversity
  • *
  • *=====================================================================================
  • */

  • #ifndef_VCAT_PIC_H
  • #define_VCAT_PIC_H

  • #include"Picture.h"

  • namespacelwj
  • {
  • classVCat_Pic:publicP_Node
  • {
  • friendPictureoperator&(constPicture&,constPicture&);
  • friendPicturereframe(constPicture&,char,char,char);
  • friendclassPicture;

  • VCat_Pic(constPicture&,constPicture&);
  • intheight()const
  • {
  • returntop.height()+bottom.height();
  • }
  • intwidth()const
  • {
  • returnmax(top.width(),bottom.width());
  • }
  • voiddisplay(ostream&,int,int)const;
  • Picturedoreframe(charc,chars,chart)
  • {
  • returnnewVCat_Pic(reframe(top,c,s,t),
  • reframe(bottom,c,s,t));
  • }

  • Picturetop,bottom;
  • };

  • VCat_Pic::
  • VCat_Pic(constPicture&t,constPicture&b):
  • top(t),bottom(b)
  • {}

  • voidVCat_Pic::
  • display(ostream&os,introw,intwd)const
  • {
  • if(row>=0&&row<top.height())
  • top.display(os,row,wd);
  • elseif(row<top.height()+bottom.height())
  • bottom.display(os,row-top.height(),wd);
  • else
  • pad(os,0,wd);
  • }



  • }
  • #endif

您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表