Я пытаюсь написать строковый класс, который может выполнять большинство действий std::string. На самом деле, я застрял с моей функцией «вставить».
template <typename T>
class string_base {
public:
...
/// INSERT FUNCTION
// len = current string length of *this
// cap = current capacity of this->raw_data
// raw_data = array which holds all characters
// DEF_ALLOC = 8192
// T = type of element (char, wchar_t, char16_t, char32_t), in my case: char
// str.data() returns the char array of the "str" parameter
// str.length() returns "len" variable of "str"
string_base<T> &insert(const string_base<T> &str, unsigned pos) {
if (pos > len || !str.length()) return *this;
unsigned o = len;
if (cap <= (len += str.length())) {
cap += (str.length() + DEF_ALLOC);
raw_data = (T *)realloc(raw_data, (cap * sizeof(T)));
}
if (pos) {
for (unsigned i = o; i >= pos; i--)
raw_data[i + str.length()] = raw_data[i];
} else {
for (unsigned i = o; i > 0; i--)
raw_data[i + str.length()] = raw_data[i];
raw_data[str.length()] = raw_data[0];
}
for (unsigned i = pos; i < (pos + str.length()); i++)
raw_data[i] = str.data()[i - pos];
raw_data[len] = 0x00;
return *this;
}
private:
T *raw_data;
unsigned len, cap;
};
typedef string_base<char> string;
typedef string_base<wchar_t> wstring;
typedef string_base<char16_t> string16;
typedef string_base<char32_t> string32;
Как мы видим, функция принимает параметр как константную ссылку (насколько мне известно, функция не может изменить ее). Я вызываю функцию следующим образом:
string_base<char> a("Roses are red"); // assign "Roses are red" to a's char array
string_base<char> b("not ");
//a.insert(b, 10); -> this works correctly
a.insert(a, 10); // when I pass "a", it does shit
Я вставляю «a» в «a» в позиции 10
«a» (это массив символов) теперь должно иметь значение «Розы — это розы красного цвета».
Вместо этого оно имеет значение « Розы есть розы есть розы».
Возможно, мне нужно добавить, что сама функция работает нормально, просто у меня проблема с этой ссылкой на константу...
Я думаю, что функция "insert" также изменяет переданный параметр, но этого не должно быть.
Можно ли как-то предотвратить или исправить это?
Заранее спасибо! Надеюсь, мой вопрос достаточно ясен.
this == &str
истинно, когда вы вызываетеa.insert(a, 10)
- person Frank   schedule 05.06.2018