C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[729] String과 char* 문자열을 동시에 사용할 수 있는 XString 클래스.
김태선 [cppbuilder] 10022 읽음    2007-12-16 21:16
폼에 메모장 하나 올려 놓고 아래 코드 붙여넣기 해서 실행하면 됩니다.

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


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

+ -

관련 글 리스트
729 String과 char* 문자열을 동시에 사용할 수 있는 XString 클래스. 김태선 10022 2007/12/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.