Commit 01002383 by Patryk Czarnik

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

parent 26511aef
#include <iostream>
#include "wektor.h"
const TypIndeksu startowy_rozmiar_tablicy = 8;
// Dla klas, które same zarządzają pamięcią, istotne jest zdefiniowanie
// w spójny sposób takich elementów klasy, jak:
// - konstruktor kopiujący
// - operator przypisania
// - 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()
: rozmiar_tablicy{startowy_rozmiar_tablicy},
liczba_elementow{0}
......@@ -22,22 +42,12 @@ Wektor::Wektor()
// - wzajemne nadpisywanie zawartości podczas operowania na dwóch zmiennych
// - double free pod koniec życia obiektów
Wektor::Wektor(const Wektor &zrodlowy)
: rozmiar_tablicy{zrodlowy.rozmiar_tablicy},
liczba_elementow{zrodlowy.liczba_elementow}
{
t = new TypWartosci[rozmiar_tablicy];
for(TypIndeksu i=0; i<liczba_elementow; i++) {
t[i] = zrodlowy.t[i];
}
kopiuj_elementy(zrodlowy);
}
Wektor& Wektor::operator=(const Wektor &zrodlowy) {
rozmiar_tablicy = zrodlowy.rozmiar_tablicy;
liczba_elementow = zrodlowy.liczba_elementow;
t = new TypWartosci[rozmiar_tablicy];
for(TypIndeksu i=0; i<liczba_elementow; i++) {
t[i] = zrodlowy.t[i];
}
kopiuj_elementy(zrodlowy);
return *this;
}
......@@ -55,9 +65,7 @@ void Wektor::push_back(TypWartosci e) {
// przerzuć elementy do większej tablicy
rozmiar_tablicy = 2*rozmiar_tablicy;
TypWartosci *nt = new TypWartosci[rozmiar_tablicy];
for(TypIndeksu i=0; i<liczba_elementow; i++) {
nt[i] = t[i];
}
kopiuj_zawartosc_tablicy(nt, t, liczba_elementow);
delete[] t;
t = nt; // do t wpisujemy wskaźnik do nowe tablicy
}
......
......@@ -17,6 +17,10 @@ class Wektor {
TypIndeksu liczba_elementow;
// 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:
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