Тест кода

Тема в разделе "LANGS.C", создана пользователем srm, 3 авг 2011.

  1. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Код (Text):
    1. #include <iostream>
    2.  
    3. template<class face>
    4. face getFace(face)
    5. {
    6.     static face _face;
    7.     return _face;
    8. };
    9.  
    10. template<class face>
    11. face* getFace(face*)
    12. {
    13.     static face _face;
    14.     return &_face;
    15. };
    16.  
    17. template<char className>
    18. struct SimpleFace
    19. {
    20.     void printMe()
    21.     {
    22.         std::cout << "ClassName is "<< className << std::endl;
    23.     };
    24. };
    25.  
    26. template<class face, char className>
    27. struct TrollFace : public SimpleFace<className>
    28. {
    29.     face operator->() const
    30.     {
    31.         return getFace(face());
    32.     };
    33. };
    34.  
    35. typedef SimpleFace<'H'> H;
    36. struct G: public TrollFace< H, 'G'>{};
    37. struct F: public TrollFace< G, 'F'>{};
    38. struct E: public TrollFace< F*, 'E'>{};
    39. struct D: public TrollFace< E*, 'D'>{};
    40. struct C: public TrollFace< D*, 'C'>{};
    41. struct B: public TrollFace< C, 'B'>{};
    42. struct A: public TrollFace< B, 'A'>{};
    43.  
    44. int main()
    45. {
    46.     A a;
    47.     a.printMe();  // 'A'
    48.     a->printMe(); // 'D'
    49. }
    На сайте говнокод.ру наткнулся на такой вот кусок кода. Это был тест в одну из фирм. Объясните, почему во втором случае выводится D? почему operator->() вызывается 3 раза? По идее он должен вызываться только для A::operator->() и, соответственно, возвращать класс B и далее у этого класса должен вызываться метод printMe().
     
  2. reversecode

    reversecode Guest

    Публикаций:
    0
    что мешает прочитать там же и обьяснение?
    http://www.govnokod.ru/7204#comment96138
     
  3. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    то есть в коде

    Код (Text):
    1. std::auto_ptr<A> a(..);
    2. a->f();
    оператор -> по сути отрабатывает 2 раза: первый для класса std::auto_ptr, второй - непосредственно для указателя A*, возвращаемого этим оператором?
     
  4. reversecode

    reversecode Guest

    Публикаций:
    0
    auto_ptr не пользуюсь, поэтому не знаю его поведение
    загляните в исходный код темплейта и поймете
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    srm

    Ага, и для shared_ptr, и для scoped_ptr, и т.д.
     
  6. srm

    srm New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2011
    Сообщения:
    189
    Код (Text):
    1. class B
    2. {
    3. public:
    4.     void func()
    5.     {
    6.     }
    7. };
    8.  
    9. class A
    10. {
    11. public:
    12.     B* operator -> ()
    13.     {
    14.         static B b;
    15.         return &b;
    16.     }
    17. };
    18.  
    19. int main()
    20. {
    21.     A a;
    22.     a->func();
    23. }
    Как-то коряво получается: как бы вызываю метод класса A, а на самом деле дёргается метод класса B.. Любой нормальный человек пойдёт искать у класса A метод func, не найдёт и сойдёт с ума.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    srm

    Ничего корявого. Это специальное свойство оператора ->, которое отдельно оговорено в стандарте.