Re[6]: DEEP_CONST
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 11.01.06 08:49
Оценка:
Здравствуйте, _banned_dobrokot, Вы писали:

>> А если мне нужен дочерний узел для изменения, но при этом я владею только константным указателем на родителя (уже странно, не находишь?), то не >лучше ли сделать отдельные методы: get_writeable_right() и get_writeable_left()?


__>Ну и про модификатор const тоже можно сказать, что он не нужен, и что "просто не вызывайте функцию set_value" как и "не вызывайте *writable функции"

__>Достоинство квалификаторов — что компилятор проверит их сквозь десяток вызовов функций, во всей программе, даже в самом запутанном индусском коде-лапше.

Не понимаю, к чему ты это сказал. Если следовать моему предложению, то нет соглащений на уровне "просто не вызывайте вот это вот". Если есть const TreeNode и вызывается get_right, то получаем опять const TreeNode. Компилятор проверяет все квалификаторы, везде.

Но я бы, если бы мне пришлось делать какие-то подобные выкрутасы с деревьями, пошел бы еще дальше. Куда-то вот в эту степь:
class Writeable_Child_Accessor
  {
  public :
    TreeNode * get_right() const;
    TreeNode * get_left() const;
  ... /* Детали реализации */ ...
  };
class Nonwriteable_Child_Accessor
  {
  public :
    const TreeNode * get_right() const;
    const TreeNode * get_left() const;
  ... /* Детали реализации */ ...
  };

void f( Nonwriteable_Child_Accessor & node )
  {
    node.get_right()->set_value( 10 ); // БУМС! Получаем ошибку!
  }

void g( Writeable_Child_Accessor & node )
  {
    node.get_right()->set_value( 10 ); // Все нормально.
  }


Вот, в первом приближении, что-нибудь такое. Или дальше подумать, чтобы сам TreeNode реализовывал несколько интерфейсов (с тем, чтобы имея Nonwritable_Child_Accessor нельзя было через get_right()/get_left() получить Writeable_Child_Accessor для их дочерних узлов).


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.