Есть класс:
//----------- файл TArray.h
#include <iostream>
class Array
{ public:
// типы исключений:
class bad_Index {}; // индекс вне диапазона
class bad_Range {}; // если левый адрес > правый адрес
class bad_Size {}; // неправильный размер
// типы:
typedef double value_type;
typedef double* iterator;
typedef const double* iterator_const;
typedef double& reference;
typedef const double& const_reference;
typedef std::size_t size_type;
// конструкторы/присваивание/деструктор:
Array( size_type size, value_type k = 0.0 );
Array( const Array& array );
Array( iterator_const, iterator_const );
~Array(){ delete[] elems; elems = 0; } // освобождаем память
Array& operator=( const Array& );
size_type size() const { return Size; } // текущий размер массива
// доступ к элементам:
reference operator[]( size_type );
const_reference operator[]( size_type ) const;
reference front() { return elems[0]; } // первый элемент
const_reference front() const { return elems[0]; }
reference back() { return elems[size() - 1]; } // последний элемент
const_reference back() const { return elems[size() - 1]; }
void Swap( Array &other ) // обменять с другим массивом
{ std::swap( elems, other.elems ); // стандартная функция обмена
std::swap( Size, other.Size );
}
friend std::ostream& operator<< (std::ostream &t, const Array &V );
private:
size_type Size; // выделено элементов в памяти
value_type * elems; // указатель на данные
void rangecheck ( size_type i ) const
{ if ( i >= size() ) throw bad_Index(); }
};
// ----------------файл TArray.cpp
#include "TArray.h"
#include <iostream>
Array::Array( size_type size, value_type k )
{ if ( size == 0 ) throw bad_Size(); // генерация исключения
Size = size;
elems = new value_type[Size]; // создали массив
for( size_type i = 0; i < Size; ++i ) // заполняем массив
elems[i] = k; // значение по умолчанию
}
Array::Array( iterator_const begin, iterator_const end )
{ if ( begin >= end ) throw bad_Range(); // генерация исключения
Size = end - begin; // количество элементов
elems = new value_type[Size]; // создаем массив
size_type i = 0;
while( begin != end ) // заполняем массив
elems[i++] = *begin++; // копируем из массива
}
Array::Array( const Array &t )
: Size( t.Size ), elems( new value_type[Size] )
{ for( size_type i = 0; i < Size; ++i ) elems[i] = t.elems[i]; }
Array& Array::operator=( const Array &t )
{ Array temp( t ); // временнный локальный объект temp = t
Swap( temp ); // обмен полями с текущим объектом
return *this; // возврат нового текущего объекта
} // объект temp уничтожен
Array::reference Array::operator[]( size_type index )
{ if ( index < size() ) return elems[index];
else throw bad_Index(); // генерация исключения
}
Array::const_reference Array::operator[]( size_type index ) const
{ rangecheck( index ); // проверка индекса и генерация исключения
return elems[index];
}
std::ostream& operator<< ( std::ostream &t, Array const& V )
{ if( V.size() > 0 )
for( std::size_t i = 0; i < V.size(); ++i) t << V.elems[i] << ' ';
return t;
}
В реализациях типы, объявленные в typedef, пишутся без префиксов. А если тип — возвращаемый, то требуется задавать префикс класса. Как внятно сформулировать такое требование? Или это только в Visual C++. NET 2005?