读书人

关于类静态成员的初始化有关问题

发布时间: 2012-08-08 14:32:45 作者: rapoo

关于类静态成员的初始化问题?
代码如下

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作为模板参数),我想就算见多识广的大牛们,也相当鲜见吧:)

读书人网 >C++

热点推荐