#include namespace spazio_stringa { class stringa { struct rappr; rappr* prappr; struct rifc { stringa& srif; int ind; rifc(stringa& str, int i) : srif(str), ind(i) { } void operator=(char c) { srif.inserisci(ind,c); } operator char() const { return srif.estrai(ind); } }; void ricrea(char*, int); public: stringa(); stringa(const char*); stringa(const stringa&); stringa& operator=(const stringa&); ~stringa(); char estrai(int) const; void inserisci(int, char); int dimensione() const; char operator [](int) const; rifc operator[](int); //Nota: restituisce un oggetto di rifc void ridimensiona(int); stringa& operator+=(const stringa&); friend bool operator==(const stringa&, const stringa&); friend ostream& operator<<(ostream&, const stringa&); friend istream& operator>>(istream&, stringa&); }; struct Errore { }; //Per le eccezioni stringa operator+(const stringa&, const stringa&); bool operator!=(const stringa&, const stringa&); class bruttacopia { char* s; int dim; public: bruttacopia(); bruttacopia(const char*); ~bruttacopia(); bruttacopia& operator=(const bruttacopia&); }; }