Я читаю главу 12 в Ускоренный C ++ книга по внедрению string
учебный класс.
В конце главы есть вопрос для реализации c_str()
функция. Я ищу некоторые идеи.
Вот что у меня так далеко:
Моей первой попыткой было выделять кучу char *
и верни это. Но это приведет к утечке памяти:
cost char * c_star() const {
//cannot get reference to result later
//causes memory leaks
char* result = new char[data.size() + 1];
std::copy(data.begin(), data.end(), result);
result[data.size()] = '\0';
return result;
}
Вот еще одна попытка:
const char* c_str() const {
//obviously incorrect implementation as it is not NUL('\0') terminated.
return &data[0];
}
Я не могу push_back '\0'
к данным, так как он не должен изменять данные.
Здесь спекуляция:
Возвращает указатель на массив, который содержит завершенную нулем последовательность символов (то есть C-строку), представляющую текущее значение строкового объекта.
Вот книга реализации: (переименована в Str
). Внутренне символы хранятся в векторной реализации (Vec).
class Str {
public:
.
.
.
private:
Vec<char> data;
};
Основываясь на комментариях, я реализовал класс Str, чтобы быть уверенным, что в конце каждой строки есть NUL (‘\ 0’). Вместо вектора я храню данные в массиве символов:
class Str {
public:
typedef char* iterator;
typedef const char* const_iterator;
.
.
.
//c_str return a NUL terminated char array
const char* c_str() const { return str_beg; };
//c_str and data are same as implementation make sure there is NUL
//at the end
const char* data() const { return str_beg; };
.
.
.
private:
iterator str_beg;
.
.
.
};
Других решений пока нет …