Т.е. если ты научишься водить экскаватор вместо того, чтобы использовать лопату, то будешь деградировать? Ущербная логика.
Да, в учебных целях это полезно, но практического смысла писать свое нет.
Разве я хоть пол-слова сказал о деградации?! А насчет экскаватора... Ну вот попросила жена под окнами выкопать ямку, посадить цветы. А ты в недоумении чешешь репу, не представляя, как
сюда, под окно, втиснуть этот проклятый экскаватор! :-)
Поэтому насчет практики - в корне не согласен. Опять же, а моя родная область embedded, где половины этих примочек вообще нет, а остальные работают незнамо как? А ограниченность в ресурсах, а быстродействие? Поэтому я и говорю, что обычный клепатель из кубиков быстро сбацает приложение, которое заработает на мощном, современном компе. И на всякие тонкости ему плевать. А я разрабатываю приборы :-) Тут мощный, геймеровский комп с восьмой Виндой не применишь.
К вопросу. Оказалось, что все очень просто. Набросал такой примерчик:
class SArray
{
public:
SArray(int size) : _dummy(0) { _array = new int[size]; _array_size = size; }
~SArray() { if(_array) delete [] _array; }
int operator[](int i) const
{
if(_array == 0) return 0;
if( (i < 0) || (i >= _array_size) ) return 0;
return _array[i];
}
int& operator[](int i)
{
if(_array == 0) return _dummy;
if( (i < 0) || (i >= _array_size) ) return _dummy;
return _array[i];
}
private:
int _dummy;
int* _array;
int _array_size;
};
Работает в точности, как простой массив:
SArray a(3);
a[0] = 1;
a[1] = a[0] + 1;
a[2] = a[1] + 2;
Значения элементов массива: 1, 2 и 4.
Единственное отличие то, что в объявлении нужно применять круглые скобки, а не квадратные.
P.S. Теперь попытаюсь сделать оператор копирования (или как его назвать), чтобы копировать данные примерно так:
int dest[3];
CopyMemory(dest, a, sizeof(a));