Константность членов класса
{
int* const data;
My(): data( (int*)malloc(100) ) {};
~My()
{
if ( data != NULL )
{
free(data);
[COLOR="Red"]//data = NULL; - естественно компайлер ругается.[/COLOR]
}
}
}
Но как же тогда обеспечить константность такого рода членов класса?
Значит член не должен менятся. Т.е. что бы я случайно его не изменил.
Должен. Я про это и написал.
Насамом деле я решил эту проблему при помощи дефайнов. Т.е. собираю все с включеным дефайном - смотрю, что нигде не напортачил, а для рабочей версии отключаю его нафиг. Думаю может есть какое-то стандартное средство, которое я не знаю?
Ну так а в чем проблема - const для этого и служит и не дает изменить, в том числе присвоить NULL.
В чем тогда вопрос то?
Вопрос в том, что мне надо это присвоение NULL сделать и в тоже время быть уверенным что я нигде не потерял указатель.
Ну а чем тебе не нравиться использовать const_cast?
или так:
{
public:
Class()
: m_aData(new int[100])
{
}
~Class()
{
delete[] m_aData;
}
private:
int* const m_aData;
};
Eсли же выделение памяти обломится сгенерится исключение std::bad_alloc, а присвоение NULL'а в деструкторе уже мало значения имеет, ибо объекта не станет по выходу из него.
PS: С исключениями в инициализаторе надо быть внимательнее, как и вообще с исключениями.
PS2: Приведений типов в грамотно спроектированном программном комплексе быть практически не должно, если они появляются, значит в 90% случаев кто то облажался на этапе проектирования.
Сколько лет программирую, никогда поля-указатели случайно не менялись :)
И вообще, все поля должны быть private, и внутри класса достаточно просто чуть-чуть внимания. А для доступа извне достаточно создать public/protected свойства или методы, которые будут возвращать адрес объекта, и никто его неизменит.
Если ты настолько опасен -- используй комментарии;)
Для этого, как уже сказали и существует private.
или так:
Да потому, что const_cast - зло, а в данном случае ещё и нелепость. Зачем насаждать свой код нелепым неуместным злом? Чтоб он дурно пах?