有人可以告诉我下面这个课有什么问题,g ++在ubuntu上给出了错误:
class FibonacciGenerator { private: static int num1, num2, counting; public: static void Reset() { num1 = 0; num2 = 1; counting = 1; } static int GetCount() { return counting; } static int GetNext() { int val = 0; if(counting == 1) val = num1; else if(counting == 2) val = num2; else { val = num1 + num2; num1 = num2; num2 = val; } counting ++; return val; } };
答案 0 :(得分:6)
类定义中的语句static int num1, num2, counting;
没有定义那些变量,它只声明它们。如果使用它们,也必须定义它们。
完整的例子如下:
//Begin FibonacciGenerator.hpp
#ifndef FIBONACCI_GENERATOR_HPP
#define FIBONACCI_GENERATOR_HPP
class FibonacciGenerator
{
private:
static int num1, num2, counting;
public:
/* as above */
};
#endif //FIBONACCI_GENERATOR_HPP
//End FibonacciGenerator.hpp
//Begin FibonacciGenerator.cpp
#include "FibonacciGenerator.h"
int FibonacciGenerator::num1;
int FibonacciGenerator::num2;
int FibonacciGenerator::counting;
//End FibonacciGenerator.cpp
如果在命名空间中声明FibonacciGenerator,则这些静态成员定义也必须位于该命名空间中。
使用像这样的静态成员可能是一个非常糟糕的主意。最好让它们成为实例变量,这样你就可以在代码的不同部分有多个独立的FibonacciGenerators
。
答案 1 :(得分:2)
您只声明了静态成员。您还应该在像这样的
这样的cpp文件中定义它们int FibonacciGenerator::num1 /*= 0*/;
int FibonacciGenerator::num2 /*= 1*/;
int FibonacciGenerator::counting /*= 0*/;
当你写
static T v; //if static were removed, this would also be a definition
在类中,它只是一个声明,但每个程序必须包含所使用的每个变量的一个定义(根据单定义规则)。 HTH