C ++ Class Статическая переменная проблема - C программист, плохо знакомый с C ++ - PullRequest
1 голос
/ 02 мая 2010

Я программист на C, но давно изучил C ++ @school. Сейчас я пытаюсь написать код на C ++, но получаю ошибку компилятора. Пожалуйста, проверьте и скажите, что не так с моим кодом.

typedef class _filter_session
{
private:
    static int session_count;  /* Number of sessions count -- Static */    
public:
    _filter_session();         /* Constructor */
    ~_filter_session();        /* Destructor */
}FILTER_SESSION;


_filter_session::_filter_session(void)
{
    (this->session_count)++;
    return;
}


_filter_session::~_filter_session(void)
{
    (this->session_count)--;
    return;
}

Я получаю ошибку

"ошибка LNK2001: неразрешенный внешний символ" private: static int _filter_session :: session_count "(? Session_count @ _filter_session @@ 0HA)"

Кстати, я использую Visual Studio 2005.

Плз, помогите мне.

С уважением,

Microkernel

Ответы [ 4 ]

8 голосов
/ 02 мая 2010

static переменные должны быть определены вне тела класса. объявление внутри тела класса - это просто объявление.

например. в глобальном масштабе:

int _filter_session::session_count;

Вы должны убедиться, что это определение встречается в программе только один раз, поэтому обычно вы помещаете его в исходный файл (.cc или .cpp), а не в заголовочный файл, который включен в несколько раз единицу перевода.

Для переносимости вам следует избегать имен классов, которые начинаются с _. Также нет необходимости typedef вашего имени класса. class Name { //... вводит имя типа в C ++, вам не нужно было бы использовать class Name для ссылки на тип.

1 голос
/ 02 мая 2010

Вам нужно инициализировать статическую переменную. Этот код на самом деле компилируется:

typedef class _filter_session
{
private:
    static int session_count;  /* Number of sessions count -- Static */    
public:
    _filter_session();         /* Constructor */
    ~_filter_session();        /* Destructor */
}; // FILTER_SESSION;

int _filter_session::session_count = 0;


_filter_session::_filter_session(void)
{
    session_count++;
    return;
}


_filter_session::~_filter_session(void)
{
    session_count--;
    return;
}

int main(int argc, const char **argv)
{
  return 0;
}

Обратите внимание, я прокомментировал FILTER_SESSION для компиляции в g ++ / Linux, а также добавил main и удалил this-> (как упоминает другой член, переменная является не свойством объекта, а класса. глобальная переменная в пространстве имен)

1 голос
/ 02 мая 2010

Не для решения вашей проблемы, но в C ++ нет нужды печатать классы и структуры наподобие этого:

typedef class _filter_session
{
  ...
}FILTER_SESSION;

Вы можете и должны просто сказать:

class filter_session
{
  ...
};

Кроме того, имена c; lass обычно не должны быть в верхнем регистре, так как люди будут путать их с макросами. и вам редко нужно использовать конструкцию this-> - ваш код, конечно, не делает.

0 голосов
/ 02 мая 2010

Просто используйте session_count++. Статическая переменная не привязана ни к какому экземпляру класса, и, следовательно, к ней нельзя получить доступ через this -показатель. Все экземпляры вашего класса совместно используют один экземпляр session_count. На самом деле, к session_count можно получить доступ, даже если не существует экземпляров вашего класса.

Редактировать Хорошо, мой ответ не решает проблему, но Чарльз Бейли делает.

...