Проблема в классе C ++ со статическими переменными и функциями - PullRequest
1 голос
/ 17 августа 2011

Может кто-нибудь сказать мне, в чем проблема в следующем классе, 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 ]

6 голосов
/ 17 августа 2011

Оператор 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 в отдельных частях кода.

2 голосов
/ 17 августа 2011

Вы объявили только статические члены. Вы должны также определить их в файле 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

внутри класса, это всего лишь объявление, но каждая программа должна содержать ровно одно определение каждой используемой переменной (согласно правилу One-Definition-Rule). НТН

...