0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8
1

Как работает идентификатор const?

25.01.2020, 21:02. Показов 1927. Ответов 8
Метки нет (Все метки)

Доброго времени суток!
Вопрос беспокоит. В данный момент я пишу класс исключений и необходимо, чтобы при его инициализации он получал в качестве аргумента константную строку.
Вопрос я решил, подсмотрев в реализацию базового класса в VS. Собственно получившийся код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class framework_error
    : public std::exception
{
public:
    framework_error(char const* const _sErr) : sErr(_sErr) {
    };
    const char* what() 
    {
        return sErr;
    };
private:
    const char* sErr = new char;
};
Вопрос заключается в строке:

C++
1
char const* const _sErr
Почему компилятор воспринимает ее нормально, а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2020, 21:02
Ответы с готовыми решениями:

Как работает const?
Каким образом он защищает данные от изменения ? Т.е. это происходит на этапе компиляции; это...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ?...

Код, который проверяет есть ли в регистре идентификатор GUID - как он работает?
Есть код который как бы проверяет есть ли в регистре идентификатор GUID или нет, вот он: ...

идентификатор _ReturnAddr идентификатор не определён; _ReturnAddress идентификатор не найден
#include "Hooks.h" #include "Hacks.h" #include "Chams.h" #include "Menu.h" #include...

8
Вездепух
Эксперт CЭксперт С++
10314 / 5604 / 1530
Регистрация: 18.10.2014
Сообщений: 13,686
25.01.2020, 21:06 2
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
О чем речь вообще? Что такое "отдельно взятый константный указатель или отдельно взятая константная строка"?
0
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 981
25.01.2020, 21:07 3
Не используй char* с исключениями. Лучше std::string.
0
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
25.01.2020, 21:08 4
удалил
0
5567 / 3041 / 1273
Регистрация: 07.02.2019
Сообщений: 7,683
25.01.2020, 21:37 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "отдельно взятый константный указатель или отдельно взятая константная строка"?
мои догадки:
C++
1
2
char* const // отдельно взятый константный указатель
char const* // отдельно взятая константная строка
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8
26.01.2020, 01:17  [ТС] 6
Имеется ввиду нечто вроде такого:

C++
1
2
char const  name
char const* name
В примере, который я предоставил используется и const, и const*
0
2756 / 1910 / 569
Регистрация: 05.06.2014
Сообщений: 5,560
26.01.2020, 21:49 7
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
Почему компилятор воспринимает ее нормально, а вот на отдельно взятый константный указатель или отдельно взятую константную строку он выдает ошибку?
Конкретный код выбивший ошибку, конкретный текст ошибки в студию.
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
const char* sErr = new char;
new не нужен.
Цитата Сообщение от New man Посмотреть сообщение
Не используй char* с исключениями. Лучше std::string.
...Чтобы вместо твоего исключения, полетел std::bad_alloc из конструктора std::string.
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 8
27.01.2020, 03:48  [ТС] 8
Цитата Сообщение от Renji Посмотреть сообщение
Конкретный код выбивший ошибку, конкретный текст ошибки в студию.
C++
1
char const _sErr
E0144 значение типа "char" нельзя использовать для инициализации сущности типа "const char *"
Это ошибка мне понятна, но к сожалению при
C++
1
char const* _sErr
компилятор перестал выдавать ошибку.

Суть все равно, остается та же. Почему подобного рода запись
C++
1
char const* const _sErr
воспринимается компилятором нормально, и помимо прочего данное решение присутствует в реализации класса exception
Пример (vcruntime_exception.h 53 строка):
C++
1
2
  explicit exception(char const* const _Message) noexcept
        : _Data()
Цитата Сообщение от Renji Посмотреть сообщение
new не нужен.
Учел!
0
16282 / 8839 / 2168
Регистрация: 30.01.2014
Сообщений: 15,281
27.01.2020, 07:20 9
Лучший ответ Сообщение было отмечено Kawaiilodon как решение

Решение

Kawaiilodon, используйте std::runtime_error из <stdexcept>

C++
1
2
3
4
5
6
7
8
class framework_error
    : public std::runtime_error
{
public:
    framework_error(char const* const _sErr) : std::runtime_error(_sErr) 
    {
    }
};
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
C++
1
explicit exception(char const* const _Message) noexcept
Нестандартное расширение VC++.

Добавлено через 1 минуту
Цитата Сообщение от Kawaiilodon Посмотреть сообщение
Почему подобного рода запись
C++
1
char const* const _sErr
воспринимается компилятором нормально
А почему она должна восприниматься ненормально?
Это константный указатель на константную строку, всего лишь.

C++
1
char const (1) * const (2) _sErr
1 - этот const относится к char, т.е. содержимое элементов массива по указателю - константа.
2 - этот const относится к char const *, т.е. переменная этого (вот именно этого, выделенного) типа - константа.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2020, 07:20
Помогаю со студенческими работами здесь

Не работает глобальный идентификатор extern
У меня два файла : main.cpp func.cpp во втором файле обьявлена и инициализирована extern int a...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const;
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru