Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 23
1

Модификатор доступа const

18.02.2016, 01:18. Показов 1254. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравсвуйте, прошу помочь с вопросом.

В общем имеется такой класс:

C++
1
2
3
4
5
6
7
8
9
10
11
class Animator : public sf::Drawable
{
private:
    std::map<std::string, Animation> m_animationList;
    std::string m_currentAnimation;
 
...
 
private:
    virtual void draw(sf::RenderTarget &target, sf::RenderStates states = sf::RenderStates::Default) const;
};
метод draw должен быть приблизительно таким:
C++
1
2
3
4
void Animator::draw(sf::RenderTarget &target, sf::RenderStates states) const
{
    target.draw(m_animationList[m_currentAnimation]);
}
тут возникает проблема. Когда я компилирую вылазит ошибка: "passing 'const std::map<std::basic_string<char>, Animation>' as 'this' argument...", ошибка, как понимаю, возникает из-за того, что метод operator [] не может гарантировать, что this не будет изменен. Можно конечно добавить указатель который будет хранить текущее состояние m_currentAnimation, но такой способ не сильно привлекателен.
Подскажите, если можете.
Спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2016, 01:18
Ответы с готовыми решениями:

Модификатор const для параметра функции не const?
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.

Модификатор const Очередные грабли с++?
Представленный ниже код не компилируется. В чем здесь может быть проблема? class CFirst {...

Модификатор const в аргументах функций
Постоянно путаюсь в этих константах. Как писать грамотнее? Вот так: template&lt;typename...

Чисто виртуальные классы. Модификатор const
Приветствую всех! Известно, что чисто виртуальный (абстрактный) класс можно получить class A {...

4
Неэпический
18099 / 10685 / 2061
Регистрация: 27.09.2012
Сообщений: 26,895
Записей в блоге: 1
18.02.2016, 01:27 2
Цитата Сообщение от e-loki Посмотреть сообщение
ошибка, как понимаю, возникает из-за того, что метод operator [] не может гарантировать, что this не будет изменен.
Да, operator[] не гарантирует константность map'а,
т.к. в случае отсутствия элемента, он будет вставлен.
Цитата Сообщение от e-loki Посмотреть сообщение
Подскажите, если можете.
Что мешает использовать
C++
1
target.draw(*m_animationList.find(m_currentAnimation));//Конечно же, лучше проверить возвращаемое значение на валидность.
Ну и можно сделать
C++
1
mutable std::map<std::string, Animation> m_animationList;
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
18.02.2016, 01:57 3
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну и можно сделать
C++
1
mutable std::map<std::string, Animation> m_animationList;
ИМХО, плохая идея. Семантически m_animationList никак не может быть mutable. Если так сделать - хрен знает какие итераторы и где может порушить простая отрисовка, что ведет к неприятным, трудно воспроизводимым багам.
0
Неэпический
18099 / 10685 / 2061
Регистрация: 27.09.2012
Сообщений: 26,895
Записей в блоге: 1
18.02.2016, 02:17 4
Цитата Сообщение от avgoor Посмотреть сообщение
Если так сделать - хрен знает какие итераторы и где может порушить простая отрисовка
Если знаешь контекст, то вполне можно.
конкретно в данном случае,
лучше сделать через find,
но почему автор так не сделал сразу - не понятно,
ждемс ответа на поставленный вопрос.
0
0 / 0 / 0
Регистрация: 05.02.2015
Сообщений: 23
18.02.2016, 08:39  [ТС] 5
Croessmah,

Цитата Сообщение от Croessmah Посмотреть сообщение
но почему автор так не сделал сразу - не понятно,
Если честно, то просто не догадался - мало опыта. Вариант с find мне вполне по душе. Спасибо!
0
18.02.2016, 08:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.02.2016, 08:39
Помогаю со студенческими работами здесь

Модификатор const в качестве возвращаемого значения
const int get_size(const int&amp; a) { return a; } int main() { const int size =...

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

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru