[읽기 전에...]

번역된 글에 경어와 비경어가 섞여 있을 있사오나 그것은 독자를 무시한 행동이 아니며 역자의 글쓰는 능력이 부족함을 한탄해야 것입니다. 허저분한 번역이 보기 싫으시면 바로 출처를 클릭하시기를 바랍니다. 역자의 글이 좋지않아 원문을 보지 않는 범하지 않도록 합시다

 

 

CStdString - 표준 C++ 사용한 CString-clone

 

 

출처 : https://www.codeproject.com/Articles/1146/CString-clone-Using-Standard-C

2001 5 29 초안

2004 8 5 갱신

2012 2 27 갱신

필자 : Joe O'Leary

역자 : j2doll

 

 

'표준 C++ 라이브러리의 basic_string 템플릿에 기반한 CString 대체물'

 

소개

 

 저(필자) 표준 C++ 라이브러리를 애용해 오면서도, basic_string<> 템플릿 만큼은 좋아하질 않습니다. 때때로 디자이너들의 한물간 방식들이 사용하기 어렵게 만드는 같습니다.

 반면, 필자는 MFC CString 클래스를 사용하기를 즐기는 편이었습니다. CString NULL 포인터를 체크해 주고, 암시적으로 const TCHAR* 변환시켜 주며, 문자열 프로그램을 사용하기에 손쉬운 멤버 함수들을 제공해 줍니다. ( Format(), Load() 등등 )

 하지만 물론, 필자는 이상 MFC 사용하지는 않습니다. 사실, 플랫폼 이식을 위해서 어떠한 독점적인 라이브러리도 사용하기를 원하지 않기 때문입니다.

 그래서 저는 양쪽 세계의 장점만을 모으기로 결심했습니다.

 그것이 클래스(사실은 템플릿) basic_string<TCHAR> 에서 상속받은 클래스 CStdString 입니다.

 그것은 basic_string CString 전체 API 더한 것입니다. 거기에 CString 사용 용이성에 basic_string 호환성을 보장받게 것입니다.

 간단히 말해서, CStdString 객체는 다음에 이야기할 몇몇 예외 사항을 제외하고는 basic_string 입니다. 그리고 CString 대체할 수도 있는 대체물이기도 합니다.

 그것들은 basic_string CString 양쪽 API 에서 가장 알려지고 많이 문서화된 부분들입니다.

 저는 글을 , 다른 코드 싸이트에도 올렸었습니다.

 하지만 필자가 CodeProject 좋아하기에 여기에도 또한 글을 올려봅니다. (이글의 원문은 codeproject 있습니다.)

 필자는 클래스를 지난 4년간 상업적인 프로젝트들에도 사용해 왔었습니다.

 그 결과, 클래스는 필자가 동안 만들어 중에 가장 유용한 것으로 증명되었습니다.

 하지만 물론 다방면으로 디버깅되어야 것입니다. 필자는 독자 분들도 점을 좋아하시기를 바랍니다. 어떤 문제 점이 있다면 이메일을 보내주시기를 바란다. (필자에게) 도움을 주시면 고맙겠습니다.

 CString 함수들의 작동을 나타낸 간단한 어플리케이션 소스를 제공하였습니다. (하지만 정말 대용품입니다.)

 예제 프로젝트의 목록들은 CString (또는) basic_string 템플릿을 사용합니다.

 

특징

 

  • 일단 CString 대체물로써 잠깐 생각하십시오. (아래 예외 사항도 보시기 바랍니다.)
  • 개의 항상 사용 가능한 사례 --- wchar_t 기반한 버전 CStdStringW char 기반 버전 CStdStringA. CStdString 단지 개중 typedef 것들의 하나입니다.
  • CString 처럼 모든 함수에서 문자열 NULL 체크의 안정성.
  • 특정 생성자와 할당 연산자는 자동으로 wchar_t 기반한 문자열과 char 기반한 문자열 간에 변환을 줍니다.
  • c_str() 으로의 암시적 변환 기능. (C++ 위원회에서는 이런 방식을 권장하지않습니다.)
  • Windows, UNIX, LINUX 포함한 몇몇 플랫폼에서의 빌딩되었다. Dinkumware, GNU, CodeWarrior, STLPort 포함해서 표준 C++ 라이브러리에서 구현 작동합니다.
  • Win32 Building DCOM IStream 사용하는 CStdString 객체의 멤버 함수로써, UNICODE/MBCS 변환 매크로 추가 기능(MFC처럼) 것립니다.
  • 기반 클래스 템플릿인 basic_string 어떠한 세부 구현도 필요가 없습니다.
  • 상속받은 템플릿은 basic_string 어떠한 멤버 변수와 가상 함수도 더하지 않습니다.

 그리고 코드에서 지적할 가지 주목할 (CString 과의 호환성과 basic_string 에서의 상속) 있습니다.

 

