// chapitre 4 surcharge operateurs.cpp : définit le point d'entrée pour l'application console.
//

#include "stdafx.h"

#include <iostream>
using namespace std;

class Chaine
{
private:
	int t_buf;
	char*buffer;
	int longueur;
public:

	friend ostream& operator<<(ostream& out,Chaine&);

	Chaine::Chaine(const Chaine & ch)
	{
		t_buf=ch.t_buf;
		longueur=ch.longueur;
		buffer=new char[ch.t_buf]; 	// ch référence
		for(int i=0; i<ch.longueur; i++)
			buffer[i]=ch.buffer[i];
	}

	Chaine()
	{
		t_buf=500;
		buffer=new char[t_buf];
		longueur=0;
	}

	Chaine(char*s)
	{
		t_buf=strlen(s)+1;
		buffer=new char[t_buf];
		longueur=strlen(s);
		strcpy(buffer,s);
	}		


	Chaine& operator+(char c)
	{
		buffer[longueur++]=c;
		return *this;
	}

	void afficher()
	{
		for(int i=0; i<longueur; i++)
			printf("%c",buffer[i]);
		printf("\n");
	}

	int length()
	{
		return longueur;
	}

	char operator[](int index)
	{
		return buffer[index];
	}

	Chaine& operator=(const Chaine& ch)
	{
		if(this!=&ch)
		{
			delete buffer;
			buffer=new char[ch.t_buf]; 	// ch référence
			for(int i=0; i<ch.longueur; i++)
				buffer[i]=ch.buffer[i];
			longueur=ch.longueur;
		}
		return *this;
	}

	operator char*()
	{
		char*out;
		out=new char[longueur+1];
		buffer[longueur]=0;
		strcpy(out,buffer);
		return out;
	}
} ;

ostream& operator<<(ostream& out, Chaine& ch)
{
	for(int i=0; i<ch.longueur; i++)
		out << ch[i];

	return out;
}

int main(int argc, char* argv[])
{
	Chaine c("bonjour ");
	cout << c << "\n";	// cout est un objet de type ostream

	c=c+'V';
	c+'o';
	Chaine d=c+'u'+'s'+'\n';
	d.afficher();

	for(int i=0; i<d.length(); i++)
		printf("%c ",d[i]);

	char*s=(char*) d;
	printf("d=%s",s);	

	return 0;
}

