Essential C++ 第五章代码
2013-11-10 23:17
183 查看
版本一(5.1~5.6内容)
版本二(5.7~5.10)
版本二中,return typeid(*this).name(),会分别返回"9Fibonacci","10Triangular",前面的数字表示的是后面字符串的长度....怎么去掉..不知.....
#include <iostream> #include <vector> using namespace std; class num_sequence{ public: virtual ~num_sequence() {}; virtual int elem(int pos) const = 0; virtual const char* what_am_i() const = 0; static int max_elem() { return _max_elems;} virtual ostream& print(ostream &os = cout ) const = 0; protected: virtual void gen_elems(int pos) const = 0; bool check_integrity(int pos, int size) const; const static int _max_elems = 25; }; bool num_sequence::check_integrity(int pos,int size) const { if (pos <= 0 || pos >= _max_elems) { cerr << "!! invalid position: " << pos << " Cannot honor request.\n"; return false; } if (pos > size) gen_elems(pos); return true; } ostream& operator<<( ostream &os, const num_sequence &ns) { return ns.print( os); } class Fibonacci:public num_sequence{ public: Fibonacci( int len = 1, int beg_pos = 1) : _length(len), _beg_pos(beg_pos) {} virtual int elem(int pos) const; virtual const char* what_am_i() const { return "Fibonacci";} virtual ostream& print( ostream &os = cout) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;} protected: virtual void gen_elems(int pos) const; int _length; int _beg_pos; static vector<int> _elems; }; vector<int> Fibonacci::_elems; int Fibonacci::elem(int pos) const { if (! check_integrity(pos,_elems.size())) return 0; return _elems[pos-1]; } void Fibonacci::gen_elems(int pos) const { if (_elems.empty()) { _elems.push_back(1); cout << "gen_elems: 1\n"; _elems.push_back(1); cout << "gen_elems: 1\n"; } if (_elems.size() <= (unsigned)pos) { int ix = _elems.size(); int n_2 = _elems[ix-2]; int n_1 = _elems[ix-1]; for(; ix < pos; ++ix) { int elem = n_2 + n_1; cout << "gen_elems: " <<elem << endl; _elems.push_back(elem); n_2 = n_1; n_1 = elem; } } } ostream& Fibonacci::print(ostream &os) const { int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _elems.size() ) Fibonacci::gen_elems(end_pos); while (elem_pos < end_pos) os << _elems[elem_pos++] << ' '; return os; } class Triangular:public num_sequence{ public: Triangular( int len = 1, int beg_pos = 1) : _length(len), _beg_pos(beg_pos) {} virtual int elem(int pos) const; virtual const char* what_am_i() const { return "Triangular";} virtual ostream& print( ostream &os = cout) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;} protected: virtual void gen_elems(int pos) const; int _length; int _beg_pos; static vector<int> _elems; }; vector<int> Triangular::_elems; int Triangular::elem(int pos) const { if (! check_integrity(pos,_elems.size())) return 0; return _elems[pos-1]; } void Triangular::gen_elems(int pos) const { if (_elems.size() <= (unsigned)pos) { int ix = _elems.size() ? _elems.size()+1 : 1; for( ; ix <= pos; ++ix) { _elems.push_back(ix*(ix+1)/2); cout << "gen_elems: " << *(--_elems.end()) << endl; } } } ostream& Triangular::print(ostream &os) const { int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _elems.size() ) Triangular::gen_elems(end_pos); while (elem_pos < end_pos) os << _elems[elem_pos++] << ' '; return os; } inline void display(const num_sequence &ns, int pos, ostream &os = cout) { os << "The element at position " << pos << " for the " << ns.what_am_i() << " sequence is " << ns.elem(pos) << endl; } int main() { Fibonacci fib; cout << fib << endl << endl; Fibonacci fib2(6); cout << fib2 << endl << endl; Fibonacci fib3(5,8); cout << fib3 << endl; cout << fib3.elem(20) << endl; Triangular tri(2,5); cout << tri << endl; display(tri,20); }
版本二(5.7~5.10)
#include <iostream> #include <vector> #include <typeinfo> using namespace std; class num_sequence{ public: virtual ~num_sequence() {}; // virtual const char* what_am_i() const = 0; int elem(int pos) const; int length() const { return _length;} int beg_pos() const { return _beg_pos;} static int max_elem() { return _max_elems;} ostream& print(ostream &os = cout ) const; inline const char* what_am_i() const { return typeid(*this).name();} protected: // virtual void gen_elems(int pos) const = 0; bool check_integrity(int pos, int size) const; virtual void gen_elems(int pos) const = 0; const static int _max_elems = 25; num_sequence(int len, int bp, vector<int> &re ) : _length(len), _beg_pos(bp), _relems(re) {} int _length; int _beg_pos; vector<int> &_relems; }; bool num_sequence::check_integrity(int pos,int size) const { if (pos <= 0 || pos >= _max_elems) { cerr << "!! invalid position: " << pos << " Cannot honor request.\n"; return false; } if (pos > size) gen_elems(pos); return true; } int num_sequence::elem(int pos) const { if (! check_integrity(pos,_relems.size())) return 0; return _relems[pos-1]; } ostream& num_sequence::print(ostream &os) const { int elem_pos = _beg_pos - 1; int end_pos = elem_pos + _length; if ( (unsigned)end_pos > _relems.size() ) gen_elems(end_pos); os << what_am_i() << " (" << length() << "," << beg_pos() << "): " ; while (elem_pos < end_pos) os << _relems[elem_pos++] << ' '; return os; } class Fibonacci:public num_sequence{ public: Fibonacci( int len = 1, int beg_pos = 1) : num_sequence(len, beg_pos, _elems) {} // virtual const char* what_am_i() const { return "Fibonacci";} protected: virtual void gen_elems(int pos) const; static vector<int> _elems; }; vector<int> Fibonacci::_elems; void Fibonacci::gen_elems(int pos) const { if (_elems.empty()) { _elems.push_back(1); // cout << "gen_elems: 1\n"; _elems.push_back(1); // cout << "gen_elems: 1\n"; } if (_elems.size() <= (unsigned)pos) { int ix = _elems.size(); int n_2 = _elems[ix-2]; int n_1 = _elems[ix-1]; for(; ix < pos; ++ix) { int elem = n_2 + n_1; // cout << "gen_elems: " <<elem << endl; _elems.push_back(elem); n_2 = n_1; n_1 = elem; } } } class Triangular:public num_sequence{ public: Triangular( int len = 1, int beg_pos = 1) : num_sequence(len, beg_pos, _elems) {} // virtual const char* what_am_i() const { return "Triangular";} protected: virtual void gen_elems(int pos) const; static vector<int> _elems; }; vector<int> Triangular::_elems; void Triangular::gen_elems(int pos) const { if (_elems.size() <= (unsigned)pos) { int ix = _elems.size() ? _elems.size()+1 : 1; for( ; ix <= pos; ++ix) { _elems.push_back(ix*(ix+1)/2); // cout << "gen_elems: " << *(--_elems.end()) << endl; } } } ostream& operator<<( ostream &os, const num_sequence &ns) { return ns.print( os); } inline void display(const num_sequence &ns, int pos, ostream &os = cout) { os << "The element at position " << pos << " for the " << ns.what_am_i() << " sequence is " << ns.elem(pos) << endl; } int main() { Fibonacci fib; cout << fib << endl; Fibonacci fib2(6); cout << fib2 << endl; Fibonacci fib3(5,8); cout << fib3 << endl; Fibonacci fib4(fib3); Fibonacci fib5 = fib4; cout << fib5 << endl; Triangular tri(2,5); cout << tri << endl; display(tri,20); }
版本二中,return typeid(*this).name(),会分别返回"9Fibonacci","10Triangular",前面的数字表示的是后面字符串的长度....怎么去掉..不知.....
相关文章推荐
- 第二行代码第五章笔记
- 《TensorFlow:实战google深度学习框架》代码错误_第五章MNIST
- OpenGL蓝宝书第五章5.4Tunnuel 纹理映射和过滤:较好的可读性代码
- UNIX-LINUX编程实践教程->第五章->实例代码注解->echostate.c
- 第五章上机代码
- Essential C++ 第一章,猜数代码分析ch1.h
- UNIX-LINUX编程实践教程->第五章->实例代码注解->setecho.c
- 第二行代码第五章笔记
- Essential C++ 第一章,猜数代码分析ch1.cpp
- 统计学习方法第五章决策树的选择最优特征划分例5-1-5.2代码实践
- [翻译] 编写高性能 .NET 代码--第五章 通用编码与对象设计 -- 类 vs 结构体
- Essential C++ 第一章,猜数代码分析ch1_main.cpp + 知识点总结
- 代码之髓-第五章-函数
- c++ Primer Plus(第六版)第五章习题,写代码之路
- 第五章扩充内核后的代码部署小结
- 《数据结构》第五章 树和二叉树 扩展二叉实现代码示例
- C++ Primer Plus (第6版)编程练习 代码-----第五章
- 西蒙OpenGL ES教程第五章的示例代码显示不了纹理
- 第一行代码笔记,第五章-----详解广播机制
- 整理第五章的代码