CString 호환성

 

 필자는 완전하게 똑같이 CString API 같이 재구현할 수는 없었습니다.

 그래서 (공유할 있지만 다르게 구현된) CString basic_string 위한 가지 함수들로 되게 하였습니다.

 이러한 경우에 CString 처럼 이라기보다는 basic_string 처럼 행동하는 CStdString 만드는 것이 최선이라고 느꼈습니다. (정확하게는…)

  • CStdString::operator[] (CString by-reference 와는 다르게) by-value 문자들을 반환합니다.
  • 생성자는 (CString 선언하는 것의 반대 순서로) 순서별로 문자를 가지고 숫자를 셉니다. 그것은 basic_string<> 정렬 방식입니다. 그리고 양쪽 버전 모두의 구현은 불가능할 것입니다.

 또한, CString 에서 구현하지 못한 개의 함수들이 있습니다. ( LockBuffer() UnlockBuffer() )

 

basic_string<> 의로부터의 상속

 

 필자가 작성한 basic_string 로부터 상속받은 템플릿은 가상 소멸자(virtual destructor) 없는 클래스 템플릿입니다.

 어떤 C++ 관한 소개글들에서는 가상 파괴자가 없는 클래스는 위험하다고 말한적이 있습니다.

 때로는 정의되지 않은 것처럼 정의되지 않은 것처럼 해야 수도 있습니다.

 다음같이 기반 클래스의 포인터를 통해 CStdStringA 삭제하는 것처럼 코딩할려면, 기술적으로 정의되지 않은 행동을 해야 합니다.

// 베이스 포인터에 상속 받은 객체를 할당

std::string* pstr = new CStdStringA( "Hi" ) ;

 

// 베이스 포인터를 통해 파생 삭제 à 정의되지 않음

delete pstr;

 

 하지만 (개인적으로) 많이 주목할 점이라고 생각하지는 않습니다.

 아마도 문제는 정말 얼마나 자주 문자열 객체를 이처럼 것인가 하는냐는 점입니다.

 필자는 동안 거의 동적으로 문자열 객체를 힙에 할당하는 일은 없었던 같습니다.

 그리고 베이스 클래스 포인터를 사용하지 않을 것입니다.

 이같은 사용하지 않는다면 크게 걱정할 일은 없을 것입니다.

 사실 이러한 방식으로 코딩한다면 CStdString 사용하는 것에 문제점이 있다고 의심해 만합니다.

 적어도 Microsoft Visual C++ 에서 이야기 하자면 에러와 메모리 누수가 없다고 이야기 있습니.

 아마 많은 다른 컴파일러들이 문제를 준다는 것에도 의심해 보야야 것입니다.

 하지만 필자의 의심은 C++ 세계의 현실성에 이용하지는 않을 것입니다.

 

역돌이 外書

: MFC 사용하여도 다음같이 문자열을 관리하는 일은 드물 것입니다.

CString *pStr = new CString () ;

(물론 C++ 모르시고 Java 아시다면 이게 뭐가 문제야 하시겠지만…--;)

역자도

CString strBuffer = _T( "Buffer" ) ;

_tcscpy( szBuffer, strBuffer );

같은 방식보다는,

_tcscpy( szBuffer, strBuffer.GetBuffer(strBuffer.GetLength()) );

정상적인 관리라고 생각하며, 필자의 의견에 동의해 봅니.

 이 글은 Verdana 글꼴에 최적화되어 있습니다. 2004 여름과 가을 사이, 짜증나는 날씨의 어느 . By j2doll… KIN~


2011 12 7일에 source code update 되었습니다.

 

StdString_demo.zip

StdString_src.zip


+ Recent posts