Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Константность членов класса

8.9K
23 июля 2007 года
Kulti
77 / / 29.07.2006
У меня следующая проблема. Есть класс:
Код:
class My
{
  int* const data;
  My(): data( (int*)malloc(100) ) {};
  ~My()
  {
    if ( data != NULL )
    {
      free(data);
      [COLOR="Red"]//data = NULL; - естественно компайлер ругается.[/COLOR]
    }
  }
}

Но как же тогда обеспечить константность такого рода членов класса?
240
23 июля 2007 года
aks
2.5K / / 14.07.2006
А что по твоеому значит константность и почему компилятор не должен ругаться на изминение константы???
8.9K
23 июля 2007 года
Kulti
77 / / 29.07.2006
Цитата: aks
А что по твоеому значит константность

Значит член не должен менятся. Т.е. что бы я случайно его не изменил.

Цитата: aks
и почему компилятор не должен ругаться на изминение константы???

Должен. Я про это и написал.
Насамом деле я решил эту проблему при помощи дефайнов. Т.е. собираю все с включеным дефайном - смотрю, что нигде не напортачил, а для рабочей версии отключаю его нафиг. Думаю может есть какое-то стандартное средство, которое я не знаю?

240
23 июля 2007 года
aks
2.5K / / 14.07.2006
Цитата: Kulti
Значит член не должен менятся. Т.е. что бы я случайно его не изменил.


Ну так а в чем проблема - const для этого и служит и не дает изменить, в том числе присвоить NULL.

В чем тогда вопрос то?

8.9K
23 июля 2007 года
Kulti
77 / / 29.07.2006
[QUOTE=aks;203093В] чем тогда вопрос то?[/QUOTE]
Вопрос в том, что мне надо это присвоение NULL сделать и в тоже время быть уверенным что я нигде не потерял указатель.
240
23 июля 2007 года
aks
2.5K / / 14.07.2006
Значит не давай его никуда, где он может потеряться.
395
23 июля 2007 года
RelB
367 / / 09.11.2002
Цитата: Kulti
Вопрос в том, что мне надо это присвоение NULL сделать и в тоже время быть уверенным что я нигде не потерял указатель.

Ну а чем тебе не нравиться использовать const_cast?

 
Код:
const_cast<int*>(data) = NULL;

или так:
 
Код:
(int*)data = NULL;
260
23 июля 2007 года
Ramon
1.1K / / 16.08.2003
Код:
class Class
{
public:
    Class()
        : m_aData(new int[100])
    {
    }

    ~Class()
    {
        delete[] m_aData;
    }

private:
    int* const m_aData;
};


Eсли же выделение памяти обломится сгенерится исключение std::bad_alloc, а присвоение NULL'а в деструкторе уже мало значения имеет, ибо объекта не станет по выходу из него.

PS: С исключениями в инициализаторе надо быть внимательнее, как и вообще с исключениями.
PS2: Приведений типов в грамотно спроектированном программном комплексе быть практически не должно, если они появляются, значит в 90% случаев кто то облажался на этапе проектирования.
309
23 июля 2007 года
el scorpio
1.1K / / 19.09.2006
Странный вопрос.
Цитата:
Значит член не должен менятся. Т.е. что бы я случайно его не изменил.


Сколько лет программирую, никогда поля-указатели случайно не менялись :)

И вообще, все поля должны быть private, и внутри класса достаточно просто чуть-чуть внимания. А для доступа извне достаточно создать public/protected свойства или методы, которые будут возвращать адрес объекта, и никто его неизменит.

8.9K
23 июля 2007 года
Kulti
77 / / 29.07.2006
Всем спасибо. Просто я такой человек - пишу порывами. Могу через две недели опять за этот код сесть и случайно забыть, напутать, ну человек же я в конце-то концов! Хотелось себя обезопасить от себя самого так сказать ))
63
23 июля 2007 года
Zorkus
2.6K / / 04.11.2006
Цитата: Kulti
Могу через две недели опять за этот код сесть и случайно забыть, напутать, ну человек же я в конце-то концов! Хотелось себя обезопасить от себя самого так сказать ))


Если ты настолько опасен -- используй комментарии;)

3
24 июля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Kulti
Всем спасибо. Просто я такой человек - пишу порывами. Могу через две недели опять за этот код сесть и случайно забыть, напутать, ну человек же я в конце-то концов! Хотелось себя обезопасить от себя самого так сказать ))


Для этого, как уже сказали и существует private.

Цитата: RelB
Ну а чем тебе не нравиться использовать const_cast?
 
Код:
const_cast<int*>(data) = NULL;

или так:
 
Код:
(int*)data = NULL;


Да потому, что const_cast - зло, а в данном случае ещё и нелепость. Зачем насаждать свой код нелепым неуместным злом? Чтоб он дурно пах?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог