关于constructor的问题

1982xcc 2003-08-24 06:55:01
程序如下:
#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,不明白问题出在哪?
...全文
34 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oopig 2003-08-24
  • 打赏
  • 举报
回复
类声明中的static vector<int> _elems;只是声明,还需要在cpp中加上定义:
vector<int> num_sequence::_elems;
1982xcc 2003-08-24
  • 打赏
  • 举报
回复
第一个解决了,谢谢
第二个,已经定义static vector<int> _elems;
再加声明,不是重复定义了么
hpho 2003-08-24
  • 打赏
  • 举报
回复
1,num_sequence::elem(int)与Fibonacci:elem(int)const不一至.(去掉const)
2,Fibonacci::_elems是static成员变量需要声明.(加vector<int> Fibonacci::_elems;)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