2011-04-06 159 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