2011-04-06 5 views
1

"일련 번호"개념이있는 함수를 작성하려고합니다. 그것은 특정한 길이입니다. 13 바이트 숫자의 개념을 래핑하는 SerialNumber라는 새로운 유형을 작성하여 생성자를 단순화하기를 바라고 있습니다. 예를 들어, 값을 자르고 반 직관적 일 수있는 Product (const char * m) 또는 Product (const std :: string & str)는 원하지 않습니다. 항상 올바른 길이로 믿을 수있는 Product (const SerialNumber & sn)를 선호합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 그것은 char [13]에 대한 typedef인가, 아니면 문자열 클래스로 이것을 수행 할 수있는 방법일까요?특정 길이의 C++ 문자열

답변

4

가장 쉬운 방법은 std :: string을 허용하는 생성자를 생성 한 다음 생성자 내에서 길이가 실제로 13인지 확인하는 것입니다. 그렇지 않은 경우 단순히 예외가 발생하므로 그 이유가 있습니다. char [13]는 문자열이 13 자 길이라는 것을 보증하지 않으며, 모두 "hi"가 될 수 있고 11 개의 널 종료자를 따라야합니다.

+0

같은 것을 할 것입니다. –

1

당신의 경우에는 확실하지 않지만 한 가지 옵션은 여전히 ​​std :: string을 사용하는 것입니다. 그러나 예를 들어 Product의 생성자는 문자열의 길이가 틀린 경우 throw합니다. 그렇지 않으면 가장 간단한 접근 방식은 std::string (또는 char[14]에 대한 래퍼 SerialNumber이지만 C++ 코드에서 C 문자열을 사용하는 것을 주저합니다.)

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

+0

@Donotalo, 아무 것도. OP는'char' 값의 필요성이 너무 커서'string'이라는 여분의 오버 헤드를 낭비하고 싶지 않다고 말했다. – JaredPar

관련 문제