Что бросает ошибку статический или 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 в конце сигнатуры функции-члена указывает, что эта функция-член не изменяет экземпляр, который он вызывал.

Таким образом, это не имеет смысла (и, следовательно, является недопустимым), чтобы иметь как в одном объявлении функции-члена.