Const процедура в C ++, странная ошибка в Visual Studio C ++ 2010? - PullRequest
0 голосов
/ 06 июня 2011
class a{
public:
    int b;
    static int c;
    virtual void mod() const
    {
        c=4;
    }

};



int _tmain(int argc, _TCHAR* argv[])
{
  a bi;

  return 0;
}

Посмотрите на это ... После компиляции с использованием компилятора Visual Studio C ++ 2010 я получаю ...

cpplearningconsole.obj: ошибка LNK2001: неразрешенный внешний символ "public: staticint a :: c "(? c @ a @@ 2HA)

Полагаю, это ошибка компилятора.Для меня реальный вопрос.Должен ли мод иметь возможность изменять переменную c, если она постоянная?

Спасибо.

Ответы [ 4 ]

8 голосов
/ 06 июня 2011

У вас есть только объявленная статическая переменная в определении класса, вам нужно определить это, выполнив int a::c = 0;.

3 голосов
/ 06 июня 2011

Это:

cpplearningconsole.obj: ошибка LNK2001: неразрешенный внешний символ «public: static int a :: c» (? C @ a @@ 2HA)

Это не сообщение компилятора, это сообщение компоновщика. Вы получаете это, потому что, хотя вы объявили участника c, вы не определили его. Статические члены должны быть определены только в одном исходном файле, чтобы их можно было создать. Что-то вроде:

int a::c = 0;

Что касается вашего второго вопроса, объявляя функцию как const, говорится, что она не изменяет объект, к которому она вызывается. Ваша mod функция не изменяет объект, она изменяет статический член. Вот почему вы не получаете ошибку компилятора.

1 голос
/ 06 июня 2011

Вы должны добавить правильное определение для вашего переменного члена, в классе у вас есть только объявление.В вашем cpp или сразу после объявления класса (вне его) добавьте:

int a::c = 0;

0 голосов
/ 06 июня 2011

Чтобы ответить на ваш другой вопрос:

c является публичным статическим членом вашего класса. Любой может изменить свое значение, так почему бы не mod()?

...