`
javayestome
  • 浏览: 1004560 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
  1. /*
  2. *=====================================================================================
  3. *
  4. *Filename:Frame_Pic.h
  5. *
  6. *Description:
  7. *
  8. *Version:1.0
  9. *Created:2009年01月08日15时57分43秒
  10. *Revision:none
  11. *Compiler:gcc
  12. *
  13. *Author:LiWeiJian(mn),lwj1396@163.com
  14. *Company:hunanuniversity
  15. *
  16. *=====================================================================================
  17. */
  18. #ifndef_FRAME_PIC_H
  19. #define_FRAME_PIC_H
  20. #include<iostream>
  21. #include"Picture.h"
  22. usingnamespacestd;
  23. namespacelwj
  24. {
  25. classFrame_Pic:publicP_Node
  26. {
  27. friendclassPicture;
  28. friendPictureframe(constPicture&);
  29. friendPicturereframe(constPicture&,char,char,char);
  30. Frame_Pic(constPicture&,char='+',char='|',char='-');
  31. intheight()const
  32. {
  33. returnp.height()+2;
  34. }
  35. intwidth()const
  36. {
  37. returnp.width()+2;
  38. }
  39. voiddisplay(ostream&,int,int)const;
  40. Picturedoreframe(char,char,char);
  41. Picturep;
  42. charcorner;
  43. charsideborder;
  44. chartopborder;
  45. };
  46. Frame_Pic::
  47. Frame_Pic(constPicture&pic,charc,chars,chart):
  48. p(pic),corner(c),sideborder(s),topborder(t)
  49. {}
  50. voidFrame_Pic::
  51. display(ostream&os,introw,intwd)const
  52. {
  53. if(row<0||row>=height())//越界
  54. pad(os,0,wd);
  55. else
  56. {
  57. if(row==0||row==height()-1)//顶框和底框
  58. {
  59. os<<corner;
  60. inti=p.width();
  61. while(--i>=0)os<<topborder;
  62. os<<corner;
  63. }else//内部行
  64. {
  65. os<<sideborder;
  66. p.display(os,row-1,p.width());
  67. os<<sideborder;
  68. }
  69. pad(os,width(),wd);
  70. }
  71. }
  72. PictureFrame_Pic::
  73. doreframe(charc,chars,chart)
  74. {
  75. returnnewFrame_Pic(reframe(this->p,c,s,t),c,s,t);
  76. }
  77. Pictureframe(constPicture&pic)
  78. {
  79. returnnewFrame_Pic(pic);//使用了隐式转型操作符
  80. }
  81. }
  82. #endif
  83. /*
  84. *=====================================================================================
  85. *
  86. *Filename:HCat_Pic.h
  87. *
  88. *Description:
  89. *
  90. *Version:1.0
  91. *Created:2009年01月08日16时00分54秒
  92. *Revision:none
  93. *Compiler:gcc
  94. *
  95. *Author:LiWeiJian(mn),lwj1396@163.com
  96. *Company:hunanuniversity
  97. *
  98. *=====================================================================================
  99. */
  100. #ifndefHCAT_PIC_H
  101. #defineHCAT_PIC_H
  102. #include"Picture.h"
  103. namespacelwj
  104. {
  105. classHCat_Pic:publicP_Node
  106. {
  107. friendPictureoperator|(constPicture&,constPicture&);
  108. friendPicturereframe(constPicture&,char,char,char);
  109. HCat_Pic(constPicture&,constPicture&);
  110. intheight()const
  111. {
  112. returnmax(left.height(),right.height());
  113. }
  114. intwidth()const
  115. {
  116. returnleft.width()+right.width();
  117. }
  118. voiddisplay(ostream&,int,int)const;
  119. Picturedoreframe(charc,chars,chart)
  120. {
  121. returnnewHCat_Pic(reframe(left,c,s,t),
  122. reframe(right,c,s,t));
  123. }
  124. private:
  125. Pictureleft,right;
  126. };
  127. HCat_Pic::
  128. HCat_Pic(constPicture&l,constPicture&r):
  129. left(l),right(r)
  130. {
  131. }
  132. voidHCat_Pic::
  133. display(ostream&os,introw,intwd)const
  134. {
  135. left.display(os,row,left.width());
  136. right.display(os,row,right.width());
  137. pad(os,width(),wd);
  138. }
  139. }
  140. #endif
  141. /*
  142. *=====================================================================================
  143. *
  144. *Filename:Picture2.cpp
  145. *
  146. *Description:图像处理,实现方案2,cpp沉思录第10章
  147. *
  148. *Version:1.0
  149. *Created:2009年01月08日14时09分56秒
  150. *Revision:none
  151. *Compiler:gcc
  152. *
  153. *Author:LiWeiJian(mn),lwj1396@163.com
  154. *Company:hunanuniversity
  155. *
  156. *=====================================================================================
  157. */
  158. #include<iostream>
  159. #include<string>
  160. #include"Picture.h"
  161. usingnamespacestd;
  162. usingnamespacelwj;
  163. intmain()
  164. {
  165. constchar*cs[]={"hello","world"};
  166. Picturep(cs,2);
  167. Pictureq=frame(p);
  168. cout<<frame(p|(q&p))<<endl;
  169. cout<<endl<<endl;
  170. cout<<reframe(frame(p|(q&p)),'^','~','*')<<endl;
  171. }
  172. /*
  173. *=====================================================================================
  174. *
  175. *Filename:Picture.cpp
  176. *
  177. *Description:
  178. *
  179. *Version:1.0
  180. *Created:2009年01月08日17时27分18秒
  181. *Revision:none
  182. *Compiler:gcc
  183. *
  184. *Author:LiWeiJian(mn),lwj1396@163.com
  185. *Company:hunanuniversity
  186. *
  187. *=====================================================================================
  188. */
  189. #include"Picture.h"
  190. #include"String_Pic.h"
  191. #include"Frame_Pic.h"
  192. #include"HCat_Pic.h"
  193. #include"VCat_Pic.h"
  194. namespacelwj
  195. {
  196. Picture::
  197. Picture(constchar*const*str,intn):
  198. p(newString_Pic(str,n))
  199. {}
  200. Picture::
  201. Picture(P_Node*p_node):p(p_node)
  202. {}
  203. Picture::
  204. Picture(constPicture&orig):p(orig.p)
  205. {
  206. orig.p->use++;
  207. }
  208. Picture::
  209. ~Picture()
  210. {
  211. if(--p->use==0)
  212. deletep;
  213. }
  214. Picture&Picture::
  215. operator=(constPicture&orig)
  216. {
  217. orig.p->use++;
  218. if(--p->use==0)
  219. deletep;
  220. p=orig.p;
  221. return*this;
  222. }
  223. intPicture::
  224. height()const
  225. {
  226. returnp->height();
  227. }
  228. intPicture::
  229. width()const
  230. {
  231. returnp->width();
  232. }
  233. voidPicture::
  234. display(ostream&o,intx,inty)const
  235. {
  236. p->display(o,x,y);
  237. }
  238. ostream&operator<<(ostream&os,constPicture&picture)
  239. {
  240. intht=picture.height();
  241. for(inti=0;i<ht;i++)
  242. {
  243. picture.display(os,i,picture.width());
  244. os<<endl;
  245. }
  246. returnos;
  247. }
  248. Picturereframe(constPicture&pic,charc,chars,chart)
  249. {
  250. returnpic.p->doreframe(c,s,t);
  251. }
  252. Pictureoperator|(constPicture&l,constPicture&r)
  253. {
  254. returnnewHCat_Pic(l,r);
  255. }
  256. Pictureoperator&(constPicture&t,constPicture&b)
  257. {
  258. returnnewVCat_Pic(t,b);
  259. }
  260. }
  261. /*
  262. *=====================================================================================
  263. *
  264. *Filename:Picture.h
  265. *
  266. *Description:第二次实现时候,每个类分开写
  267. *
  268. *Version:1.0
  269. *Created:2009年01月08日15时51分33秒
  270. *Revision:none
  271. *Compiler:gcc
  272. *
  273. *Author:LiWeiJian(mn),lwj1396@163.com
  274. *Company:hunanuniversity
  275. *
  276. *=====================================================================================
  277. */
  278. #ifndef_PICTURE_H
  279. #define_PICTURE_H
  280. #include<iostream>
  281. usingnamespacestd;
  282. namespacelwj
  283. {
  284. classP_Node;
  285. classPicture
  286. {
  287. friendostream&operator<<(ostream&,constPicture&);
  288. friendPictureframe(constPicture&);
  289. friendPictureoperator&(constPicture&,constPicture&);
  290. friendPictureoperator|(constPicture&,constPicture&);
  291. friendPicturereframe(constPicture&,char,char,char);
  292. friendclassString_Pic;
  293. friendclassFrame_Pic;
  294. friendclassHCat_Pic;
  295. friendclassVCat_Pic;
  296. public:
  297. Picture();
  298. Picture(constchar*const*,int);
  299. Picture(constPicture&);
  300. ~Picture();
  301. Picture&operator=(constPicture&);
  302. private:
  303. Picture(P_Node*);
  304. intheight()const;
  305. intwidth()const;
  306. voiddisplay(ostream&o,intx,inty)const;
  307. P_Node*p;
  308. };
  309. classP_Node
  310. {
  311. friendclassPicture;
  312. friendPicturereframe(constPicture&,char,char,char);
  313. protected:
  314. P_Node():use(1){}
  315. virtual~P_Node(){}
  316. virtualintheight()const=0;
  317. virtualintwidth()const=0;
  318. virtualvoiddisplay(ostream&,int,int)const=0;
  319. virtualPicturedoreframe(char,char,char)=0;
  320. intmax(intx,inty)const
  321. {
  322. returnx>y?x:y;
  323. }
  324. intuse;//引用计数,每个P_Node可以对应多个Picture
  325. };
  326. staticvoidpad(ostream&os,intx,inty)
  327. {
  328. for(inti=x;i<y;i++)
  329. os<<"";
  330. }
  331. }
  332. #endif
  333. /*
  334. *=====================================================================================
  335. *
  336. *Filename:String_Pic.h
  337. *
  338. *Description:
  339. *
  340. *Version:1.0
  341. *Created:2009年01月08日15时55分38秒
  342. *Revision:none
  343. *Compiler:gcc
  344. *
  345. *Author:LiWeiJian(mn),lwj1396@163.com
  346. *Company:hunanuniversity
  347. *
  348. *=====================================================================================
  349. */
  350. #ifndef_STRING_PIC_H
  351. #define_STRING_PIC_H
  352. #include"Picture.h"
  353. namespacelwj
  354. {
  355. classString_Pic:publicP_Node
  356. {
  357. friendclassPicture;
  358. String_Pic(constchar*const*,int);
  359. ~String_Pic(){}
  360. intheight()const
  361. {
  362. returnsize;
  363. }
  364. intwidth()const
  365. {
  366. intn=0;
  367. for(inti=0;i<size;i++)
  368. n=P_Node::max(n,strlen(data[i]));
  369. returnn;
  370. }
  371. voiddisplay(ostream&,int,int)const;
  372. Picturedoreframe(char,char,char)
  373. {
  374. use++;
  375. returnthis;
  376. }
  377. char**data;
  378. intsize;
  379. };
  380. String_Pic::
  381. String_Pic(constchar*const*p,intn):
  382. data(newchar*[n]),size(n)
  383. {
  384. for(inti=0;i<n;i++)
  385. {
  386. data[i]=newchar[strlen(p[i])+1];
  387. strcpy(data[i],p[i]);
  388. }
  389. }
  390. voidString_Pic::
  391. display(ostream&os,introw,intwidth)const
  392. {
  393. intstart=0;
  394. if(row>=0&&row<height())
  395. {
  396. os<<data[row];
  397. start=strlen(data[row]);
  398. }
  399. pad(os,start,width);
  400. }
  401. }
  402. #endif
  403. /*
  404. *=====================================================================================
  405. *
  406. *Filename:VCat_Pic.h
  407. *
  408. *Description:
  409. *
  410. *Version:1.0
  411. *Created:2009年01月08日15时59分07秒
  412. *Revision:none
  413. *Compiler:gcc
  414. *
  415. *Author:LiWeiJian(mn),lwj1396@163.com
  416. *Company:hunanuniversity
  417. *
  418. *=====================================================================================
  419. */
  420. #ifndef_VCAT_PIC_H
  421. #define_VCAT_PIC_H
  422. #include"Picture.h"
  423. namespacelwj
  424. {
  425. classVCat_Pic:publicP_Node
  426. {
  427. friendPictureoperator&(constPicture&,constPicture&);
  428. friendPicturereframe(constPicture&,char,char,char);
  429. friendclassPicture;
  430. VCat_Pic(constPicture&,constPicture&);
  431. intheight()const
  432. {
  433. returntop.height()+bottom.height();
  434. }
  435. intwidth()const
  436. {
  437. returnmax(top.width(),bottom.width());
  438. }
  439. voiddisplay(ostream&,int,int)const;
  440. Picturedoreframe(charc,chars,chart)
  441. {
  442. returnnewVCat_Pic(reframe(top,c,s,t),
  443. reframe(bottom,c,s,t));
  444. }
  445. Picturetop,bottom;
  446. };
  447. VCat_Pic::
  448. VCat_Pic(constPicture&t,constPicture&b):
  449. top(t),bottom(b)
  450. {}
  451. voidVCat_Pic::
  452. display(ostream&os,introw,intwd)const
  453. {
  454. if(row>=0&&row<top.height())
  455. top.display(os,row,wd);
  456. elseif(row<top.height()+bottom.height())
  457. bottom.display(os,row-top.height(),wd);
  458. else
  459. pad(os,0,wd);
  460. }
  461. }
  462. #endif
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics