1. C++ / Говнокод #6166

    +160

    1. 1
    2. 2
    3. 3
    private:
    private:
    	friend class boost::iterator_core_access;

    Никому не покажу своего друга-буста

    Запостил: ClearHerdsman, 31 Марта 2011

    Комментарии (19) RSS

    • Вторгся в бустово пространство.
      Ответить
      • в связи с инцидентом МИД буста уже готовит ноту протеста.

        если кого вдруг позабавил этот кусок кода, посмотрите вот эти примерчики - http://www.boost.org/doc/libs/release/doc/html/signals2/examples.html#signals2.examples.deconstr uct =)
        Ответить
    • аффтар, ссылку на исходник, плиз.
      Ответить
    • не очень понял, что в коде не так?
      в приватной секции указан друг. и?
      Ответить
      • Скорее всего в том, друг более стандартен, чем приведенный код.
        Т.е. например вы пишете свой класс, где задаете друга вида std::string, который использовать скрытые поля вашего класса не собирается, потому что это не утверждено комитетом по стандартизации :)
        Ответить
        • Может, автор понял действие "друга" наоборот?
          Ответить
          • Автор всё понял правильно. boost::iterator_core_access и нужно объявлять дружеским, чтобы он работал (или же делать некоторые специальные члены публичными, что лишнее).
            Ответить
            • Я ещё могу понять, если бы boost::iterator_core_access был шаблонным классом, но в приведенном варианте что-то не клеится. Опять таки, если исходный класс не есть часть boost'а.
              Ответить
              • Это обычная плюсовая магия. Чтобы реализовать пользовательский итератор, нужно для него определить кучу операторов, причём часть из них обычно легко выражается через другие (одним и тем же кодом). Поэтому повторяющийся код можно вынести в шаблоны, а в самом итераторе определить только 6 базовых функции. Сами эти функции-члены лучше сделать приватными (пользователю они не нужны), но придётся объявлять френдами кучу шаблонных операторов. Чтобы сократить запись, все их собрали в класс boost::iterator_core_access, и теперь френдом нужно делать только его.

                В самом коде Буста:
                // iterator_core_access is the iterator's best friend.
                friend class iterator_core_access;


                Так что удивляться friend class boost::iterator_core_access — то же самое, что удивляться приватному конструктору или виртуальному деструктору. Это идиомы.
                Ответить
                • Магия магией, только где внутри iterator_core_access будет производиться использование пользовательского класса (в котором присутствует код из ГК)? Для ясности например сделаем так:
                  class A {
                  private:
                  	friend class boost::iterator_core_access;
                  ...
                  }

                  Как iterator_core_access получит доступ к представлению class A ?
                  Ответить
                  • Через шаблонные члены boost::iterator_core_access. Класс A наследуется от шаблонного класса boost::iterator_facade, у которого определены операции для итератора, они вызывают шаблонные функции из boost::iterator_core_access, а те имеют доступ к приватным функциям A. Ну возьмите и посмотрите /usr/include/boost/iterator/iterator_facade.hpp.
                    Ответить
                    • Как только сказали про наследование от шаблонного класса всё сразу прояснилось. Я почему-то такую возможность даже не рассматривал.
                      Ответить
        • Дело в том, что boost::iterator_core_access собирается использовать скрытые поля вашего класса.
          Ответить
          • boost::iterator_core_access собирается использовать скрытые поля вашего класса. Разрешить? [да/нет]
            Ответить
            • [да/нет/а вдруг]
              Ответить
              • boost::iterator_core_access собирается использовать скрытые поля вашего класса. Разрешить? [да/нет]

                нет
                а вот и не угадали!
                Ответить
        • Никогда не приходилось объявлять френдом какой-нибудь boost::checked_delete, чтобы позволить смарт-поинтеры со встроенным подсчётом ссылок для объектов с закрытым конструктором и деструктором?
          Ответить
      • Хочется верить, что постера смутило дважды повторенное private. Ничего, так бывает после рефакторинга. Тасовали объявления, были приватные и публичные вперемешку, потом часть перенесли вверх или вниз.
        Ответить

    Добавить комментарий