![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
좋은 내용 올려주셨네요~ 보충 하나 합니다.
String sStr1, sStr2; char buf[4096]; sprintf(buf, "%s %s", sStr1.c_str(), sStr2.c_str()); sprintf(buf, "%s %s", sStr1, sStr2); 는 서로 다른 결과를 갖습니다. 원칙적으로 AnsiString 인스턴스 자체를 char *에는 대입할수가 없습니다. printf가 가변인자를 받기 때문에 형 검사가 없으므로 사실 억지로 되는거죠.. AnsiString의 멤버가 char * 한개 (sizeof(AnsiString) == 4)이기 때문에 우연히 가능하다고 보는게 좋은것 같습니다. C언어의 하위레벨 관점에서 보면 사용해도 되지만, 언어론 측면에서 보면 c_str()를 이용하는것이 맞습니다. C언어론 측면에서 c_str()을 써야 한다는 것에는 당연히 동의합니다만 서로 다른 결과가 나온다는건 틀린 내용이네요. 실제 해 보시면 동일한 결과가 나옵니다. 그리고 동일한 결과가 나올 수 밖에 없죠. 이유는 마술감자님이 지적하신 것 대로 printf등은 형검사가 없고 오로지 format 문자열에 지정된 타입을 참조하기 때문입니다.
저렇게 쓰는것이 좋다... 가 아니라 저렇게 써도 아무 이상없이 된다... 이겁니다. ^^ 선택은 C++라는 언어의 특성이 그렇듯... 개발자의 선택의 몫이죠. 그리고 저는 볼랜드가 이런 점을 이미 고려하고 있었다는 느낌을 많이 받습니다. 우연의 일치로 보이지 않네요. AnsiString이 RefCount를 이용한 이상 char* 캐스팅 오퍼레이터를 지원하는 것은 무척 위험한 발상이었고... 이런 문제들을 두루 고려한 설계라는 느낌을 많이 받게 됩니다. 이미 한 번씩 언급 되었지만, 상기 논의의 위험성을 알리고자 부언합니다.
'동작하기 때문에 써도 된다'는 생각은 위험한 것입니다. 1. AnsiString에 char* 타입으로 형 변환 할 수 있는 오퍼레이터가 제공되지 않고, 2. char *를 반환하는 c_str()이라는 맴버가 존재한다 는 것은 char *이 필요할 때 꼭 c_str()을 쓰라는 의미지요. String sStr; char buf[512]; sprintf(buf, "%s", sStr); 마술감자님의 지적과 같이, 이 코드는 1. 가변 인자는 형 검사를 받지 않고 2. 이 class의 '첫 번째' 맴버가 '우연히' char *이기 때문에 작동하는 것입니다. class 제작자가 의도적으로 그리 한 것이 아닙니다. OOP의 큰 관심사 중 하나는 '은닉'인데, 이렇게 되면 memeber에 (그것도 직접 접근하지 말라고 private으로 지정한 member에) '직접' 접근하는 꼴이 됩니다. class를 만드는 사람이 그렇게 쓰도록 설계할 리가 없지요. '아무렴 어때'라고 생각할 수도 있겠지만, 결정적인 문제는 훗날 AnsiString의 구현이 '약간'이라도 변경되는 경우겠지요. '인터페이스'는 놔두고 '구현'만 고칠 수 있는 것이 class니까요. char * 맴버 앞에 '아무 것이나' 하나만 추가 되어도 재앙이 일어날 것입니다. sprintf(buf, "%s", sStr); 이렇게 써도 우연히 작동하지만, sprintf(buf, "%s", sStr.c_str());로 쓰자고 하는 것이 맞을 듯 싶네요. 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |
관심없는한 이런거 해보려고 생각하는 사람 별로 없을듯 합니다. ;;
특히 학생이 아니라 직업으로 개발을 하게되면 더더욱 -ㅋ-; 타성과의 싸움이;;
가끔(자주!) 올려주세요... 일에 치여도 이런글 읽으면 기분이 좋아지기도 합니다. ㅎㅎ
행복한 사람이 되는 방법중 하나가 때때로 이법에 대한 가르침을 듣는것 ... ... ... .