Реализация c_str для класса String

Я читаю главу 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;
};

0

Решение

Основываясь на комментариях, я реализовал класс 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;
.
.
.
};
1

Другие решения

Других решений пока нет …