Что бросает ошибку статический или const?
Следующий код выдает сообщение об ошибке, и я не могу понять, в чем проблема - это слово static
или const
? Что я делаю не так?
#include <iostream>
using namespace std;
class SampleClass
{
private:
int value;
static int counter;
public:
SampleClass(int i)
{
value = i;
counter++;
}
static int countSomeClass() const
{
return counter;
}
void showValue()
{
cout << value << endl;
}
};
int main()
{
SampleClass test(50);
test.showValue();
test.countSomeClass();
return 0;
}
Сообщение об ошибке:
main.cpp: 16: 35: ошибка: статическая функция-член static int SampleClass:: countSomeClass() не может иметь cv-квалификатор
static int countSomeClass() const
Ответы
Ответ 1
A static
метод не может быть помечен как const
: поскольку он не работает в экземпляре, нет смысла указывать, что он не может его изменить.
(можно утверждать, что для методов static
он мог бы ссылаться на методы static
, которые не могут изменять данные static
, связанные с классом, однако это все равно не имеет смысла, поскольку вы не можете иметь const
или форму a const
указатель или ссылку на класс, так как в С++ классы не являются объектами)
Ответ 2
Как говорится в сообщении об ошибке, статическая функция-член не может иметь cv-квалификатор, то есть классификатор const
или volatile
. Такие квалификаторы применяются к this
внутри нестатического элемента; они не имеют никакого смысла в статическом элементе, который не имеет this
.
Вы хотите, чтобы функция была статической, поскольку она не зависит от какого-либо экземпляра; поэтому удалите const
.
Ответ 3
Функция A static
не может быть const
(cv-qualified) и наоборот. Это комбинация этих двух проблем.
Из спецификации С++ § 9.4.1/2 (выделено мной)
[Примечание. Функция-член static
не имеет указателя this
(9.3.2). -end note] Функция члена static
не должна быть virtual
. Не должно быть static
и нестатическая функция-член с тем же именем и теми же типами параметров (13.1). Функция члена static
не должна быть объявлена const
, volatile
или const volatile
.
Функция A static
не имеет доступа к this
, поскольку она не связана с конкретным экземпляром объекта. Нет необходимости применять const
, это не имеет смысла - нет экземпляра объекта для применения const
to. Аналогичным образом, свободная функция не может быть const
(или cv-qualified).
Если вы хотите, чтобы функция была связана с объектом, удалите static
, если вы хотите, чтобы она была static
удалила const
- из вашего образца, удалите const
.
Еще одно примечание; ваш counter
объявлен, но не определен (вне класса). Он требует что-то вроде int SampleClass::counter = 0;
в одном из блоков перевода (файл cpp).
Ответ 4
Это связано с обоими.
- Функция члена
static
не работает в экземпляре класса, членом которого он является.
- Ключевое слово
const
в конце сигнатуры функции-члена указывает, что эта функция-член не изменяет экземпляр, который он вызывал.
Таким образом, это не имеет смысла (и, следовательно, является недопустимым), чтобы иметь как в одном объявлении функции-члена.