출처 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=729
폼에 메모장 하나 올려 놓고 아래 코드 붙여넣기 해서 실행하면 됩니다.
//---------------------------------------------------------------------------
// Cross String wrapper class : XString
//
// C++빌더의 훌륭한 스트링 클래스 String은 char* 가 요구되는 곳에
// stirng.c_str() 와 같이 c_str() 메소드를 사용해야 합니다.
// 조금 귀잖습니다.
// 그래서 String 과 같으면서 c_str() 메소드를 사용할 필요가 없이
// 자동으로 형변환이 되어 들어가는 스트링 클래스를 만들어 봤습니다.
// String 과 char* 의 장점을 동시에 쓸수 있게 하는 것입니다.
// 원래 String 클래스를 상속받아 여기에 기능을 수정하면 간단한데,
// String 클래스는 상속이 안됩니다. 그래서 간단한 레퍼 클래스인
// 크로스스트링 클래스를 만들었는데, 기본 문자열 스트링과 거의 사용법이 같습니다.
// 래퍼클래스로 약간의 사용법상 차이 외는 모든 것이 같습니다.
//
// Written by 김태성 (jsdkts@korea.com)
class XString
{
private:
String str;
public:
XString()
{
}
XString(char* s)
{
str = s;
}
XString(String& s)
{
str = s;
}
// String 이 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
operator String()
{
return str;
}
// char* 가 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
operator char*()
{
return str.c_str();
}
// 스트링 클래스 메소드를 직접 사용할때.
String* operator ->()
{
return &str;
}
// 이것은 형을 String형으로 명확하게 하는 * 연산자.
String& operator *()
{
return str;
}
};
//---------------------------------------------------------------------------
// String을 ~ 연산자를 통해 char* 를 바로 얻는 기법으로 c_str() 메소드를 안쓰게 해줍니다.
inline char* __fastcall operator ~(const AnsiString& s)
{
return s.c_str();
}
//---------------------------------------------------------------------------
// test
void __fastcall TForm1::FormCreate(TObject *Sender)
{
XString s = "이것은 문자열테스트입니다.";
char buf[100];
strcpy(buf, s);
Memo1->Lines->Add( s );
Memo1->Lines->Add( buf );
// 이렇게 메소드를 사용할 수 있습니다.
s->printf("[ %s ]", buf);
Memo1->Lines->Add( s );
// 대입을 받는 측은 자동형 설정이 안되므로 * 연산자로 강제로 형을 지정해야 한다.
*s = s + " 하하하. " + " 호호호.";
Memo1->Lines->Add( s );
// 이런식으로도 메소드를 사용할 수 있습니다.
(*s).printf("다음줄입니다. %d ", 100);
Memo1->Lines->Add( s );
// String과 XString과 상호치환도 그냥 됩니다.
String ss = "HoHo 또 다른 면입니다.";
s = ss;
Memo1->Lines->Add( s );
// 이렇게 String 처럼 사용하는데 지장이 없습니다.
ss = "흐흐... " + s + " 후후";
Memo1->Lines->Add( ss );
strcpy(s + 5, "나나나나나");
Memo1->Lines->Add( s );
// 첨자는 0부터라는 점에 String이 1부터라는 것과 다릅니다.
// 이는 순수 char* 문자열과 같다고 보시면 됩니다.
s[0] = 'A'; // == (*s)[1] = 'A'; <- String식으로 하려면
s[2] = 'B';
Memo1->Lines->Add( s );
char ch = s[1];
Memo1->Lines->Add( ch );
}
//---------------------------------------------------------------------------
이전 저의 ~ 오퍼레이터를 사용하는 String의 char* 변환 기법을 쓰거나
이번에 소개한 XString을 문자열을 보다 간편하게 제어하기 위해 사용할 수 있습니다.
String, XString, ~ 연산자, char* 문자열 등
마음에 드는 것 골라 골라 쓸수도 있습니다.
그리 중요한 것 같지 않은데 ㅡ,.ㅡ;;;
심심해서 만들어본 클래스입니다.
휘리릭~~~~
폼에 메모장 하나 올려 놓고 아래 코드 붙여넣기 해서 실행하면 됩니다.
//---------------------------------------------------------------------------
// Cross String wrapper class : XString
//
// C++빌더의 훌륭한 스트링 클래스 String은 char* 가 요구되는 곳에
// stirng.c_str() 와 같이 c_str() 메소드를 사용해야 합니다.
// 조금 귀잖습니다.
// 그래서 String 과 같으면서 c_str() 메소드를 사용할 필요가 없이
// 자동으로 형변환이 되어 들어가는 스트링 클래스를 만들어 봤습니다.
// String 과 char* 의 장점을 동시에 쓸수 있게 하는 것입니다.
// 원래 String 클래스를 상속받아 여기에 기능을 수정하면 간단한데,
// String 클래스는 상속이 안됩니다. 그래서 간단한 레퍼 클래스인
// 크로스스트링 클래스를 만들었는데, 기본 문자열 스트링과 거의 사용법이 같습니다.
// 래퍼클래스로 약간의 사용법상 차이 외는 모든 것이 같습니다.
//
// Written by 김태성 (jsdkts@korea.com)
class XString
{
private:
String str;
public:
XString()
{
}
XString(char* s)
{
str = s;
}
XString(String& s)
{
str = s;
}
// String 이 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
operator String()
{
return str;
}
// char* 가 쓰이는 곳에 바로 강제 형변환없이 사용하게 한다.
operator char*()
{
return str.c_str();
}
// 스트링 클래스 메소드를 직접 사용할때.
String* operator ->()
{
return &str;
}
// 이것은 형을 String형으로 명확하게 하는 * 연산자.
String& operator *()
{
return str;
}
};
//---------------------------------------------------------------------------
// String을 ~ 연산자를 통해 char* 를 바로 얻는 기법으로 c_str() 메소드를 안쓰게 해줍니다.
inline char* __fastcall operator ~(const AnsiString& s)
{
return s.c_str();
}
//---------------------------------------------------------------------------
// test
void __fastcall TForm1::FormCreate(TObject *Sender)
{
XString s = "이것은 문자열테스트입니다.";
char buf[100];
strcpy(buf, s);
Memo1->Lines->Add( s );
Memo1->Lines->Add( buf );
// 이렇게 메소드를 사용할 수 있습니다.
s->printf("[ %s ]", buf);
Memo1->Lines->Add( s );
// 대입을 받는 측은 자동형 설정이 안되므로 * 연산자로 강제로 형을 지정해야 한다.
*s = s + " 하하하. " + " 호호호.";
Memo1->Lines->Add( s );
// 이런식으로도 메소드를 사용할 수 있습니다.
(*s).printf("다음줄입니다. %d ", 100);
Memo1->Lines->Add( s );
// String과 XString과 상호치환도 그냥 됩니다.
String ss = "HoHo 또 다른 면입니다.";
s = ss;
Memo1->Lines->Add( s );
// 이렇게 String 처럼 사용하는데 지장이 없습니다.
ss = "흐흐... " + s + " 후후";
Memo1->Lines->Add( ss );
strcpy(s + 5, "나나나나나");
Memo1->Lines->Add( s );
// 첨자는 0부터라는 점에 String이 1부터라는 것과 다릅니다.
// 이는 순수 char* 문자열과 같다고 보시면 됩니다.
s[0] = 'A'; // == (*s)[1] = 'A'; <- String식으로 하려면
s[2] = 'B';
Memo1->Lines->Add( s );
char ch = s[1];
Memo1->Lines->Add( ch );
}
//---------------------------------------------------------------------------
이전 저의 ~ 오퍼레이터를 사용하는 String의 char* 변환 기법을 쓰거나
이번에 소개한 XString을 문자열을 보다 간편하게 제어하기 위해 사용할 수 있습니다.
String, XString, ~ 연산자, char* 문자열 등
마음에 드는 것 골라 골라 쓸수도 있습니다.
그리 중요한 것 같지 않은데 ㅡ,.ㅡ;;;
심심해서 만들어본 클래스입니다.
휘리릭~~~~
'1.소프트웨어 이야기 > 09.ETC' 카테고리의 다른 글
Windows XP update 관련오류(KB898461) (0) | 2008.01.29 |
---|---|
[펌]응용 프로그램을 위한 최상의 사용자 환경을 만드는 방법 (0) | 2007.12.26 |
XP의 숨겨진 60가지 기능 (0) | 2007.12.19 |