#ifndef POINTER #define POINTER #include /***************** * Pointer *****************/ template class Pointer { public: class PointerOutOfRange : public std::exception{}; Pointer(); Pointer(const Pointer & pointer); Pointer & operator = (const Pointer & pointer); ~Pointer(); T * operator [](unsigned int index) throw(PointerOutOfRange); private: struct Data{ T * adress; unsigned int nbRef; }; void free() { if((data->nbRef)==1) { delete[] data->adress; delete data; } else data->nbRef--; } void copy(Pointer::Data * data) { data->nbRef++; this->data = data; } Data * data; }; /***************** * Pointer *****************/ template class Pointer { public: Pointer(); Pointer(const Pointer & pointer); Pointer(const T & t); Pointer & operator = (const Pointer & pointer); ~Pointer(); T * operator->(void); T & operator *(void) const; private: struct Data{ T * adress; unsigned int nbRef; }; void free() { if((data->nbRef)==1) { delete data->adress; delete data; } else data->nbRef--; } void copy(Pointer::Data * data){ data->nbRef++; this->data = data; } Data * data; }; /***************** * Pointer *****************/ template class Pointer { private: Pointer(); }; /*----------------------------------------- Definitions Pointer -----------------------------------------*/ template Pointer::Pointer() :data(new Data()) { data->adress = new T[N]; data->nbRef=1; } template Pointer::Pointer(const Pointer & pointer){ copy(pointer.data); } template Pointer & Pointer::operator =(const Pointer & pointer) { free(); copy(pointer.data); return (*this); } template Pointer::~Pointer(){ free(); } template T * Pointer::operator [](unsigned int index) throw(PointerOutOfRange){ if(index>(N-1)) throw PointerOutOfRange(); return &data->adress[index]; } /*----------------------------------------- Definitions Pointer -----------------------------------------*/ template Pointer::Pointer() :data(new Data()) { data->adress = new T(); data->nbRef=1; } template Pointer::Pointer(const T & t) :data(new Data()) { data->adress = new T(t); data->nbRef=1; } template Pointer::~Pointer(){ free(); } template T * Pointer::operator->(void){ return data->adress; } template T & Pointer::operator *(void) const{ return (*data->adress); } #endif