C ++ строка определенной длины - PullRequest
1 голос
/ 07 апреля 2011

Я пытаюсь написать функцию, которая имеет понятие "серийный номер".У него есть конкретная длина.Я надеюсь упростить конструкторы, создав новый тип с именем SerialNumber, который оборачивает эту концепцию 13-байтовым числом.Например, мне не нужен продукт (const char * m) или продукт (const std :: string & str), который будет усекать значение и быть нелогичным.Он предпочел бы Product (const SerialNumber & sn), на который я всегда могу рассчитывать как на правильную длину.Какой лучший способ сделать это?Должно ли это быть typedef для char [13] или есть способ сделать это с помощью строкового класса?

Ответы [ 4 ]

4 голосов
/ 07 апреля 2011

Самый простой способ - создать конструктор, который принимает std :: string, а затем в вашем конструкторе убедиться, что длина действительно равна 13. Если это не так, просто сгенерируйте исключение - вот почему они существуют.Имейте в виду, что char [13] не гарантирует, что длина строки составляет 13 символов, в конце концов это может быть "hi", за которым следует 11 нулевых терминаторов.

1 голос
/ 07 апреля 2011

Я не уверен в вашем случае, но один вариант по-прежнему использовать std :: string, но, например, конструктор Product сгенерирует, если строка будет неправильной длины. В противном случае простейшим подходом является класс SerialNumber для std::string (или char[14], но я не решаюсь использовать C-строки в коде C ++).

0 голосов
/ 07 апреля 2011

Я бы сделал что-то вроде следующего

struct SerialNumber {
    static bool TryCreate(const std::string& data, std::auto_ptr<SerialNumber>& ptr) {
        if (data.length() != 13) {
            ptr.reset();
            return false;
        } else {
            ptr.reset(new SerialNumber(data.c_str()));
            return true;
        }
    }

private:
    SerialNumber(const char* data) {
        memcpy(m_data, data, sizeof(data));
    }

    char m_data[13];
};
0 голосов
/ 07 апреля 2011

Я бы использовал typedef char [13] или класс обтекания вокруг char [13].Поскольку таблица символов совпадает с таблицей char *, вы легко сможете преобразовать ее в std :: string, если это необходимо.

...