вызов неконстантной ф-ии из константной функции
От: overt Ниоткуда  
Дата: 27.06.08 21:47
Оценка:
Есть ф-ия типа:
int sign()const 
{ 
  return rand() % 2 ? 1 : -1; 
}


которая не может вызвать неконстантный rand(), это как-нибудь лечится?
(MS VS 7.1/8.0)
Re: вызов неконстантной ф-ии из константной функции
От: Erop Россия  
Дата: 27.06.08 22:11
Оценка: 1 (1) :)
Здравствуйте, overt, Вы писали:

O>
O>int sign()const 
O>

O>которая не может вызвать неконстантный rand(), это как-нибудь лечится?

В целом да
Автор: Erop
Дата: 04.09.07
, но, возможно немного неожиданным для тебя способом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Уточню.
От: Erop Россия  
Дата: 27.06.08 22:38
Оценка:
Здравствуйте, Erop, Вы писали:

E>В целом да
Автор: Erop
Дата: 04.09.07
, но, возможно немного неожиданным для тебя способом...

В целом надо понять почему и зачем sign const, а rand нет. Каждая из них меняет значение класса?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Уточню.
От: overt Ниоткуда  
Дата: 27.06.08 22:49
Оценка:
Здравствуйте, Erop, Вы писали:

E>В целом надо понять почему и зачем sign const, а rand нет. Каждая из них меняет значение класса?


а если без классов?
(MS VS 7.1/8.0)
Re[4]: Уточню.
От: Zigmar Израиль  
Дата: 28.06.08 00:26
Оценка: +1
Здравствуйте, overt, Вы писали:
E>>В целом надо понять почему и зачем sign const, а rand нет. Каждая из них меняет значение класса?
O>а если без классов?
А если без классов, то отпадает сам вопрос, так как константность методов, применима только к методам класса и обозначает может ли (и будет ли) метод модифицировать состояние класса (напрямую или через вызов другого метода).
"To protect people you must slay people. To let people live you must let people die. This is the true teaching of the sword."
-Seijuro Hiko, "Rurouni Kensin"
Re[4]: Уточню.
От: Erop Россия  
Дата: 28.06.08 04:33
Оценка:
Здравствуйте, overt, Вы писали:

O>а если без классов?

А если без классов, то опиши более подробно что тебе надо. Потому что, пока что совсем не понятно в чём проблема "если без классов"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: вызов неконстантной ф-ии из константной функции
От: rg45 СССР  
Дата: 28.06.08 06:04
Оценка: +2
Здравствуйте, 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>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Уточню.
От: overt Ниоткуда  
Дата: 28.06.08 06:51
Оценка:
Проснулся и понял, что ляпнул, не подумав. :shuffle:
(MS VS 7.1/8.0)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.