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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
msangel
 Аватар для msangel
0 / 0 / 0
Регистрация: 10.03.2010
Сообщений: 13
#1

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

08.05.2010, 06:52. Просмотров 1332. Ответов 4
Метки нет (Все метки)

У меня в классе реализовано константное поле:
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++
C++ Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля.
C++ Константные функции-члены ?
C++ Константные поля и методы
C++ Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть?
Константные поля класса C++
C++ Поля структуры: код телевизионного канала, название, цена. Операция: найти самый дорогой канал
Реализовать класс Account, представляющий собой банковский счет. В классе должны быть четыре поля C++
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
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 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
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.07.2010, 00:15     Константные поля и операция присвоения - как быть? #5
msangel, сделайте поле constant закрытым, а не константным, как посоветовал Roma_F, и не надо будет никаких трюков. Или константность принципиальна? До и что это за константа если ее нужно менять?
Yandex
Объявления
08.07.2010, 00:15     Константные поля и операция присвоения - как быть?
Ответ Создать тему
Опции темы

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