关于constructor的问题
程序如下:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class num_sequence{
public:
virtual ~num_sequence(){};
virtual int elem(int pos)=0;
virtual const char* what_am_i() const = 0;
static int max_elems(){ return _max_elems;}
virtual ostream& print(ostream &os=cout) const=0;
// virtual int length() const = 0;
// virtual int beg_pos() const = 0;
protected:
virtual void gen_elems(int pos) const=0;
bool check_integrity(int pos,int size) const;
//const static int _max_elems=1024;// static const int _max_elems = 1024;
// for compilers not supporting const static
enum { _max_elems = 1024 };
};
bool num_sequence::check_integrity (int pos,int size)const
{
if(pos<=0||pos>=_max_elems)
{
cout<<"Can not use!"<<endl;
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;
};
int Fibonacci::elem(int pos)const
{
if(!check_integrity(pos,_elems.size()))
return 0;
if (pos>_elems.size())
Fibonacci::gen_elems(pos);
return _elems[pos-1];
}
void Fibonacci::gen_elems (int pos)const
{
if (_elems.empty())
{
_elems.push_back(1);
_elems.push_back(1);///////////////////////////////////为何重复
}
if(_elems.size()<=pos)
{
int i=_elems.size();
int i_2=_elems[i-2];
int i_1=_elems[i-1];
for(;i<=pos;i++)
{
int elem=i_2+i_1;
_elems.push_back(elem);
i_2=i_1;i_1=elem;
}
}
}
ostream& Fibonacci::print(ostream &os)const
{
int elem_pos=_beg_pos-1;
int end_pos=elem_pos+_length;
if(end_pos>_elems.size())
Fibonacci::gen_elems (end_pos);
while(elem_pos<end_pos)
os<<_elems[elem_pos++]<<' ';
return os;
}
int main()
{
Fibonacci fib1;
cout<<"fib: beginning at element 1 for 1 element:"<<fib1<<endl;
Fibonacci fib2(16);
cout<<"fib: beginning at element 1 for 6element:"<<fib2<<endl;
Fibonacci fib3(8,12);
cout<<"fib: beginning at element 1 for 6element:"<<fib3<<endl;
return 0;
}
最后编译出现:'Fibonacci' : cannot instantiate abstract class due to following members:
看了constructor,不明白问题出在哪?