关于类静态成员的初始化问题?
代码如下
- C/C++ code
#include<iostream>#include<vector>using namespace std;template<int len, int beg_pos>class num_sequence { friend ostream& operator << (ostream &os, const num_sequence<len,beg_pos> &ns) ;public: virtual ~num_sequence() {}; int elem( int pos ) const; const char* what_am_i() const; static int max_elems() { return _max_elems;} virtual ostream& print(ostream &os = cout) const;protected: virtual void gen_elems( int pos ) const = 0; bool check_integrity( int pos, int size ) const; num_sequence(vector<int> *p) : _pelems(p) {} static const int _max_elems = 1024; vector<int> *_pelems;};template<int len, int beg_pos>bool num_sequence<len,beg_pos>::check_integrity(int pos, int size) const { if ( pos < 0 || pos > _max_elems) return false; if(pos >= _pelems->size()) gen_elems(pos); return true;}template<int len, int beg_pos>int num_sequence<len,beg_pos>::elem( int pos ) const { if ( ! check_integrity(pos,_pelems->size())) return 0; return (*_pelems)[pos-1];}template<int len, int beg_pos>const char* num_sequence<len,beg_pos>::what_am_i() const { return typeid(*this).name();}template<int len, int beg_pos>ostream& num_sequence<len,beg_pos>::print(ostream &os) const { int elem_pos = beg_pos; int end_pos = beg_pos + len; if ( !check_integrity(elem_pos,end_pos)) return os; while(elem_pos < end_pos) { os << (*_pelems)[elem_pos++] << ' '; } return os;}template<int len, int beg_pos>ostream& operator<< (ostream &os, const num_sequence<len,beg_pos> &ns) { ns.print(os); return os;}template<int len, int beg_pos=1>class Fibonacci : public num_sequence<len,beg_pos> {public: virtual ~Fibonacci(){} Fibonacci() : num_sequence<len,beg_pos>(&_elems){} void print(ostream& os) { num_sequence<len,beg_pos>::print(os);} static void init_elems(int count=1) { _elems.reserve(count);}private: virtual void gen_elems( int pos ) const; static vector<int> _elems;};template<int len, int beg_pos>vector<int> Fibonacci<len,beg_pos>::_elems;template<int len, int beg_pos>void Fibonacci<len,beg_pos>::gen_elems( int pos ) const { if ( _elems.size() <= 2) { _elems.push_back(1); _elems.push_back(1); } int length = _elems.size(); if (length <= pos) { int n_1 = _elems[length - 2]; int n_2 = _elems[length - 1]; int sum; while( length < pos ) { sum = n_1 + n_2; _elems.push_back(sum); n_1 = n_2; n_2 = sum; length++; } }}int main() { Fibonacci<8> fib1; fib1.print(cout); return 0;}_elems没有正确初始化吗? 是不是和模板由关系。
运行的结果总是不正确的,应该是输出8个 斐波那契的数列值得。调试了一下午,经常报段错误。不知道为什么?求高手解答啊。
[解决办法]
楼主似乎发了两个类似的帖子。
在上一个贴中,我曾经回答要楼主注意严格区别模版参数和普通函数参数的区别。很显然楼主是不以为然的了:(
类似Fibonacci<8>这样的代码(用8作为模板参数),我想就算见多识广的大牛们,也相当鲜见吧:)