7.8. Supra?nc?rcarea func?iilor prietene pentru clasa derivat?

7.8. Supra?nc?rcarea func?iilor prietene pentru clasa derivat?

Func?iile prietene, fiind func?ii separate de orice clas?, pot fi numai supra?nc?rcate. Am avut deja un exemplu, c?nd am supra?nc?rcat operatorul << pentru clasa rational_fara_semn. Aici trebuie de luat ?n considera?ie c? prietenul clasei derivate nu este prietenul clasei de baz?, deci, func?ia prieten? a clasei derivate nu are acces la membrii priva?i ai clasei de baz?. La cei proteja?i are acces, fiindc? ei sunt accesibili ?n clasa derivat? ?i, respectiv, ?n orice func?ie prieten? a ei.

Continu?m analiza func?iilor prietene ale clasei de baz? fractie_rationala cu scopul de a lua decizia: care din ele trebuie s? fie supra?nc?rcate ca func?iile prietene ale clasei derivate rational_fara_semn?

Func?ia numitor_comun(), care aduce dou? frac?ii la un numitor comun, trebuie s? fie supra?nc?rcat?, lu?nd ?n considera?ie ?i partea ?ntreag?. Pentru a avea posibilitatea de a combina obiectele clasei derivate cu obiectele clasei de baz?, supra?nc?rc?m mai multe versiuni ale func?iei numitor_comun(), incluz?nd ?n declara?ia clasei rational_fara_semn urm?torul cod:

   friend void numitor_comun(rational_fara_semn &x,
                             rational_fara_semn &y)
   {
      x.numarat=x.part_int*x.numit+x.numarat;
                                  // c?mpurile numit ?i,
                                  // numarat sunt acce-
                                  // sibile de la ambii
                                  // parametri
      x.part_int=0;
      y.numarat=y.part_int*y.numit+y.numarat;
      y.part_int=0;
      if (x.numit!=y.numit)
      {
         x.numarat=x.numarat*y.numit;
         y.numarat=y.numarat*x.numit;
         x.numit=y.numit=x.numit*y.numit;
      }
   }
 
   friend void numitor_comun(rational_fara_semn &x,
                             fractie_rationala &y)
   {
      x.numarat=x.part_int*x.numit+x.numarat;
      x.part_int=0;
      if (x.numit!=y.numitor())
      {
         x.numarat=x.numarat*y.numitor(); 
                             // la y.numit ?i,
                             // y.numarat n-avem acces
         y.modif(y.numarator()*x.numit,
                              y.numitor()*x.numit);
         x.numit=y.numitor();
      }
   }
 
   friend void numitor_comun(fractie_rationala &x,
                             rational_fara_semn &y)
   {
      y.numarat=y.part_int*y.numit+y.numarat;
      y.part_int=0;
      if (x.numitor()!=y.numit)
      {
         y.numarat=y.numarat*x.numitor();
                             // la x.numit ?i,
                             // x.numarat n-avem acces
         x.modif(x.numarator()*y.numit,
                              x.numitor()*y.numit);
         y.numit=x.numitor();
      }
   }

Re?inem c? ultimele dou? din aceste trei func?ii, av?nd fiecare c?te un parametru de tipul fractie_rationala, nu au acces direct la c?mpurile private numit ?i numarat ale acestui parametru, fiindc? aceste func?ii sunt prietene ale clasei rational_fara_semn, nu ?ns? ale clasei fractie_rationala.

Verific?m, cum vor lucra aceste trei func?ii de supra?nc?rcare. Pentru aceasta, inser?m ?n func?ia main() a exemplului nostru urm?torul cod:

rational_fara_semn rp1(1, 3, 4), rp2(2, 1, 3),
                      rp3(1, 1, 2), rp4(2, 3, 4);
   fractie_rationala fr1(3, 5), fr2(2, 7);
 
   cout << rp1 << " si " << rp2 
        << " aduse la un numitoe comun devin:"
        << endl;
   numitor_comun(rp1, rp2);
   cout << rp1 << " si " << rp2 << " respectiv."
        << endl;
 
   cout << rp3 << " si " << fr1
        << " aduse la un numitoe comun devin:"
        << endl;
   numitor_comun(rp3, fr1);
   cout << rp3 << " si " << fr1 << " respectiv."
        << endl;
 
   cout << fr2 << " si " << rp4 
        << " aduse la un numitoe comun devin:"
        << endl;
   numitor_comun(fr2, rp4);
   cout << fr2 << " si " << rp4 << " respectiv."
        << endl;

Acest cod va afi?a urm?torul text:

1,3/4 si 2,1/3 aduse la un numitor comun devin:

21/12 si 28/12 respectiv.

1,1/2 si 3/5 aduse la un numitor comun devin:

15/10 si 6/10 respectiv.

2/7 si 2,3/4 aduse la un numitor comun devin:

8/28 si 77/28 respectiv.

U?or de convins c? rezultatele afi?ate sunt corecte; verifica?i acest fapt de sine st?t?tor cu creionul ?n m?n?.

Este important a ?n?elege c? aceste func?ii vor lucra corect f?r? supra?nc?rcare ?i ?n clasa rational derivat? de la rational_fara_semn, fiindc? aducerea la un numitor comun nu depinde de semnul num?rului ra?ional. ?ntr-adev?r, mai inser?m ?n func?ia main() ?nc? o por?iune de cod:

rational rn1(-1, 3, 4), rn2(-2, 1, 3),
            rn3(-1, 1, 2), rn4(-2, 3, 4);
   fractie_rationala fr3(3, 5), fr4(2, 7);
 
   cout << rn1 << " si " << rn2
        << " aduse la un numitor comun devin:"
        << endl;
   numitor_comun(rn1, rn2);
   cout << rn1 << " si " << rn2 << " respectiv."
        << endl;
 
   cout << rn3 << " si " << fr3
        << " aduse la un numitor comun devin:" 
        << endl;
   numitor_comun(rn3, fr3);
   cout << rn3 << " si " << fr3 << " respectiv." 
        << endl;
 
   cout << fr4 << " si " << rn4
        << " aduse la un numitor comun devin:" 
        << endl;
   numitor_comun(fr4, rn4);
   cout << fr4 << " si " << rn4 << " respectiv." 
        << endl;

Ne convingem c? textul afi?at de ultimul fragment ad?ugat va fi:

-1,3/4 si -2,1/3 aduse la un numitor comun devin:

-21/12 si -28/12 respectiv.

-1,1/2 si 3/5 aduse la un numitor comun devin:

-15/10 si 6/10 respectiv.

2/7 si -2,3/4 aduse la un numitor comun devin:

8/28 si -77/28 respectiv.

Compar?m acest text cu cel afi?at de c?tre fragmentul precedent.
_________________________
Autorul: dr.conf. S. Pereteatcu

рассказать друзьям и получить подарок

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов