带有静态变量和函数的C ++类中的问题

时间:2011-08-17 11:00:52

标签: c++ class ubuntu static g++

有人可以告诉我下面这个课有什么问题,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;
        }
};

2 个答案:

答案 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