2011-04-06 116 views
1

我试图编写一个具有“序列号”概念的函数。它有一个特定的长度。我希望通过创建一个名为SerialNumber的新类型来简化构造函数,该类型包装了这个13字节数的概念。例如,我不想要一个产品(const char * m)或产品(const std :: string & str),它会截断这个值并且是违反直觉的。它更喜欢产品(const SerialNumber & sn),我可以始终指望它是正确的长度。什么是最好的方法来做到这一点?它应该是char [13]的typedef,还是有一种方法可以与字符串类一起使用?特定长度的C++字符串

回答

4

最简单的方法是创建它接受一个的std :: string构造函数,然后你的构造函数中验证长度确实是13.如果不是的话,简单地抛出一个异常 - 这就是为什么它们的存在。请记住,char [13]不能保证字符串的长度为13个字符,毕竟它可以是“hi”,后面是11个空终止符。

+0

仿佛异常感觉太“永久”,你可以用它你可以在以后关闭断言的替代品。 – 2011-04-06 20:39:49

1

我不确定您的情况,但有一个选项仍然使用std :: string,但例如Product的构造函数会在字符串长度错误时抛出。否则,最简单的方法似乎是std::string(或char[14],但我犹豫在C++代码中使用C字符串)的包装SerialNumber类。

0

我会使用typedef char [13]或围绕char [13]的包装类。由于字符表与char *相同,因此如果需要,您将很容易将其转换为std :: string。

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]; 
}; 
+0

为m_data设置'std :: string'类型会有什么问题? – Donotalo 2011-04-06 20:53:18

+0

@Donotalo,什么都没有。该任择议定书表示需要只是在13'char'值,所以我不想浪费string'的'额外的开销。 – JaredPar 2011-04-06 20:54:03