
class functor{
public:
	virtual void operator() ();
	virtual char & operator[] (unsigned int);
};

void functor::operator() ()
{
	return;
}

char & functor::operator[] (unsigned int index)
{
	static char a=0;
	return a;
}

//fstr
class fstr:public functor{
	char *_tableau;
	unsigned int _dim;
public:
	fstr(char [],int);
	char & operator [] (unsigned int);
};

fstr::fstr(char tableau[], int dim)
{
	_tableau = tableau;
	_dim = dim;
}

char & fstr::operator[](unsigned int index)
{
	static char a=0;
	if (index < _dim)
		return *(_tableau+index);
	return a;
}

//fchg
class fchg:public functor{
	char _newchar;
	unsigned int _index;
	functor * _next;
public:
	fchg(char, int, functor * );
	char & operator [] (unsigned int);
};

fchg::fchg(char newchar, int index, functor * next)
{
	_newchar = newchar;
	_index = index;
	_next = next;
}

char & fchg::operator[] (unsigned int index)
{
	if (index!=_index)
		return (*_next)[index];
	return _newchar;
}