И наконец, займемся реализацией операций со строками. В первую очередь, рассмотрим операции сцепления, и начнем с операции сцепления с присваиванием (листинг 4.10).
Листинг 4.10. Реализация операции сцепления с присваиванием
TString& TString::operator+=(const TString &rhs)
{ memcpy(s+size, rhs.s, 255-size): // дописываем строку
size = strlen(s); // новая длина
return *this:
}
С помощью функции memcpy () (см. приложение) мы просто «дописываем» в «хвост» текущей строки начало строки-аргумента, причем ровно столько символов, сколько имеется «свободных» нулевых байтов в текущей строке. В число переписываемых попадают и нулевые байты прицепляемой строки. Затем устанавливается новая длина текущей строки и выполняется возврат ссылки на текущий объект, чтобы операцию, как и стандартную, можно было применять многократно.
Нам достаточно иметь реализацию только с аргументом типа TString, так как преобразование параметра обеспечивают конструкторы инициализации.
С помощью этой операции и конструкторов мы легко реализуем другие операции сцепления, что можно наблюдать в листинге 4.11. Все методы append (), как и методы assi gn (), реализованы однотипно: с помощью подходящего конструктора создается локальный объект-строка, которая прицепляется к текущей строке.
Листинг 4.11. Реализация методов сцепления
TString& TString::append(const char ch, byte count)
{ TString t(ch, count): // локальная строка - проверка параметров
*this+=t; // прицепили к текущей строке
return *this;
}
TString& TString::append(const TString &S, byte ind, byte count) { TString t(S, ind, count); *this+=t; return *this; } // дружественная функция
TString operator+(const TString &lhs, const TString &rhs) { TString t = Ihs; t+=rhs; return t; }
1 Забудьте! Будем считать, что я этого не говорил. Проверять написанный код надо всегда.
Операция сцепления двух строк объявлена и реализована как дружественная, чтобы не иметь проблем с типом левого аргумента. И опять обратите внимание на то, как мы здорово упростили себе работу, использовав конструкторы и уже. реализованную операцию сцепления с присваиванием. Такие функции даже проверять не надо1 — они сразу работают. Если вам понадобился миксер то выбрать его можно тут - миксер цена.
Покажем теперь примеры реализации функций вставки, замены и удаления. Начнем с функции удаления. Метод должен обеспечивать разные варианты удаления символов: в начале, в середине и в конце строки. Последний вариант удаления удобно задавать с одним параметром-индексом, показывающим, начиная с какого символа нужно выполнять удаление. Поэтому количество можно задать по умолчанию равным -1, как в других методах. Текст метода приведен в листинге 4.12.
Листинг 4.12. Метод удаления подстроки
TString& TString::erase(byte pos, byte count)
{ TString tl(*this, 0, pos): // начало строки
if (count != static_cast<byte>(-l)) // преобразование необходимо
{ TString t2(*this, pos+count); // хвост строки
tl+=t2: // получили результат
}
¦this = tl; // присвоили текущему
return *this;
}
|