asmodeus94

przeciazanieOperatorowF

Apr 28th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.78 KB | None | 0 0
  1. // przeciazanieOperatorowF.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <ctime>
  7. #include <assert.h>
  8.  
  9. using namespace std;
  10.  
  11. //#define assert(ignore) ((void)0) // odkomentowanie tej lini sprawi, ze asercje nie beda sprawdzane
  12.  
  13. class Tablica
  14. {
  15. private:
  16.     int *tab;
  17.     int rozmiar;
  18.     static int iloscTablic; // kolejne instancje obiektu Tablica inkrementuja iloscTablic (parametr wspolny tworzonych obiektow)
  19.     friend ostream& operator<<(ostream&, const Tablica&); // <<
  20.     friend istream& operator>>(istream&, Tablica&);       // >>
  21.     friend Tablica& operator||(Tablica&, const Tablica&); // ||
  22. public:
  23.     Tablica(int = 5);
  24.     Tablica(const Tablica&);
  25.     ~Tablica(void);
  26.     int getRozmiar() const;
  27.     Tablica& operator=(const Tablica&);                   // =
  28.     int operator==(const Tablica&) const;                 // ==
  29.     int operator!=(const Tablica&) const;                 // !=
  30.     int operator+(const Tablica&) const;                  // +
  31.     int& operator[](int);                                 // []
  32.     int& operator()(int);                                 // ()
  33.     Tablica* operator->();                                // ->
  34.     void przypiszLosoweWartosci(int = -100, int = 100);
  35.     static int getIloscObiektowTypuTablica();
  36. };
  37.  
  38. int Tablica::iloscTablic = 0;
  39.  
  40. Tablica::Tablica(int rozmiarTab)
  41. {
  42.     ++iloscTablic;
  43.     rozmiar = rozmiarTab;
  44.     tab = new int[rozmiar];
  45.     assert(tab != 0);
  46.     for (int i = 0; i<rozmiar; i++)
  47.         tab[i] = 0;
  48. }
  49. Tablica::Tablica(const Tablica& Tab)
  50. {
  51.     cout << "Konstruktor kopiujacy wywolany!" << endl;
  52.     ++iloscTablic;
  53.     rozmiar = Tab.rozmiar;
  54.     tab = new int[rozmiar];
  55.     assert(tab != 0);
  56.     for (int i = 0; i<rozmiar; i++)
  57.         tab[i] = Tab.tab[i];
  58. }
  59. Tablica::~Tablica(void)
  60. {
  61.     --iloscTablic;
  62.     delete[] tab;
  63. }
  64. int Tablica::getRozmiar() const
  65. {
  66.     return rozmiar;
  67. }
  68. Tablica& Tablica::operator=(const Tablica& zPrawejStrony)
  69. {
  70.     cout << "Przeciazony operator =" << endl;
  71.     if (this != &zPrawejStrony)
  72.     {
  73.         delete[] tab;
  74.         rozmiar = zPrawejStrony.rozmiar;
  75.         tab = new int[rozmiar];
  76.         assert(tab != 0);
  77.         for (int i = 0; i<rozmiar; i++)
  78.             tab[i] = zPrawejStrony.tab[i];
  79.     }
  80.     return *this;
  81. }
  82. int Tablica::operator==(const Tablica& zPrawejStrony) const
  83. {
  84.     if (rozmiar != zPrawejStrony.rozmiar)
  85.         return 0;
  86.     for (int i = 0; i<rozmiar; i++)
  87.         if (tab[i] != zPrawejStrony.tab[i])
  88.             return 0;
  89.     return 1;
  90. }
  91. int Tablica::operator!=(const Tablica& zPrawejStrony) const
  92. {
  93.     if (rozmiar != zPrawejStrony.rozmiar)
  94.         return 1;
  95.     for (int i = 0; i<rozmiar; i++)
  96.         if (tab[i] != zPrawejStrony.tab[i])
  97.             return 1;
  98.     return 0;
  99. }
  100. int Tablica::operator+(const Tablica &zPrawejStrony) const
  101. {
  102.     int suma = 0;
  103.     int rozmiarMaks = rozmiar <= zPrawejStrony.rozmiar ? rozmiar : zPrawejStrony.rozmiar;
  104.     for (int i = 0; i < rozmiarMaks; i++)
  105.     {
  106.         tab[i] += zPrawejStrony.tab[i];
  107.         suma += tab[i];
  108.     }
  109.     return suma;
  110. }
  111. int& Tablica::operator[](int index) // wyluskanie elementu i zwrocenie o numerze index
  112. {
  113.     cout << "Przeciazony operator [] dziala" << endl;
  114.     assert(0 <= index && index < rozmiar);
  115.     return tab[index];
  116. }
  117. int& Tablica::operator()(int index) // wyluskanie elementu (i zwrocenie) o indeksie rozmiar-index-1
  118. {                                   // a(0) - spowoduje wyluskanie (i zwrocenie) ostatniej wartosci z tab
  119.     cout << "Przeciazony operator () dziala" << endl;
  120.     index = rozmiar - index - 1;
  121.     assert(0 <= index && index < rozmiar);
  122.     return tab[index];
  123. }
  124. Tablica* Tablica::operator->() // zamiast do wlasciwosci/metod odwolywac sie przy pomocy kropki (.)
  125. {                              // mozemy to zrobic przy pomocy strzalki (->) - a->
  126.     return this;
  127. }
  128. void Tablica::przypiszLosoweWartosci(int odW, int doW)
  129. {
  130.     int il = doW - odW;
  131.     for (int i = 0; i < rozmiar; i++)
  132.         tab[i] = rand() % (il + 1) + odW;
  133. }
  134. int Tablica::getIloscObiektowTypuTablica()
  135. {
  136.     return iloscTablic;
  137. }
  138. Tablica& operator||(Tablica &zLewej, const Tablica &zPrawej) // c || a ;przepisywanie do tablicy obiektu c, tablicy obiektu a w odwrotnej kolejnosci
  139. {
  140.     if (zLewej.getRozmiar() != zPrawej.getRozmiar())
  141.         return zLewej;
  142.     int r = zLewej.getRozmiar();
  143.     for (int i = 0; i < r; i++)
  144.     {
  145.         zLewej.tab[i] = zPrawej.tab[r - i - 1];
  146.     }
  147.     return zLewej; // zwracana jest referencja do obiektu, dla ktorego zostal przeciazony operator
  148. }
  149. istream& operator>>(istream& wejscie, Tablica& t)
  150. {
  151.     for (int i = 0; i < t.rozmiar; i++)
  152.     {
  153.         cout << "Podaj " << i + 1 << ". element [" << i << "]: ";
  154.         wejscie >> t.tab[i];
  155.     }
  156.     return wejscie;
  157. }
  158. ostream& operator<<(ostream& wyjscie, const Tablica& t)
  159. {
  160.     for (int i = 0; i < t.rozmiar; i++)
  161.         wyjscie << t.tab[i] << (i < t.rozmiar-1 ? ", " : "");
  162.     return wyjscie;
  163. }
  164.  
  165. int main()
  166. {
  167.     srand(time(NULL));
  168.     // Zarowno do wlasciwosci i metod obiektow a, b i c moge odwolywac sie przy pomocy strzalki (->) - operator ten zostal przeciazony
  169.     Tablica a;
  170.     a->przypiszLosoweWartosci(0, 10);
  171.     Tablica b(a);
  172.     cout << "Obiekt a w tablicy tab zawiera nastepujace elementy: " << a << endl;
  173.     cout << "Aktualnie tablica obiektu b ma nastepujace wartosci: " << b << endl;
  174.     cout << "Do stworzonego obiektu b podaj " << b->getRozmiar() << " liczb" << endl;
  175.     cin >> b;
  176.     cout << "Teraz tablica obiektu b wyglada nastepujaco: " << b << endl;
  177.     cout << "Wyswietl 1. element a[0]: " << a[0] << endl;
  178.     cout << "Wyswietl 1. element od konca a(0): " << a(0) << endl;
  179.     cout << "Wyswietl 1. element b[0]: " << b[0] << endl;
  180.     cout << "Wyswietl 1. element od konca b(0): " << b(0) << endl;
  181.     cout << a << endl;
  182.     system("pause");
  183.     system("cls");
  184.     { // stworzono scope (zasieg) w celu szybszego wywolania destruktora obiektu c
  185.         cout << "Stworzono obiekt c(b)" << endl;
  186.         Tablica c = b; // i wywolano konstruktor kopiujacy, podajac jako parametr obiekt b; zapis tozsamy - c(b)
  187.         cout << c << endl; // wypisujemy zawartosc tablicy powstalej poprzez skopiowanie obiektu b
  188.         int suma = a + c; // przed zniszczeniem obiektu c powiekszymy wszystkie wartosci znajdujace sie w tablicy obiektu a, o wartosci z tablicy obiektu c
  189.         cout << "Suma wartosci tablicy a: " << suma << endl; // dodatkowo operacja a + c zwroci nam sume powstala z dodania tablic obiektow a i c
  190.     } // jezeli konstruktor kopiujacy zadzialal poprawnie podczas tworzenia obiektu c, to po zniszczeniu tego obiektu
  191.     cout << "Zawartosc tablicy obiektu a: " << a << endl;
  192.     cout << "Zawartosc tablicy obiektu b: " << b << endl; // bedzie mozliwe wyswietlenie tablicy obiektu b, w przeciwnym razie proba odczytu danych z tej tablicy
  193.                        // doprowadzi do bledu, a wyswietlone liczby beda "liczbami z kosmosu" ^^
  194.     system("pause");
  195.     system("cls");
  196.     cout << "Przypisujemy wszystie wartosci z obiektu b do obiektu a (a = b)" << endl;
  197.     cout << "Aktulna ilosc obiektow: " << a->getIloscObiektowTypuTablica() << endl;
  198.     cout << "Aktulna ilosc obiektow ((a = b)->getIloscObiektowTypuTablica()): " << ((a = b)->getIloscObiektowTypuTablica()) << endl; // a = b nie wywoluje konstruktora kopiujacego!
  199.     cout << "Tak wyglada teraz tablica obiektu a: " << a << endl;
  200.     cout << "Z kolei tablica obiektu b wyglada tak: " << b << endl; // musi byc taka sama ze wzgledu na powyzsze wyrazenie a = b; a = b zwraca referencje na samego siebie
  201.     cout << "a == b - " << ((a == b) ? "Prawda" : "Falsz") << endl; // prosty test logiczny
  202.     cout << "a != b - " << ((a != b) ? "Prawda" : "Falsz") << endl;
  203.     Tablica c; // ponownie tworzymy obiekt o nazwie c (wczesniejszy zostal zniszczony automatycznie po tym, jak skonczyl sie jego zasieg)
  204.     cout << "Pusta tablica obiektu c wyglada tak: " << c << endl;
  205.     c || a; // (c || a)-> ; po strzalce mozliwe jest odwolanie sie do jakiejkolwiek wlasciwosci lub metody obiektu (musza byc publiczne); nalezy pamietac o nawiasie
  206.     // w przeciwnym razie odwolamy sie do obiektu a, zamiast do obiektu c, ktory w tym przypadku jest zwracany (referencja do obiektu c)
  207.     cout << "Przepisana tablica obiektu a od konca do tablicy obiektu c: " << c << endl;
  208.     cout << "Liczba stworzonych tablic: " << a->getIloscObiektowTypuTablica() << endl;
  209.     system("pause");
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment