출처 : 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* 문자열 등
마음에 드는 것 골라 골라 쓸수도 있습니다.


그리 중요한 것 같지 않은데 ㅡ,.ㅡ;;;
심심해서 만들어본 클래스입니다.
휘리릭~~~~

+ Recent posts