版本一(5.1~5.6内容)
#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.pus