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

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

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

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

08.05.2010, 06:52. Просмотров 1369. Ответов 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){
//...
};
однако список инициализации возле него не возможно создать(((
возможно ли при переприсвоении тогда как нибудь иначием образом изменить константную переменную, чтоб не терять объект(допустим объект обладает уникальным ресурсом, который нужен при его дальнейшей работе и который невозможно скопировать/получить заново !!!)?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2010, 06:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Константные поля и операция присвоения - как быть? (C++):

Константные поля и методы - C++
А можете объяснить, что такое константные поля и методы в классах?

Константные поля класса - C++
Такой вопрос, как инициализировать константные поля класса? Работают конструкции вида obj():t(0){}; который используется в примере ниже. А...

Константные и не константные ссылки. Приведения типов. Нужно уточнение - C++
Не очень понимаю в чем различие (2,3 строчки). int x = 10; double &y = x; const double &y = x; Почему для не...

Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. - C++
Помогите решить с объяснениями. Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. ...

Есть структура, компилятор считывает некоторые её поля ТОЛЬКО из адресов, кратным двум, а их там нет! (полей), как быть? - C++
То есть вот структура: struct TGAHEADER { char IdLength; char ColourMapType; char DataTypeCode; ...

Как правильно объявлять статические константные объекты в классе? - C++
В классе надо объявить статичные константные строки. Типа class A { public: static const std::string OLOLO = "ololo"; } Но так...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
}
0
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;};
гм... странно но работает, хотя не должно, т.к. изменять константные поля как бы запрещено после конструирования обьекта...
0
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
08.07.2010, 00:07 #4
Специально для таких случаев, когда объект константный, а изменить его приспичило, изобретён оператор const_cast.
C++
1
const GoodClass& GoodClass::operator = (const GoodClass& T) { const_cast<int&>(constant) = T.GetConstant(); }
0
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.07.2010, 00:15 #5
msangel, сделайте поле constant закрытым, а не константным, как посоветовал Roma_F, и не надо будет никаких трюков. Или константность принципиальна? До и что это за константа если ее нужно менять?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2010, 00:15
Привет! Вот еще темы с ответами:

Поля структуры: код телевизионного канала, название, цена. Операция: найти самый дорогой канал - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;conio.h&gt; #include&lt;stdio.h&gt; #include &lt;string&gt; using namespace std; int...

Какие из этих методов можно и стоит отметить как константные (имеется ввиду логическая константность) - C++
Пусть теперь класс String выглядит следующим образом: struct String { String(const char *str = &quot;&quot;); /* 1 */ ...

Оператор присвоения копии для класса, действующего как значения - C++
Приветсвую. Увидел в книге Липпмана, &quot;Язык программирования С++. Базовый курс&quot;, определение оператора присвоения для класса, действующего...

Реализовать класс Account, представляющий собой банковский счет. В классе должны быть четыре поля - C++
Реализовать класс Account, представляющий собой банковский счет. В классе должны быть четыре поля: фамилия владельца, номер счета, процент...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.07.2010, 00:15
Ответ Создать тему
Опции темы

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