next up previous contents
Next: Deuxième amélioration Up: LEÇON Les classes Triangulation Previous: Première amélioration

Protection contre les dépassements de tableau

Pour se protéger contre les dépassements de tableau on utilise la classe template suivante

template <class T> class A{
 public:       T *cc;      
               long size;  
                    
void init(long ssize);
T&  operator [] (long i) const
    {
      assert ( cc&&(i >= 0) && (i < size) );
      return cc[i];
    }    
 A(long csize = 0)
    {
      size = csize;
      if (size > 0 ) cc = new T[size]; 
      else cc = 0;
    } 
 A(const A& a); 
 A& operator=(const A& a); 
~A() { delete [] cc;size = 0; }  
void destroy() { delete [] cc;size = 0; cc=0; }
int no( T* t) const { return t - cc;}  // return place in array
};

//-----------------------------------------------------
template <class T> void A<T>::init(long ssize)
    {
      assert( !cc && ssize );
      size=ssize;
      cc= new T[size];              
      assert(cc != 0);      
    } 
//-----------------------------------------------------
template <class T>  A<T>::A(const A<T>& a)
    {
       if( a.cc && a.size )
      	{ size = a.size; cc = new T[size];
         for(int i=0; i<size;i++) cc[i] = a.cc[i];
       }
    }
//-----------------------------------------------------
template <class T> A<T>& A<T>::operator=(const A<T>& a)
    {
       assert( cc && a.cc && (a.size==size) );
       for(int i=0; i<size;i++) cc[i] = a.cc[i];
       return *this;
    }

Toute création de tableau doit passer maintenant par les classes A<type>.



Olivier Pironneau
Mon May 17 17:14:42 METDST 1999