std :: string 인수를 사용하여 클래스를 만드는 방법을 시도하고 있지만 예외를 throw하지 않고 NULL도 처리합니다. 여기에 코드의 예입니다 :C++에서 클래스는 생성자에서 const std :: string 및 매개 변수를 취할 수 있지만 NULL도 처리 할 수 있습니까?
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
: 직관적
class myString {
public:
myString(const std::string& str) : _str(str) {}
std::string _str;
};
int main() {
myString mystr(NULL);
printf("mystr = <%s>\n", mystr._str.c_str());
return 0;
}
,이 프로그램에서 인쇄해야한다고 생각 것 "mystr = <>"성공적으로 종료, 대신 g와 ++는이 오류를 제공합니다
이 클래스를 변경하여 logic_error 예외를 발생시키는 대신 NULL을 ""로 변환 할 수 있습니까?
(추측 할 수 있듯이 "실제"구현은이 예제보다 약간 복잡하고 _str을 사용하여 더 재미있는 일을하고 생성자에서 여러 가지 인수를 사용하여 적절하게 비공개로 유지합니다. 이 예제의 뒤에는 우리 팀의 프로그래머가 역사적인 목적으로이 문맥에서 NULL을 사용하는 경향이 있으며 컴파일러는이를 잡아 내지 못할 것입니다. 항상 ""사용하도록 재교육하는 것은 상대적으로 어렵습니다.
그 코드가 악명 높은 "가장 혹독한 구문 분석"또는 이와 관련된 시나리오를 유발합니까? 보통 main()의 첫 번째 행에서와 같이 null-arg 생성자를 명시 적으로 호출하면됩니다. 나는 그것을 스스로 컴파일하려고하지 않았다. – rmeador
편집 후에는 변경되지 않습니다. :-) –
이것은 내가 찾고 있었던 속임수이다! const char *를 처리하기 위해 두 번째 생성자를 추가했습니다. 이 예제의 두 번째 절반은 생성자에 다른 매개 변수가 있기 때문에 제 경우에는 적용되지 않습니다 (하지만 원래는 그 사실을 알려주지 않았습니다). –