我正在尝试编写一个具有“序列号”概念的函数。它有一个特定的长度。我希望通过创建一个名为SerialNumber的新类型来简化构造函数,该类型包含这个13字节数字的概念。例如,我不希望产品(const char * m)或Product(const std :: string& str)截断该值并且是反直觉的。它更喜欢Product(const SerialNumber& sn),我总是可以指望它是正确的长度。最好的方法是什么?它应该是char [13]的typedef还是有一种方法可以用字符串类来完成?
答案 0 :(得分:4)
最简单的方法是创建一个接受std :: string的构造函数,然后在构造函数中验证长度确实为13.如果不是,只需抛出异常 - 这就是它们存在的原因。请记住,char [13]不能保证字符串长度为13个字符,毕竟它可以是“hi”,然后是11个空终止符。
答案 1 :(得分:1)
我不确定你的情况,但是一个选择仍然是使用std :: string但是例如Product
的构造函数会在字符串长度错误时抛出。否则,最简单的方法似乎是SerialNumber
(或std::string
的包装char[14]
类,但我对在C ++代码中使用C字符串犹豫不决。
答案 2 :(得分:0)
我会使用typedef char [13]或围绕char [13]的包装类。由于chars表与char *相同,如果需要,您可以轻松地将其转换为std :: string。
答案 3 :(得分:0)
我会做类似以下的事情
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];
};