c++沉思录第十章的例子

2023-12-06 10:19
文章标签 c++ 第十章 例子 沉思

本文主要是介绍c++沉思录第十章的例子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于虚函数和纯虚函数的知识需要我们好好注意。
#ifndef NEWPICTURE_H
#define NEWPICTURE_H
#include<iostream>
using namespace std;
class P_Node
{friend class Picture;
protected:P_Node();virtual ~P_Node(){};virtual int width()const=0;virtual int height()const=0;	virtual void display(ostream &, int, int)const=0;int max(int x, int y)const { return x > y ? x : y; }void pad(ostream & os, int x, int y)const ;
private:int use;
};
class Picture
{friend class String_Pic;friend class Frame_Pic;friend class Hcat_Pic;friend class Vcat_Pic;
public:Picture();Picture(const char * const *, int);Picture(const Picture &);~Picture();Picture & operator =(const Picture &);P_Node * p;Picture(P_Node * m);int height()const;int width()const;void display(ostream &, int, int)const;friend ostream & operator <<(ostream & os, const Picture & p);friend Picture frame(const Picture & p);friend Picture operator & (const Picture & p, const Picture & q);friend Picture operator | (const Picture & p, const Picture & q);
};
class String_Pic :public P_Node
{friend class Picture;String_Pic(const char* const * arr, int n);~String_Pic();char** data;int size;int height()const;int width()const;void display(ostream &, int, int)const;
};class Frame_Pic :public P_Node
{friend Picture frame(const Picture &);int height()const;int width()const;void display(ostream &, int, int)const;Frame_Pic(const Picture &);Picture p;
};class Vcat_Pic :public P_Node
{friend Picture operator &(const Picture & n, const Picture & m);Vcat_Pic(const Picture & n, const Picture & m);int height()const;int width()const;void display(ostream &, int, int)const;Picture top, bottom;
};class Hcat_Pic :public P_Node
{friend Picture operator |(const Picture & n, const Picture & m);Hcat_Pic(const Picture & n, const Picture & m);int height()const;int width()const;void display(ostream &, int, int)const;Picture left,right;
};Picture::Picture(const Picture & m) :p(m.p)
{m.p->use++;
}
Picture::Picture(P_Node * m) : p(m){}
Picture::~Picture()
{if (--p->use == 0)delete p;
}
Picture& Picture::operator=(const Picture & q)
{q.p->use++;if (--p->use == 0)delete p;p = q.p;return *this;
}
int Picture::height()const{ return p->height(); }
int Picture::width()const { return p->width(); }
void Picture::display(ostream & os, int n, int m)const
{p->display(os, n, m);
}
Picture::Picture(const char* const * arr, int n) :p(new String_Pic(arr, n)){}
P_Node::P_Node() :use(1){}String_Pic::String_Pic(const char * const * arr, int n)
: data(new char*[n]), size(n)
{for (int i = 0; i < n; ++i){data[i] = new char[strlen(arr[i]) + 1];strcpy_s(data[i],strlen(arr[i])+1,arr[i]);}
}
String_Pic::~String_Pic()
{for (int i = 0; i < size; ++i)delete[]data[i];delete[]data;}
int String_Pic::height()const{ return size; }
int String_Pic::width()const
{int n = 0;for (int i = 0; i < size; ++i)n = max(n, strlen(data[i]));return n;
}void String_Pic::display(ostream & os, int row, int width)const
{int start = 0;if (row >= 0 && row < height()){os << data[row];start = strlen(data[row]);}pad(os, start, width);
}
int Frame_Pic::height()const{ return p.height() + 2; }
int Frame_Pic::width()const{ return p.width() + 2; }
void Frame_Pic::display(ostream& os, int row, int wd)const
{if (row < 0 || row >= height()){pad(os, 0, wd);}else{if ( 0 == row  || row == height() - 1){os << "+";int i = p.width();while (--i >= 0)os << "-";os << "+";}else{os << "|";p.display(os, row - 1, p.width());os << "|";}pad(os, width(), wd);}
}
Frame_Pic::Frame_Pic(const Picture & m) :p(m){}
Picture frame(const Picture & m)
{return new Frame_Pic(m);
}
Vcat_Pic::Vcat_Pic(const Picture & t, const Picture & b) : top(t), bottom(b){}
Hcat_Pic::Hcat_Pic(const Picture & l, const Picture & r) : left(l),right(r){}
Picture operator &(const Picture & n, const Picture & m)
{return new Vcat_Pic(n, m);
}
Picture operator |(const Picture & n, const Picture & m)
{return new Hcat_Pic(n, m);
}
int Vcat_Pic::height()const{ return top.height() + bottom.height(); }
int Vcat_Pic::width()const{ return max(top.width(), bottom.width()); }
int Hcat_Pic::height()const{ return max(left.height(), right.height()); }
int Hcat_Pic::width()const{ return left.width()+ right.width(); }
void Vcat_Pic::display(ostream& os, int row, int wd)const
{if (row >= 0 && row < top.height())top.display(os, row, wd);else{if (row < top.height() + bottom.height())bottom.display(os, row - top.height(), wd);elsepad(os, 0, wd);}
}
void Hcat_Pic::display(ostream & os, int row, int wd)const
{left.display(os, row, left.width());right.display(os, row, right.width());pad(os, width(), wd);
}
void P_Node::pad(ostream & os, int x, int y)const
{for (int i = x; i < y; ++i)os << " ";
}ostream & operator <<(ostream & os, const Picture & p)
{int ht = p.height();for (int i = 0; i < ht; ++i){	p.display(os, i, 0); os << endl;}return os;
}
#endif
#include"NewPicture.h"
#include<iostream>
using namespace std;
int main()
{char * init[] = { "Summer", "love", "Xieweizhong" };Picture p(init, 3);cout << p << endl;cout << frame((p | frame(p)) | (p | frame(p))) << endl;cout << frame((p & frame(p)) | (p | frame(p))) << endl;cout << frame((p | frame(p)) | (p & frame(p))) << endl;cout << frame((p & frame(p)) | (p & frame(p))) << endl;cout << frame((p | frame(p)) & (p | frame(p))) << endl;cout << frame((p & frame(p)) & (p | frame(p))) << endl;cout << frame((p | frame(p)) & (p & frame(p))) << endl;cout << frame((p & frame(p)) & (p & frame(p))) << endl;return 0;
}


这篇关于c++沉思录第十章的例子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/461472

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf