|
: 제가 String로 선언하여 사용하는 변수가 있었는데, 이상한 에러가
: 발생했습니다. String과 AnsiString의 차이점이 무엇인가요? 아시는 분이
: 계시면 저에게 도움을 주시기 바랍니다. 그리고 제가 AnsiString라고
: 선언하여 사용해 보기도 했는데, 그것도 여의치가 않습니다.(제가 넘
: 기본이 안 돼있는건지도...?)
: 에러 메시지는
: [C++ Error] Unit2.cpp(76): E2031 Cannot cast from 'AnsiString' to
: 'char*' 라고 나타납니다.
: 아마 String이 내부적으로는 char*형으로 처리를 하는가 봅니다.
: 만약 String와 비슷하게 AnsiString를 쓸 수 있다면 그 길이를 구하는
: 메소드도 가르쳐 주십시요.
: String형에서는 변수명->Length() 하면 그 스트링의 길이를 얻을수가
: 있었는데, AnsiString으로 하며는 여기에서 에러가 발생합니다.
: 도와 주시기 바랍니다.
: 감사합니다.
임펠리테리입니다.
빌더는 C++ 컴파일러라는 것을 잊지 마시기 바랍니다. C++은 그 조상이랄 수 있는 C에서부터,
기본 스트링은 널로 끝나는 문자 배열입니다. 이것은 엄연히 빌더에서 지원하는 안시스트링과는
다릅니다. 빌더의 안시스트링은, 스트링 조작을 쉽게 하고 델파이의 스트링과 호환되게 하기 위해
새로이 추가한 클래스입니다.
이 안시스트링 클래스는, 내부적으로 데이터로서 표준 C++ 스타일의 널로 끝나는 문자열을 가지고 있습니다.
그러므로 내부에 가지고 있는 문자열의 포인터를 리턴하는 멤버 함수가 있는데, 바로 c_str()입니다.
만약,
AnsiString MyString = "저는 스트링입니다.";
라고 했다면, 표준 C++ 스타일 문자열 포인터가 필요하다면,
MyString.c_str() 이라고 하면 됩니다.
위의 MyString 선언에서 많은 것을 생각해볼 수 있습니다. " 로 둘러싸여진 문자열은 분명히 C++ 표준
문자열 포인터입니다. 그런데, 이것을 안시스트링인 MyString에 집어넣은 것이 적법합니다. 여기서는
아무런 에러도 나지 않죠. 그 이유는, 안시스트링은 오버로드된 여러가지 생성자중 문자열 포인터를
인자로 받는 생성자가 있기 때문입니다. 이 생성자의 내부코드를 보면, 받은 문자열 포인터를
내부 데이터로 가지는 문자열에 복사해넣는 코드를 볼 수 있습니다.
또 한가지 의문이 있을 수 있습니다. 위에서는 생성자가 사용되지 않은, 단순한 할당문일 뿐인데
왜 제가 생성자를 언급할까요? 기본적으로는, C++ 문자열 포인터와 안시스트링은 서로 호환이 안되는
타입이므로, 사실상 캐스팅 관련 메커니즘이 적용됩니다. C++을 제대로 공부하셨다면, 클래스인 타입에
있어서는, 캐스팅은 생성자를 호출하는 것이란 것을 기억하실 겁니다.
에러가 발생하는 이유은 위에서 말씀드렸지요? 안시스트링에서 문자열 포인터를 얻어내려면 멤버함수인
c_str()을 사용해야 합니다.
마지막으로 사족. 빌더에서 String 과 AnsiString은 동일합니다. 정확히 어느 헤더파일인지 모르겠는데,
빌더의 표준 헤더중 하나에 보면 다음과 같은 라인이 있습니다.
typdef AnsiString String;
무슨 말인지 아시죠? AnsiString이란 기존의 타입으로 그것과 동일한 String이란 새 타입 이름을 만든겁니다.
그 이상도, 이하도 아닙니다. 그냥, String은 AnsiString입니다.
Length() 함수를 사용했는데 에러가 났다는 말은 잘못 아신 것 같습니다. 다시 확인해보시죠.
한가지 추가적으로, 간단하지만 중요한 팁 하나 드리죠. 안시스트링의 c_str()함수에서 리턴된 포인터는,
물론 포인터이므로 거기다 어떤 값을 써넣을 수도 있습니다만, 이것은 어디까지나 컴파일러가 봤을때
"음.. 불법은 아니군." 하는 것이지, 실제로는 런타임에러가 납니다. 이것은 당연한데, c_str() 함수가
리턴한 포인터는 안시스트링 클래스가 내부적으로 처리하는 포인터의 값만을 넘겨준 것이기 때문입니다.
그러므로 이 포인터에는 어떤 값도 직접 write해서는 안된다는 것을 유의해야 합니다. 다시 말해서,
컴파일 에러가 나지 않을 뿐이지, c_str()로 리턴된 포인터는 리드온리(read-only)라고 생각해야 합니다.
그럼 참고하시길...
|