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

Константные поля и операция присвоения - как быть? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
msangel
 Аватар для msangel
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
08.05.2010, 06:52     Константные поля и операция присвоения - как быть? #1
У меня в классе реализовано константное поле:
C++
1
int const constant;
инициализация такой переменной происходит в конструкторе в списке инициализации:
C++
1
2
3
GoodClass::GoodClass(char* str,int inint):constant(inint){
//...
};
по идее ясно, что изменить такое поле невозможно
но если надо?(
мой класс перегружает операцию присвоения:

C++
1
2
3
const GoodClass& GoodClass::operator = (const GoodClass& T){
//...
};
однако список инициализации возле него не возможно создать(((
возможно ли при переприсвоении тогда как нибудь иначием образом изменить константную переменную, чтоб не терять объект(допустим объект обладает уникальным ресурсом, который нужен при его дальнейшей работе и который невозможно скопировать/получить заново !!!)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2010, 06:52     Константные поля и операция присвоения - как быть?
Посмотрите здесь:

C++ Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля.
C++ Константные поля и методы
C++ Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Константные поля класса C++
C++ Поля структуры: код телевизионного канала, название, цена. Операция: найти самый дорогой канал
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
08.05.2010, 12:20     Константные поля и операция присвоения - как быть? #2
защитить "уникальный ресурс" можно и так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class GoodClass
{
    private:
        int constant;
    public:
        GoodClass(int inint) : constant(inint) {};
        const GoodClass& GoodClass::operator = (const GoodClass& T) { constant = T.GetConstant(); };
        int GetConstant (void) const { return constant; };
};
 
int main()
{
    GoodClass a(5);
    GoodClass b(6);
    a = b;
    cout << a.GetConstant() << endl;
    cout << b.GetConstant() << endl;
 
    return 0;
}
msangel
 Аватар для msangel
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
07.07.2010, 18:50  [ТС]     Константные поля и операция присвоения - как быть? #3
Цитата Сообщение от Roma_F Посмотреть сообщение
защитить "уникальный ресурс" можно и так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class GoodClass
{
    private:
        int constant;
    public:
        GoodClass(int inint) : constant(inint) {};
        const GoodClass& GoodClass::operator = (const GoodClass& T) { constant = T.GetConstant(); };
        int GetConstant (void) const { return constant; };
};
 
int main()
{
    GoodClass a(5);
    GoodClass b(6);
    a = b;
    cout << a.GetConstant() << endl;
    cout << b.GetConstant() << endl;
 
    return 0;
}
Error 1 error C4716: 'GoodClass::operator=' : must return a value tryconstatncopyying\main.cpp 8

C++
1
const GoodClass& GoodClass::operator = (const GoodClass& T) { constant = T.GetConstant(); return *this;};
гм... странно но работает, хотя не должно, т.к. изменять константные поля как бы запрещено после конструирования обьекта...
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
08.07.2010, 00:07     Константные поля и операция присвоения - как быть? #4
Специально для таких случаев, когда объект константный, а изменить его приспичило, изобретён оператор const_cast.
C++
1
const GoodClass& GoodClass::operator = (const GoodClass& T) { const_cast<int&>(constant) = T.GetConstant(); }
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.07.2010, 00:15     Константные поля и операция присвоения - как быть? #5
msangel, сделайте поле constant закрытым, а не константным, как посоветовал Roma_F, и не надо будет никаких трюков. Или константность принципиальна? До и что это за константа если ее нужно менять?
Yandex
Объявления
08.07.2010, 00:15     Константные поля и операция присвоения - как быть?
Ответ Создать тему
Опции темы

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