Сегодня я рассмотрю пример перегрузки оператора для класса, где одним из полей является массив шаблонного типа, а сам класс-шаблонный.
Вспомним какие перегруженные операторы должны быть обязательно членами класса, какие нет.
Из таблицы видно, что оператор [] должен быть обязательно членом класса, то есть никаких friend'ов и так далее. Вспомним, что, если какой-то operator (оператор) является членом класса, то this является неявным аргументом.
Например, если оператор+ член класса, то мы его записываем так:
R T::operator +(S b);
Если, friend, то:
R operator +(S a, T b);
Теперь разберемся зачем нам использовать ссылку для возврата. Мы ее используем в том случае, когда не хотим, чтобы создавался временный объект и он возвращался, а возвращалась ссылка на измененный объект.
Класс:
template < typename Type>
class A {
private:
Type *mas;
unsigned _size;
public:
A (unsigned size){
_size=size;
mas=new Type[_size];
for (unsigned i=0; i< _size; i++){
mas[i]=i;
}
}
Type& operator[](const unsigned index) const;
};
Теперь само определение перегруженного оператора:
template < typename Type> Type& A< Type>::operator[](const unsigned index) const{
try { //поискать ошибку
if (index< 0||index>_size){
throw("out of range"); //вбросить
}
return mas[index]; //возвратить элемент
}
catch(const char *msg){ //поймать ошибку
puts(msg);
exit(1);
}
}
unsigned x;
cout< < "Enter size of mas: ";
cin>>x;
A< unsigned> a(x);
cout< < endl;
for (unsigned i=0; i< x; i++){
cout< < "Element: "< < i< < " "< < a[i]< < endl;
}
Демонстрация:
0 коммент.:
Отправить комментарий