(обращение к Лестеру)
Так, посмотрел я массив. Я конечно не гуру Срр, но осмелюсь высказаться ))
Ну сразу - объявление всего класса как макроса конечно интересно...
дебажить невозможно, да и пользоваться неудобно (я чуть-чуть попробовал )) ).
Нужно где-то тулить DECLARE_ARRAY, потом DEFINE_ARRAY, а потом и саму переменную объявить.
Почему бы просто не написать шаблонный класс сразу? (собственно как vector<>).
Тогда пишем CustomArray<MyType> A; и готово. Может я не усмотрел где-то глубинный смысл задумки, но добавлять макросы в проект для каждого нового типа - реально неудобно.
Ладно.., дальше:
Код:
T& operator[]( size_t index );
T operator[]( size_t index ) const;
Почему второй метод (константный) возвращает это, а не
const T& ?
Ведь с константной ссылкой мы ничего не поменяем в классе name и в T - и это не нарушит иммутабельность. Вот этот момент хотелось бы подробней знать.
Потом еще момент, есть конструктор который принимает указатель и кол-во элементов и создает массив.
Так вот ИМХО не помешало бы и такой метод иметь.
Например я создал массив (твой), поработал с ним, удалил все с него,
а потом хочу туда засунуть уже готовый массив (типа int a[64]) -
прийдется уже по одному делать Add(). То есть, можно добавить метод типа:
Код:
void FillFrom(size_t count, T* value );
ну это не критично конечно.
И последнее, метод Export, строка:
Код:
for( size_t i = 0 ; i < count ; ++i )
res[ i ] = (T) ( mVector[ i ] );
Опять таки, почему (Т) ?
Ведь даже оператор присваивания принимает const name
&, а так выходит что создается временный объект - он попадает в оператор присваивания, а потом удаляется.
И тут же момент, обычно Срр-шники юзают new/delete, а тут память выделяется через malloc, если этого не знать а потом вызвать
указателю delete [] - сам знаешь что будет. Но хотя если там написать
res = new T[count] - повызываются лишний раз конструкторы, тоже не хорошо.
ps. это я смотрел там на первый класс name (а то там внизу еще один есть, дома погляжу...)