Возврат локальной переменной по ссылке

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

  1. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    не смотрите на название темы, по ходу дела пришлось перефразировать вопрос))) есть класс Parent... от него наследуются классы Child1, ..., ChildN... в классе Parent определен конструктор копирования из объекта класса Parent... а так же набор операторов... в наследниках этот функционал перегружается своими реализациями... каким образом грамотно сделать конструктор копирования в наследниках, чтобы была возможна запись:
    Код (Text):
    1. ChildX chx;
    2. ChildY chy = chx;
    и тот же вопрос по поводу оператора, например:
    Код (Text):
    1. ChildX chx;
    2. ChildY chy;
    3. Childz chz;
    4. chx = chx + chy;
    запись вида:
    Код (Text):
    1. ChildX::ChildX(Parent& Obj)
    2. {
    3. ...
    4. }
    5.  
    6. Parent& ChildX::operator +(Parent& Obj)
    7. {
    8. ...
    9. }
    не дает нужного результата...
     
  2. 100gold

    100gold New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2010
    Сообщения:
    165
    Код (Text):
    1. class Parent
    2. {
    3. public:
    4.     int i;
    5.     Parent()
    6.     {
    7.         i = 2;
    8.     }
    9.     void print()
    10.     {
    11.         printf("%i\n",i);
    12.     }
    13.     Parent& operator+(Parent&u)
    14.     {
    15.         i += u.i;
    16.         return *this;
    17.     }
    18. };
    19.  
    20. class ChildX : public Parent
    21. {
    22. public:
    23.     ChildX()
    24.     {
    25.         i=3;
    26.     }
    27.  
    28. };
    29.  
    30. class ChildY : public Parent
    31. {
    32. public:
    33.     ChildY(Parent&x)
    34.     {
    35.         i=x.i;
    36.     };
    37. };
    38.  
    39. int main()
    40. {
    41.     ChildX cx;
    42.     ChildY cy = cx;
    43.     cy.print();
    44.     cy = cy + cx;
    45.     cy.print();
    46.     return 0;
    47. }
     
  3. A_Karetnikov

    A_Karetnikov New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2011
    Сообщения:
    1
    спасибо
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    спасибо... у меня пока что возникают странные проблемы... если два наследника через оператор тайпкаста совместимы со стандартным типом и оба имеют конструктор/оператор = совместимый с этим типом, то копирование происходит через стандартный тип, а не через родителя...
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ого))) как же я это упустил)))
     
  6. sergegers

    sergegers New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2008
    Сообщения:
    172
    Код (Text):
    1. #include <iostream>
    2.  
    3. class Parent
    4. {
    5.  
    6. public:
    7.     Parent()
    8.     {
    9.         std::cout << "ParentDef" << std::endl;  
    10.     }
    11.     Parent(const Parent &)
    12.     {
    13.         std::cout << "ParentCopy" << std::endl;
    14.     }
    15.     operator int () const
    16.     {
    17.         return 0;
    18.     }
    19. };
    20.  
    21. class Child1: public Parent
    22. {
    23. public:
    24.     Child1()
    25.     {
    26.         std::cout << "Child1Def" << std::endl;
    27.     }
    28.     template <typename T>
    29.     Child1(const T &t): Parent(t)
    30.     {
    31.         std::cout << "Child1Copy" << std::endl;
    32.     }
    33.  
    34.     operator int () const
    35.     {
    36.         return 1;
    37.     }
    38. };
    39.  
    40. class Child2: public Parent
    41. {
    42. public:
    43.     Child2()
    44.     {
    45.         std::cout << "Child2Def" << std::endl;
    46.     }
    47.     template <typename T>
    48.     Child2(const T &t):Parent(t)
    49.     {
    50.         std::cout << "Child2Copy" << std::endl;
    51.     }
    52.     operator int () const
    53.     {
    54.         return 2;
    55.     }
    56. };
    57.  
    58. int main(int argc, _TCHAR* argv[])
    59. {
    60.     Child1 c1;
    61.     Child2 c2 = c1;
    62.     return 0;
    63. }