c ++ получение ошибки при передаче ссылки на const-класс в качестве аргумента в функции [duplicate]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к Словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

10
задан Austin Hyde 4 March 2010 в 22:26
поделиться

4 ответа

Ваша функция checkElements() не отмечена как const, поэтому вы не можете называть ее на const квалифицированных объектах.

top(), однако, имеет значение const, поэтому в top(), this является указателем на const Stack (даже если экземпляр Stack, на который был вызван top(), оказывается не const), поэтому вы не можете вызвать checkElements(), который всегда требует экземпляр не const.

21
ответ дан CB Bailey 26 August 2018 в 10:01
поделиться

Вы вызываете метод non-const из метода const.

4
ответ дан Dave Bacher 26 August 2018 в 10:01
поделиться

Вы не можете вызвать метод non-const из метода const. Это будет «отбрасывать» квалификатор const .

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

13
ответ дан David Rodríguez - dribeas 26 August 2018 в 10:01
поделиться

Поскольку checkElements () не объявляется const.

void checkElements() const {
    if (first_==NULL || size_==0)
        throw range_error("There are no elements in the stack.");
}

Без этого объявления checkElements нельзя вызывать в const-объекте.

2
ответ дан user 26 August 2018 в 10:01
поделиться
Другие вопросы по тегам:

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