#ifndef TABLEAU_H #define TABLEAU_H #include #include "math.h" using namespace std; template class Tableau { private: size_t taille; TYPE* tab; //supprime la mémiore pointée par tab et le met à nullptr void nettoyer(); public: Tableau(); //créé un tableau de taille n avec contenu non-initialisé Tableau(size_t n); Tableau(const Tableau& src); ~Tableau(); Tableau& operator=(const Tableau& src); void redimensionner(size_t n); size_t size(); TYPE& operator[](size_t i); }; ////////////////////// // IMPLÉMENTATION ////////////////////// template Tableau::Tableau() { tab = nullptr; taille = 0; } template Tableau::Tableau(size_t n) { //déléguer la création vers redimensionner //pour que ça fonctionne, il faut s'assurer d'avoir tab = nullptr tab = nullptr; redimensionner(n); } template Tableau::Tableau(const Tableau &src) { tab = nullptr; (*this) = src; } template Tableau::~Tableau() { nettoyer(); } template void Tableau::redimensionner(size_t n) { TYPE* temp = new TYPE[n]; //copier les elements qui doivent rester dans le tableau, s'il y a lieu if (tab) { for (size_t i = 0; i < min(taille, n); i++) { temp[i] = tab[i]; } nettoyer(); //suppression du tab original } taille = n; tab = temp; } template Tableau& Tableau::operator=(const Tableau& src) { //tab = src.tab; //A NE SURTOUT PAS FAIRE: CECI NE COPIERAIT QUE LE POINTEUR, PAS SON CONTENU taille = src.taille; nettoyer(); tab = new T[src.taille]; for (size_t i = 0; i < taille; i++) { tab[i] = src.tab[i]; } return *this; } //pas fait en classe template void Tableau::nettoyer() { if (tab) { delete [] tab; tab = nullptr; } } template size_t Tableau::size() { return taille; } template TYPE& Tableau::operator[](size_t i) { //note: pas notre problème de vérifier les bornes return tab[i]; } #endif