鱼C论坛

 找回密码
 立即注册
查看: 4612|回复: 0

C++类中静态数据成员的未定义引用问题

[复制链接]
发表于 2013-3-16 00:01:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <algorithm>
  5. #include <functional>


  6. using namespace std;

  7. class num_sequence {
  8. public:
  9.     virtual ~num_sequence() {}

  10.     virtual int elem(int pos) const = 0;
  11.     virtual const char *what_am_i() const = 0;
  12.     static int max_elems() { return _max_elems; }
  13.     virtual ostream &print(ostream &os = cout) const = 0;

  14. protected:
  15.     virtual void gen_elems(int pos) const = 0;
  16.     bool check_integrity(int pos, int size)  const;

  17.     const static int _max_elems = 1024;
  18. };

  19. bool num_sequence::
  20. check_integrity(int pos, int size) const
  21. {
  22.     if (pos <= 0 || pos > _max_elems)
  23.     {
  24.         cerr << "!! invalid position: " << pos
  25.              << "Cannot honor request\n";
  26.         return false;
  27.     }
  28.     if (pos > size)
  29.         gen_elems(pos);

  30.     return true;
  31. }

  32. ostream& operator << (ostream &os, const num_sequence &ns)
  33. {
  34.     return ns.print(os);
  35. }

  36. //class Fabonacci

  37. class Fibonacci: public num_sequence {
  38. public:
  39.     Fibonacci(int len = 1, int beg_pos = 1):
  40.         _length(len), _beg_pos(beg_pos) {}

  41.     virtual int elem(int pos) const;
  42.     virtual const char *what_am_i() const { return "Fibonacci"; }
  43.     virtual ostream &print(ostream &os = cout) const;
  44.     int length() const { return _length; }
  45.     int beg_pos() const { return _beg_pos; }

  46. protected:
  47.     virtual void gen_elems(int pos) const;
  48.     int _length;
  49.     int _beg_pos;
  50.     static vector<int> _elems;            //-----HERE-------
  51. };


  52. int Fibonacci::
  53. elem(int pos) const
  54. {
  55.     if (!check_integrity(pos, _elems.size()))
  56.         return 0;
  57.     if (pos > _elems.size())
  58.         Fibonacci::gen_elems(pos);

  59.     return _elems[pos - 1];
  60. }

  61. void Fibonacci::
  62. gen_elems(int pos) const
  63. {
  64.     if (_elems.empty()) {
  65.         _elems.push_back(1);
  66.         _elems.push_back(1);
  67.     }

  68.     if (_elems.size() <= pos) {
  69.         int ix = _elems.size();
  70.         int n1 = _elems[ix - 1];
  71.         int n2 = _elems[ix - 2];

  72.         while (ix <= pos) {
  73.             int elem = n1 + n2;
  74.             _elems.push_back(elem);
  75.             n2 = n1;
  76.             n1 = elem;
  77.             ix++;
  78.         }
  79.     }
  80. }

  81. ostream &Fibonacci::
  82. print(ostream &os) const
  83. {
  84.     int elem_pos = _beg_pos - 1;
  85.     int end_pos = elem_pos + _length;

  86.     if (end_pos > _elems.size())
  87.         Fibonacci::gen_elems(end_pos);

  88.     while (elem_pos < end_pos)
  89.         os << _elems[elem_pos++] << ' ';
  90. }

  91. int main()
  92. {
  93.     Fibonacci fib;

  94.     cout << "fib: beginning at element 1 for 1 element: "
  95.          << fib << endl;

  96.     Fibonacci fib2(16);
  97.     cout << "fib2: beginning at elemet 1 for 16 elements: "
  98.          << fib2 << endl;

  99.     Fibonacci fib3;
  100.     cout << "fib3: beginning at element 12 for 8 elements: "
  101.          << fib3 << endl;

  102.     return 0;
  103. }
复制代码
错误提示的:undefined reference to `Fibonacci::_elems'
这是书上的代码。静态成员应该会自动初始化呀。
就算我在外部定义vector<int> Fibonacci::_elems(0);
编译通过,不过有段错误!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-5 15:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表