Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
#1

Изменить const с помощью mutable - C++

01.02.2012, 13:23. Просмотров 2621. Ответов 18
Метки нет (Все метки)

Привет всем, у меня 1 вот такой вопрос, почему в етом коде "а" - не изменяется? у меня же "b" -mutable?

помогите пожалуйста...

C++
1
2
3
4
5
6
7
8
9
10
11
12
class A
{
private:
 const int a;
 mutable int b;
   public:
    void test()
     {
      b = 10;
         a = b;
     }
};
Спасибо заранее...

П.С мне надо в консолском приложение.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
__bool
285 / 226 / 6
Регистрация: 13.06.2010
Сообщений: 744
01.02.2012, 13:29     Изменить const с помощью mutable #2
Цитата Сообщение от Programmer. Посмотреть сообщение
у меня же "b" -mutable
Я так понимаю если b - mutable,
то const игнорируется по отношению именно к b
mutable означает, что спецификатор const, примененный к классу, следует игнорировать. По стандарту только данные класса могут быть mutable.
Добавлено через 3 минуты
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Exm
{
    mutable int a; // добавили в объявление ключевое слово mutable
    // позволяющие игнорировать модификатор const
    // по отношению к данной переменной
    int b;
public:
    int getA() const //
    {
        return a; // все правильно
    }
    int setA(int i) const
    {
        a = i;// теперь всё правильно. Мы можем изменять переменную а
        b = i; // Ошибка! Переменная b  по прежнему не доступна для изменения.
    }
}
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
01.02.2012, 13:31  [ТС]     Изменить const с помощью mutable #3
__bool,
С функциями всё понятно, мне с переменнами нужно
__bool
285 / 226 / 6
Регистрация: 13.06.2010
Сообщений: 744
01.02.2012, 13:34     Изменить const с помощью mutable #4
значит mutable вам не поможет.
mutable позволяет игнорировать модификатор const по отношению к данной переменной
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
01.02.2012, 13:45  [ТС]     Изменить const с помощью mutable #5
__bool,
Спасибо.
Тогда вопрос прозвучит так: Как изменить значение у const в том классе?

rangerx
1923 / 1532 / 139
Регистрация: 31.05.2009
Сообщений: 2,894
03.02.2012, 01:12     Изменить const с помощью mutable #6
Цитата Сообщение от Programmer. Посмотреть сообщение
Как изменить значение у const в том классе?
Значение const переменной никак не нужно изменять, на то она и const.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 15:00     Изменить const с помощью mutable #7
Цитата Сообщение от Programmer. Посмотреть сообщение
Тогда вопрос прозвучит так: Как изменить значение у const в том классе?
Очевидно ведь: объявить как не const.

Цитата Сообщение от Programmer. Посмотреть сообщение
mutable int b;
Вы сможете менять значение b, в этом объявлении
C++
1
const A obj;
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
03.02.2012, 19:16     Изменить const с помощью mutable #8
Как вариант (только не вздумайте им пользоваться):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class A
{
private:
 const int a;
 int b;
   public:
      A(int v): a(v) {}
        void test(int v)
         {          
          *(const_cast<int*>(&a)) = v;
         }
      int getA() const {return a;}
};
 
int main()
{
   A a(10);
   a.test(100);
   std::cout << a.getA() << std::endl;
}
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.02.2012, 20:21     Изменить const с помощью mutable #9
gooseim, а разве это не undefined behaviour?
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,109
03.02.2012, 20:57     Изменить const с помощью mutable #10
go, нет, это просто грязный хак) А вот если бы константа была бы ещё и статической, то можно было бы напороться на защищенную от записи память.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2012, 19:11     Изменить const с помощью mutable #11
Цитата Сообщение от NoMasters Посмотреть сообщение
нет,
Почему пояснить можете?
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
04.02.2012, 19:27     Изменить const с помощью mutable #12
7.1.6.1 The cv-qualifiers
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
оттуда же пример
C++
1
2
3
const int* ciq = new const int (3); // initialized as required
int* iq = const_cast<int*>(ciq); // cast required
*iq = 4; // undefined: modifies a const object
так что стандарт говорит, что go прав
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2012, 19:33     Изменить const с помощью mutable #13
Цитата Сообщение от retmas Посмотреть сообщение
Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior.
Это говорит о том что я прав? Если мы убираем const с объекта, который на самом деле const, результатом будет undefined behaviour.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
04.02.2012, 19:35     Изменить const с помощью mutable #14
нет, если мы модифицируем такой обьект, после снятия конста
т.е. из 8 поста
C++
1
*(const_cast<int*>(&a)) = v;
это не просто грязный хак. это undefined behaviour
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2012, 19:39     Изменить const с помощью mutable #15
Цитата Сообщение от retmas Посмотреть сообщение
undefined behaviour
А я что утверждаю?..
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
04.02.2012, 19:44     Изменить const с помощью mutable #16
Цитата Сообщение от go Посмотреть сообщение
А я что утверждаю?..
Цитата Сообщение от go Посмотреть сообщение
Если мы убираем const с объекта, который на самом деле const, результатом будет undefined behaviour
просто снять конст - это не неопределенное поведение. а в остальном я с вами и не спорил я показал NoMasters, что это не "просто грязный хак"
NoMasters
Псевдослучайный
1743 / 1086 / 71
Регистрация: 13.09.2011
Сообщений: 3,109
04.02.2012, 20:45     Изменить const с помощью mutable #17
retmas, тем не менее, с трудом представляю себе ситуацию, когда это не будет работать. Пока память в стеке/куче всё будет нормально(если такой термин вообще применим к подобным развлечениям) по крайней мере, если это поле в составе структуры/класса, где есть и не константные члены.
go
Эксперт C++
3585 / 1365 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2012, 20:52     Изменить const с помощью mutable #18
Цитата Сообщение от NoMasters Посмотреть сообщение
с трудом представляю себе ситуацию,
Тогда почитайте, например, это http://publib.boulder.ibm.com/infoce...const_cast.htm
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2012, 17:40     Изменить const с помощью mutable
Еще ссылки по теме:

C++ Поле mutable в структуре
Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *' C++
C++ Модификатор const для параметра функции не const?
C++ Const_cast и mutable
Внутренняя работа mutable C++

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

Или воспользуйтесь поиском по форуму:
Programmer.
Прогер
631 / 262 / 7
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
05.02.2012, 17:40  [ТС]     Изменить const с помощью mutable #19
NoMasters,
Да, самий лучший варянт кастать его и всё


NoMasters,
go,
rangerx,
Спасибо ребята, задача решена...
Yandex
Объявления
05.02.2012, 17:40     Изменить const с помощью mutable
Ответ Создать тему
Опции темы

Текущее время: 19:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru