繁体   English   中英

C++ class 中的问题与 static 变量和函数

[英]Problem in C++ class with static variables and functions

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

语句static int num1, num2, counting; 在 class 定义中没有定义这些变量,它只声明它们。 如果它们被使用,它们也必须被定义。

一个完整的例子如下:

//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 在命名空间中声明,则这些 static 成员定义也必须在该命名空间中。

像这样使用 static 成员可能是一个非常糟糕的主意。 最好将它们设为实例变量,这样您就可以在代码的不同部分拥有多个独立的FibonacciGenerators

您只声明了 static 成员。 您还应该像这样在 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

在 class 中,它只是一个声明,但每个程序都必须包含所使用的每个变量的一个定义(根据 One-Definition-Rule)。 hth

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM