2014-01-29 4 views
7

헤더의 C++ 11 새로운 기능이 string 클래스의 멤버 함수가 아닌 이유는 무엇입니까? (stod, stof, stoull)C++ 11 문자열의 새 함수 (stod, stof)가 문자열 클래스의 멤버 함수가 아닌 이유는 무엇입니까?

stod(mystring,...) 대신 mystring.stod(...)을 쓰려면 더 이상 C++을 준수하지 않습니까?

+8

꼭 필요한 것은 아니며'std :: string'에는 이미 너무 많은 멤버 함수가 있습니다. [Monoliths "unstrung"GOTW] (http://www.gotw.ca/gotw/084.htm)를 참조하십시오. – juanchopanza

+2

'stod'가 단지'std :: string' 대신'Sequence' 객체를 취할 수있는 템플릿이라면 좋았을 것입니다 – Siler

+1

std :: string은 이미 [클래스의 단일체]입니다 (http : // www .gotw.ca/gotw/084.htm), 더 많은 멤버 함수가 필요하지 않습니다. –

답변

22

많은 사람들에게 놀랍지 만 C++은 이 아니고은 Java 또는 C#과 달리 객체 지향 언어입니다.

C++은 다중 패러다임 언어이므로 가능할 때마다 최상의 도구를 사용하려고합니다. 이 경우 자유 기능이 적합한 도구입니다.

지침 : 멤버 함수에 비 멤버 비 친구 기능 선호 (효율적인 C에서 ++, 아이템 23)

이유 : 멤버 함수 또는 친구 함수 클래스 내부 반면에 액세스 할 비회원이 아닌 친구 기능은 그렇지 않습니다. 따라서 비회원이 아닌 친구 기능을 사용하면 은 캡슐화가 증가합니다.

예외 : : 구성원 함수 또는 friend 함수가 성능과 같은 중요한 이점을 제공하는 경우 추가 결합에도 불구하고 고려해 볼 가치가 있습니다. 예를 들어 std::find이 실제로 잘 작동하더라도 std::set과 같은 연관 컨테이너는 O (N) 대신 O (로그 N)에서 작동하는 std::set::find이라는 멤버 함수를 제공합니다.

+1

+1 예외 부품 – Guillaume07

+3

해당 지침을 조금 더 빨리 적용하면 'std :: basic_string' ... – pmr

+0

@pmr : 예,'std :: basic_string'와 모든 IO 스트림은 이미 존재하는 표준화 인 공룡이다. 사실,'string'의 원래 버전은 인덱스의 관점에서 완전히 정의되었고, 표준화 과정에서 모든 반복자 오버로드가 추가되어 일련의 순서를 만들었지 만 이전 방법은 호환성을 위해 유지되었습니다. –

1

실제로 이들은 몇 가지 유틸리티 함수이며 기본 클래스 내부에있을 필요는 없습니다. atoi, atof와 같은 유사한 유틸리티 함수가 stdlib.h 내부에 정의되어 있지만 (char *의 경우) stdlib.h 내부에 정의되어 있으며 독립 함수이기도합니다.

3

근본적인 이유는 그들이 거기에 속하지 않는다는 것입니다. 그들은 문자열과 관련이 없습니다. 그만하고 생각하면 에 대해 생각하십시오. 사용자 정의 형식은 기본 제공 형식과 동일한 규칙을 따라야하므로 새 사용자 형식을 정의 할 때마다 std::string에 함수를 추가해야합니다. 이 실제로 C++로 가능한 것 : std::string는 일반적인 구현하지 않고 멤버 함수 템플릿 to을 가지고 있다면, 당신은 각 유형에 대한 전문성을 추가하고 str.to<double>() 또는 str.to<MyType>()를 호출 할 수 있습니다. 하지만이 은 정말로 당신이 원하는 무엇입니까. 그것은 나에게 깨끗한 해결책처럼 보이지 않는다. 전문을 std::string에 추가해야하는 새로운 클래스를 작성하는 사람들이있다. 이런 종류의 것들을 문자열 클래스에 넣어두면, OO가 성취하려고 시도하는 것의 실제로는 반대가됩니다.

당신이 순수 OO 주장했다, 그들은 double의 회원, int 등 (A 생성자는, 정말.이 예를 들어, 파이썬은 무엇이고해야한다면 .) C++은 순수 등을 주장하지 않으며 기본 유형 (예 : doubleint ~ )에 멤버 또는 특수 생성자가 허용되지 않습니다. 따라서 무료 함수는 허용 가능한 솔루션 인 뿐이며 언어 컨텍스트에서 가능한 유일한 깨끗한 솔루션 입니다.

FWIW : 텍스트 표현에서 섬세한 문제가 항상 되는/변환 : 나는 대상 유형에 할 경우 다음, 나는 대상의 다양한 소스 및 텍스트 의 싱크에 대한 종속성을 도입 한 유형 - 그리고 이것은 시간에 따라 다를 수 있습니다. 에서 소스 또는 싱크 유형을 수행하면 해당 유형이 으로 변환되며 이는 더 나쁩니다. 이 (std::streambuf에서) 프로토콜을 정의하려면 사용자가 에게 변환을 처리 할 수있는 새로운 무료 기능 (operator<<operator>>)를 기록하고 에 연산자 오버로드 확인에 카운트가 올바른 기능을 찾을 수있는 곳 C++ 솔루션이다. 무료 함수 솔루션의 장점은 변환이 데이터 유형 (따라서 소스 및 싱크를 알 필요가 없음)이나 소스 또는 싱크 유형 ( )을 포함하지 않으므로 약 사용자 정의 데이터 유형). 나를 나에게 가장 좋은 해결책 인 것 같습니다. 그리고 stod과 같은 기능은 편리 기능 중 하나인데, 특히 자주 사용하는 것을 더 쉽게 작성하도록 해주는 입니다.