Commit 01002383 by Patryk Czarnik

refaktoryzacja - wydzieleneie pętli kopiujących do oddzielnych funkcji

parent 26511aef
#include <iostream> #include <iostream>
#include "wektor.h" #include "wektor.h"
const TypIndeksu startowy_rozmiar_tablicy = 8;
// Dla klas, które same zarządzają pamięcią, istotne jest zdefiniowanie // Dla klas, które same zarządzają pamięcią, istotne jest zdefiniowanie
// w spójny sposób takich elementów klasy, jak: // w spójny sposób takich elementów klasy, jak:
// - konstruktor kopiujący // - konstruktor kopiujący
// - operator przypisania // - operator przypisania
// - destruktor // - destruktor
// Definicje pomocnicze - unikamy duplikacji kodu.
// To jest zwykła funkcja wewnętrzna dla tego pliku
// BTW w języku C mamy memcpy, które robi coś takiego i może działać bardziej wydajnie...
void kopiuj_zawartosc_tablicy(TypWartosci *cel, TypWartosci *zrodlo, TypIndeksu rozmiar) {
for(TypIndeksu i=0; i<rozmiar; i++) {
cel[i] = zrodlo[i];
}
}
// To jest metoda prywatna w klasie Wektor - dzięki temu
// (że jest metodą, a nie zewnętrzną funkcją) ma dostęp do pól prywatnych.
void Wektor::kopiuj_elementy(const Wektor &zrodlowy) {
rozmiar_tablicy = zrodlowy.rozmiar_tablicy;
liczba_elementow = zrodlowy.liczba_elementow;
t = new TypWartosci[rozmiar_tablicy];
kopiuj_zawartosc_tablicy(t, zrodlowy.t, liczba_elementow);
}
const TypIndeksu startowy_rozmiar_tablicy = 8;
Wektor::Wektor() Wektor::Wektor()
: rozmiar_tablicy{startowy_rozmiar_tablicy}, : rozmiar_tablicy{startowy_rozmiar_tablicy},
liczba_elementow{0} liczba_elementow{0}
...@@ -22,22 +42,12 @@ Wektor::Wektor() ...@@ -22,22 +42,12 @@ Wektor::Wektor()
// - wzajemne nadpisywanie zawartości podczas operowania na dwóch zmiennych // - wzajemne nadpisywanie zawartości podczas operowania na dwóch zmiennych
// - double free pod koniec życia obiektów // - double free pod koniec życia obiektów
Wektor::Wektor(const Wektor &zrodlowy) Wektor::Wektor(const Wektor &zrodlowy)
: rozmiar_tablicy{zrodlowy.rozmiar_tablicy},
liczba_elementow{zrodlowy.liczba_elementow}
{ {
t = new TypWartosci[rozmiar_tablicy]; kopiuj_elementy(zrodlowy);
for(TypIndeksu i=0; i<liczba_elementow; i++) {
t[i] = zrodlowy.t[i];
}
} }
Wektor& Wektor::operator=(const Wektor &zrodlowy) { Wektor& Wektor::operator=(const Wektor &zrodlowy) {
rozmiar_tablicy = zrodlowy.rozmiar_tablicy; kopiuj_elementy(zrodlowy);
liczba_elementow = zrodlowy.liczba_elementow;
t = new TypWartosci[rozmiar_tablicy];
for(TypIndeksu i=0; i<liczba_elementow; i++) {
t[i] = zrodlowy.t[i];
}
return *this; return *this;
} }
...@@ -55,9 +65,7 @@ void Wektor::push_back(TypWartosci e) { ...@@ -55,9 +65,7 @@ void Wektor::push_back(TypWartosci e) {
// przerzuć elementy do większej tablicy // przerzuć elementy do większej tablicy
rozmiar_tablicy = 2*rozmiar_tablicy; rozmiar_tablicy = 2*rozmiar_tablicy;
TypWartosci *nt = new TypWartosci[rozmiar_tablicy]; TypWartosci *nt = new TypWartosci[rozmiar_tablicy];
for(TypIndeksu i=0; i<liczba_elementow; i++) { kopiuj_zawartosc_tablicy(nt, t, liczba_elementow);
nt[i] = t[i];
}
delete[] t; delete[] t;
t = nt; // do t wpisujemy wskaźnik do nowe tablicy t = nt; // do t wpisujemy wskaźnik do nowe tablicy
} }
......
...@@ -17,6 +17,10 @@ class Wektor { ...@@ -17,6 +17,10 @@ class Wektor {
TypIndeksu liczba_elementow; TypIndeksu liczba_elementow;
// powinno być liczba_elementow <= rozmiar_tablicy // powinno być liczba_elementow <= rozmiar_tablicy
// pomocnicze metody prywatne
/** Z podanego wektora kopiuje elementy do wektora bieżącego. */
void kopiuj_elementy(const Wektor &zrodlowy);
public: public:
Wektor(); Wektor();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment