#include <iostream>

using namespace std;


class Nstring
{
    public:
        Nstring();
        Nstring(const char *chaine);
        Nstring(const Nstring &chaine);
        ~Nstring();
        int longueur(const char *chaine);
        char *copie(const char *chaine);
        void afficher();
        Nstring operator=(const char *chaine);
        Nstring operator=(const Nstring &chaine);
        Nstring operator+(const char *chaine);
        Nstring operator+(const Nstring &chaine);
        friend std::istream &operator>>( std::istream &in, Nstring &chaine );
        char *getChaine();

    private:
        char *m_chaine;
        int len;
};

std::ostream &operator<<( std::ostream &out, Nstring &chaine );
std::istream &operator>>( std::istream &in, Nstring &chaine );


Nstring::Nstring()
{
    m_chaine = NULL;
    len = 0;
}

Nstring::Nstring(const char *chaine)
{
    m_chaine = copie(chaine);
    len = longueur(chaine);
}

Nstring::Nstring(const Nstring &chaine)
{
    m_chaine = copie(chaine.m_chaine);
    len = chaine.len;
}


Nstring Nstring::operator=(const char *chaine)
{
    delete[] m_chaine;
    m_chaine = copie(chaine);
    len = longueur(chaine);

    return *this;
}

Nstring Nstring::operator=(const Nstring &chaine)
{
    delete[] m_chaine;
    m_chaine = copie(chaine.m_chaine);
    len = chaine.len;

    return *this;
}

Nstring Nstring::operator+(const char *chaine)
{
    int tailleTotale = len + longueur(chaine);
    char *sommeChaines = new char[tailleTotale + 1];

    for (int i = 0 ; i < len ; i++)
    {
        sommeChaines[i] = m_chaine[i];
    }

    for (int i = len ; i < tailleTotale ; i++)
    {
        sommeChaines[i] = chaine[i - len];
    }
    sommeChaines[tailleTotale] = '\0';

    Nstring resultat(sommeChaines);
    delete[] sommeChaines;
    return resultat;
}

Nstring Nstring::operator+(const Nstring &chaine)
{
    int tailleTotale = len + chaine.len;
    char *sommeChaines = new char[tailleTotale + 1];

    for (int i = 0 ; i < len ; i++)
    {
        sommeChaines[i] = m_chaine[i];
    }

    for (int i = len ; i < tailleTotale ; i++)
    {
        sommeChaines[i] = chaine.m_chaine[i - len];
    }
    sommeChaines[tailleTotale] = '\0';

    Nstring resultat(sommeChaines);
    delete[] sommeChaines;
    return resultat;
}

ostream &operator<<( ostream &out, Nstring &chaine )
{
    out << chaine.getChaine();
    return out;
}

istream &operator>>( istream &in, Nstring &chaine )
{
    char t[100];
    in>>t;
    chaine.m_chaine=chaine.copie(t);
    //in >> chaine.m_chaine;
    return in;
}



char *Nstring::getChaine()
{
    return m_chaine;
}

void Nstring::afficher()
{
    cout << m_chaine << endl;
}

int Nstring::longueur(const char *chaine)
{
    int i = 0;

    while (chaine[i] != '\0')
    {
        i++;
    }

    return i;
}

char *Nstring::copie(const char *chaine)
{
    int taille = longueur(chaine);
    if(m_chaine!=NULL)
      delete m_chaine;
    char *chaineCopie = new char[taille + 1];


    for (int i = 0 ; i < taille ; i++)
    {
        chaineCopie[i] = chaine[i];
    }
    chaineCopie[taille] = '\0';
    len=taille;
    return chaineCopie;
}


Nstring::~Nstring()
{
    delete[] m_chaine;
}
//----------------------------------------------------------------------------
class personnage
{
    public:
    personnage()
    {
        cout << "constructeur personnage" << endl;
    }
    ~personnage ()
    {
        cout << "destructeur personnage" << endl;
    }
};

class etudiant
{
    public:
     etudiant()
    {
        cout << "constructeur etudiant" << endl;
    }
    ~etudiant ()
    {
        cout << "destructeur etudiant" << endl;
    }

};


int main()
{

    return 0;

}
