Строка класса C ++ - PullRequest
       1

Строка класса C ++

1 голос
/ 14 сентября 2011

Предположим, я хочу написать свой собственный класс строки.Строка имеет свойство char * s, которое является указателем, указывающим на символ.

Теперь в конструкторе, String::String(), что бы вы передали, чтобы предположить еще один char * к этому?Вы не можете сделать что-то вроде приведенного ниже кода, так как оба указателя будут указывать на одно и то же (а мы этого не хотим):

String::String(const char *str) {
        s = str;
}

Любая помощь приветствуется!

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Вам необходимо глубокое копирование строки, т. Е. Создать символьный буфер, достаточно длинный для включения содержимого str, а затем скопировать содержимое в него. Самый простой способ добиться этого - использовать strdup strcpy, поскольку первый нестандартный:

s = new char[strlen (str) + 1];
if (s == NULL) throw some_exception;
strcpy (s, str);
2 голосов
/ 14 сентября 2011

Пожалуйста, не пишите свой собственный класс строки.Существует огромное количество деталей, которые вы должны знать, чтобы не допустить ошибок (например, перегруженные операторы, логические идиомы и т. Д.), И много других деталей, чтобы сделать этот класс строк эффективным (например, реализовать копирование при записи)и т.д. Но только для образовательных целей, вы должны сделать копию пропущенной строки.Вот пример:

#include <cstdint>
#include <cstring>
#include <cstdio>

class String
{
    char *p_;

public:
    explicit String (const char *str)
    {
        auto length = std::strlen (str) + 1;
        p_ = new char [length];
        std::memcpy (p_, str, length);
    }

    ~String ()
    {
        delete [] p_;
        p_ = nullptr;
    }

    inline const char *c_str () const
    {
        return p_;
    }
};

int
main ()
{
    String s ("Hello, world!");
    std::printf ("%s\n", s.c_str ());
}
1 голос
/ 14 сентября 2011

Вы должны скопировать содержимое строки с нулевым символом в конце, которая передается как параметр.

Во-первых, вы можете удалить завершающий ноль, потому что если у вас есть свой собственный класс, вы можете управлять границами строк вручную, сохраняя текущую длину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...