Статическая константа (член класса)

Используйте window.history.pushState("object or string", "Title", "/new-url"), но он по-прежнему отправляет новый запрос url на сервер

416
задан Uwe Keim 6 December 2018 в 13:02
поделиться

5 ответов

Вы должны определить свой статический член вне определения класса и предоставить там инициализатор.

Сначала

// In a header file (if it is in a header file in your case)
class A {   
private:      
  static const string RECTANGLE;
};

, а затем

// In one of the implementation files
const string A::RECTANGLE = "rectangle";

Синтаксис, который вы изначально пытались использовать (инициализатор внутри определение класса) допускается только с целочисленными типами и типами перечисления.


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

// In a header file (if it is in a header file in your case)
class A {   
private:      
  inline static const string RECTANGLE = "rectangle";
};

Никакого дополнительного определения не требуется.

Или вместо const в этом варианте вы можете объявить его constexpr . Явный встроенный больше не нужен, поскольку constexpr подразумевает встроенный .

450
ответ дан 22 November 2019 в 23:18
поделиться

Внутри определений классов вы можете объявлять только статические члены. Они должны быть определены вне класса. Для интегральных констант времени компиляции стандарт делает исключение, что вы можете «инициализировать» члены. Однако это все еще не определение. Например, взятие адреса без определения не сработает.

Я хотел бы упомянуть, что я не вижу преимущества использования std :: string по сравнению с const char [] для констант . std :: string хорош, но требует динамической инициализации. Итак, если вы напишете что-то вроде

const std::string foo = "hello";

в области пространства имен, конструктор foo будет запущен прямо перед выполнением основного запуска, и этот конструктор создаст копию константы "hello" в памяти кучи. Если вам действительно не нужно, чтобы RECTANGLE был std :: string вы могли бы просто написать

// class definition with incomplete static member could be in a header file
class A {
    static const char RECTANGLE[];
};

// this needs to be placed in a single translation unit only
const char A::RECTANGLE[] = "rectangle";

Туда! Без выделения кучи, без копирования, без динамической инициализации.

Ура, s.

33
ответ дан 22 November 2019 в 23:18
поделиться

Это просто дополнительная информация, но если вам действительно нужна строка в файле заголовка, попробуйте что-нибудь вроде:

class foo
{
public:
    static const std::string& RECTANGLE(void)
    {
        static const std::string str = "rectangle";

        return str;
    }
};

Хотя я сомневаюсь, что это рекомендуется.

17
ответ дан 22 November 2019 в 23:18
поделиться

Чтобы использовать эту инициализацию в классе синтаксис, константа должна быть статической const целочисленного или перечислимого типа инициализируется константным выражением.

Это ограничение. Следовательно, в этом случае вам необходимо определить переменную вне класса. обратитесь к ответу от @AndreyT

8
ответ дан 22 November 2019 в 23:18
поделиться

Текущий стандарт допускает такую ​​инициализацию только для статических постоянных целочисленных типов. Так что вам нужно делать так, как объяснил AndreyT. Однако это будет доступно в следующем стандарте через синтаксис инициализации нового члена .

4
ответ дан 22 November 2019 в 23:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: