Есть ф-ия типа:
int sign()const
{
return rand() % 2 ? 1 : -1;
}
которая не может вызвать неконстантный rand(), это как-нибудь лечится?
Здравствуйте, overt, Вы писали:
O>O>int sign()const
O>
O>которая не может вызвать неконстантный rand(), это как-нибудь лечится?
В целом
даАвтор: Erop
Дата: 04.09.07
, но, возможно немного неожиданным для тебя способом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>В целом даАвтор: Erop
Дата: 04.09.07
, но, возможно немного неожиданным для тебя способом...
В целом надо понять почему и зачем sign const, а rand нет. Каждая из них меняет значение класса?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, overt, Вы писали:
O>а если без классов?
А если без классов, то опиши более подробно что тебе надо. Потому что, пока что совсем не понятно в чём проблема "если без классов"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, overt, Вы писали:
O>Есть ф-ия типа:
O>O>int sign()const
O>{
O> return rand() % 2 ? 1 : -1;
O>}
O>
O>которая не может вызвать неконстантный rand(), это как-нибудь лечится?
Все закономерно. Функция
sign объявлена с модификатором
const. Это означает, что она *гарантирует* неизменность объекта (
mutable пока оставим за скобками). Отсюда следует, что она не может вызывать методы, не имеющие модификатора
const, которые *могут* изменять состояние объекта.
Что бы ответить на вопрос "как полечить?" необходимо разобраться, что вообще нужно. Первый вопрос, который возникает, это почему метод
rand определен как неконстантный? Если он не меняет состояние объекта, то нужно просто добавить к нему модификатор
const и все. Если
rand все же меняет состояние объекта, то ,таким образом,
sign тоже меняет состояние объекта, а значит,
sign нельзя вызывать для константных объектов и модификатор
const нужно с нее снять. Иногда бывают случаи, когда в классе определяют обе версии одной и той же функции — константную и неконстантную. Но, как мне кажется, здесь не тот случай.
Ну и наконец, можно разрулить систуацию, сделав
rand константным, а к тем полям, которые модифицируются при вызове
rand добавить ключевое слово
mutable. Но, прежде чем пойти на этот шаг, нужно хорошо подумать, не поломается ли при этом семантика класса вцелом, и не станет ли это сюрпризом для полоьзователей класса.
... << RSDN@Home 1.2.0 alpha rev. 787>>
Проснулся и понял, что ляпнул, не подумав. :shuffle: