Почему эта функция членства константы позволяет членской переменной быть измененной?

Кажется, что вы хотите обслуживать статические файлы (то есть пакеты React или Next.js). У Django есть руководство о том, как это сделать (через django.contrib.staticfiles)

Простейший пример (прямо из документации):

  • установить папку STATIC_FILES :

    STATIC_URL = '/static/'

  • Поместите туда файл index.html и обозначьте его как /static/index.html.

Для получения дополнительной информации о staticfiles, пожалуйста, обратитесь к официальной документации: https://docs.djangoproject.com/en/2.1/howto/static-files/

На стороне Next.js вам нужно либо следовать примеру на https://nextjs.org/#static-exporting , либо создать вручную index.html, который включает все пакеты next.js. что вы используете.

10
задан ChrisN 16 November 2008 в 13:35
поделиться

5 ответов

Функция членства константы, функция членства, которая не видоизменяет ее членские переменные.

константа на функции членства не подразумевает символ константы *. Который означал бы, что Вы не можете изменить данные в адресе, указатель содержит.

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

Константа на функции членства, гарантирует, чтобы Вы рассматривали все свои членские переменные как константа.

Это означает, имеете ли Вы:

int x;
char c;
char *p;

Затем Вы будете иметь:

const int x;
const char c;
char * const p; //<-- means you cannot change what p points to, but you can change the data p points to

Существует 2 типа указателей константы. Функция членства константы использует тот, который я упомянул выше.


Способ получить ошибку Вы хотите:

Изменение попытки:

char * rep;

кому:

char rep[1024];

И удалите эту строку:

rep = new char [strlen(s)+1];

Это бросит ошибку, которую Вы ожидаете (не может изменить участников из-за ключевого слова константы),

Поскольку существует только 1 тип массива константы. И это означает, что Вы не можете изменить ни одни из его данных.


Теперь целая система на самом деле повреждается со следующим примером:

class String
{

    private:
        char rep2[1024];
        char* rep;

 ...


 String :: String (const char* s)
 {
    rep = rep2;
    strcpy (rep, s); 
 }

Так урок для изучения вот то, что ключевое слово константы на функциях членства не гарантирует, что объект не изменится вообще.

Это только гарантирует, что каждую членскую переменную будут рассматривать как константу. И для указателей, существует большая разность между символом константы * и символом * константа.

Большую часть времени функция членства константы будет означать, что функция членства не изменит сам объект, но это не всегда имеет место как вышеупомянутые шоу в качестве примера.

20
ответ дан 3 December 2019 в 15:53
поделиться

Причина состоит в том, что Вы не изменяетесь rep. Если бы Вы были бы, Вы найти rep = ...; где-нибудь в Вашем коде. Вот в чем разница между

char*const rep;

и

const char* rep;

В Вашем случае первый сделан при выполнении функции членства константы: указатель является константой. Так, Вы не сможете сбросить указатель. Но Вы очень хорошо сможете изменить то, на что указывает указатель.

Теперь, помнить rep[i] = ...; совпадает с *(rep + i) = ...;. Таким образом то, что Вы изменяете, не является указателем, но на что указывает указатель. Вам разрешают, так как указатель не имеет второго типа случая.

Решение

  1. Константа, означающая Вас, смотрит на, physical constness. Однако функция членства константы означает, что Ваш объект logical const. Если изменение в некотором содержании изменит логический constness Вашего объекта, например, если это заменит некоторую статическую переменную, от которой зависит Ваш объект, Ваш компилятор не может знать, что Ваш класс теперь имеет другое логическое значение. И ни один, это может знать, что изменения логического значения, зависящие от того, на что указывает указатель: компилятор не пытается проверить логический constness в функцию членства константы, так как это не может знать то, что означают те членские переменные. Этот материал называют const-correctness.
  2. Используйте объект, который не является просто ссылкой или указателем: функция членства константы сделает ту объектную константу и не разрешит Вам изменять ее содержание. std::string, как предложено некоторыми или массивом символов (отмечают, что массив запретит Вам изменяющий его содержание, в противоположность просто указателю), был бы соответствующий выбор.
  3. 2.
4
ответ дан 3 December 2019 в 15:53
поделиться

Вы не можете изменить значение чего-то объявленного как

const char* rep;

или

const char* const rep;

К сожалению, объявление Вашей членской константы превращается в представителя в

char* const rep;

что означает, Вы не можете изменить адрес acutal, но можно изменить содержание, тогда как Вы не можете изменить значение.

Чтобы заставить участников константы уважать сохраняют Вашу буферную константу, необходимо будет сделать представителя и массив символов или строкового объекта, а не символьного указателя.

1
ответ дан 3 December 2019 в 15:53
поделиться

Спецификатор константы означает, что не изменит членов класса.

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

Решение этой проблемы состояло бы в том, чтобы заменить символ* станд.:: строка.
Затем Вы только смогли бы позвонить членам константы станд.:: строка из toUpper ()

Например (используют станд.:: строка)

class String
{
    std::string rep;

    void toUpper() const
    { 
        for (int i = 0; rep [i]; i++)
            rep[i] = toupper(rep[i]);

        // Can only use const member functions on rep.
        // So here we use 'char const& std::string::operator[](size_t) const'
        // There is a non const version but we are not allowed to use it
        // because this method is const.

        // So the return type is 'char const&'
        // This can be used in the call to toupper()
        // But not on the lhs of the assignemnt statement

    }
}
1
ответ дан 3 December 2019 в 15:53
поделиться

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

Однако 'константа' является своего рода гарантией для пользователей Вашего класса: если метод будет объявлен константой, кто использует экземпляр Вашего класса, может ожидать, что это не изменится при вызове метода. Моя точка, если toUpper () изменяет состояние строки, не объявляйте это константа, позволяет ли C++ его или нет.

1
ответ дан 3 December 2019 в 15:53
поделиться
Другие вопросы по тегам:

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