przeciążanie operatorów a wskaźniki

0

witam,
mam taką klasę

template <class T> class Test : public ITest<T>
{
public:
	Test(): atrybuty(NULL),size(0){}
	Test(const long int &_size)
	{
		try
		{
		atrybuty=new T[_size];
		this->SetSize(_size);
		}
		catch(bad_alloc *ex)
		{
			cout<<ex->what()<<endl;
		}
	}
	~Test()
	{
		if(atrybuty!=NULL)
			delete []atrybuty;
	}

	...jakiś kod...

	T& operator [ ](const int &i)
	{
		try
		{
		return atrybuty[i];
		}
		catch(bad_exception *ex)
		{
			cout<<ex->what()<<endl;
		}
	}

	...jakiś kod...

private:
	void SetSize(const long int &_size)
	{size=_size;}

	T *atrybuty;
	int size;
};
 

i np. napiszę taki kod:

 Test<string> test(2);
	test[0]="ala";
	test[1]="ma";
	test[2]="kota";

	cout<<test[0]<<" "<<test[1]<<" "<<test[2]<<endl;

to wszystko działa, ale dla poniższego już nie:

Test<string> *test=new Test<string>(3);
	test[0]="ala";
	test[1]="ma";
	test[2]="kota";

	cout<<test[0]<<" "<<test[1]<<" "<<test[2]<<endl; 

Nie jestem orłem ze wskaźników i być może popełniam jakiś banalny błąd.

z góry dzięki za pomoc

2

Ale to przecież jest zwyczajnie źle. I pierwsze i drugie. Skoro robisz sobie test(2) to nie możesz wywołać potem test[2] bo takiego elementu nie masz!
Co do drugiego kodu to przecież musisz zrobić:

(*test)[0] = "ala"

Bo w innym wypadku zadziała operator [] nie dla twojego typu Test<> tylko dla zwykłej arytmetyki wskaźnikowej. Tzn dla:

test[1] = "ala";

zostanie wykonane

*(test+sizeof(Test<string>)) = "ala";
0

czemu wg. Ciebie pierwszy jest zły?
przecież w tym kodzie przesyłam 3 do konstruktora

 Test<string> test(3);

a tu zwyczajnie używam przeciążonego operatora?

 test[0]="ala";
	test[1]="ma";
	test[2]="kota";

Dlaczego to jest źle? Działa przecież, chociaż wiem, że jest to kiepski argument

0
Shalom napisał(a)

Bo w innym wypadku zadziała operator [] nie dla twojego typu Test<> tylko dla zwykłej arytmetyki wskaźnikowej. Tzn dla:

test[1] = "ala";

zostanie wykonane

*(test+sizeof(Test<string>)) = "ala";

sizeof? Przecież arytmetyka wskaźnikowa zajmuje się tym pod spodem, test[1] to raczej *(test + 1).

0

Czy ktoś zwrócił uwagę na try.catch w operatorze [] ?

T& operator [ ](const int &i)
{
	try
	{
		return atrybuty[i];
	}
	catch(bad_exception *ex)
	{
		cout<<ex->what()<<endl;
	}
}

Wiem, że nie o to było pytanie, ale czy to przypadkiem nigdy nie rzuca wyjątku ? (atrybuty[i])
Dodatkowo czy nie powinien przechwytywać wyjątku przez referencje ?

0

Nie wyrzuca, poleci raczej segmentation fault; C++ FAQ mówi, że mimo wszystko lepiej przechwytywać przez referencję.

Poza tym dziwaczny pomysł z bad_exception. Bad_exception służyło jako ostatnia linia "obrony" po naruszeniu specyfikacji wyjątku, ale to już wszystko przeszłość, bo w nowym standardzie specyfikacje zostały usunięte.

1 użytkowników online, w tym zalogowanych: 0, gości: 1