2013-12-11 3 views
2

최근에 std :: string의 하위 클래스 spstring을 정의하려고합니다. 그것은 spstr.h 선언 : MAIN.CPP에서 테스트std :: string을 상속하는 방법은 무엇입니까?

그러나
#include <cctype> 
#include <string> 
#include <algorithm> 
#include <sstream> 
#include <stdint.h> 
#include <xstring> 


class spstring : public std::string { 
public: 
    spstring(std::string s):std::string(s){} //Declare the constructor 
    int stoi(); //Declare stoi 
    spstring Spstring(std::string s); ////Declare mandatory conversion function 
}; 

spstring spstring::Spstring(std::string s) 
{ 
    spstring spstr(s); 
    return(spstr); 
} 

:

오류 C2228 :

spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring 
int byteadd; 
byteadd=byteaddstr.stoi(); //call byteaddstr.stoi 

는 실패가에 대한 적합하여야한다 "의 왼쪽. stoi "클래스/구조체/공용체가 있어야합니다.

실제로 이상한 소리가납니다. 사실, byteaddstr은 실제로 spstring 왜 멤버 함수를 호출 할 수 없습니까?

+7

일반적으로 STL 컨테이너에서 파생되기를 원하지 않습니다. –

+2

일반적으로'std :: string'을 상속하는 것은 좋지 않습니다. 특히 공개적으로 (관련 SO 게시물 참조) (http://stackoverflow.com/questions/6006860/why-should-one-not -derive-from-c-std-string-class). private 상속 *은 클래스와'std :: string' 사이의 밀접한 결합을 강요하지만 충분히 안전하다고 생각할 수도 있습니다. [상속의 남용]에 대한 흥미로운 토론을 참조하십시오 (http://www.gotw.ca/publications/mill06.htm).오류에 관해서는, 문제를 재현하는 자그마한 예제를 게시하십시오. – juanchopanza

+1

std :: string (또는 map, vector 또는 다른 컨테이너)에서 파생되지 않습니다. 이 문제가 발생한 모든 경우에 사용할 수있는 몇 가지 더 나은 솔루션이있었습니다. stl 컨테이너에서 파생해야하는 경우 컨테이너를 클래스 멤버로 사용하거나 개인 상속을 사용하는 대신 캡슐화를 고려하십시오. – Peter

답변

5

C에서 ++ 수있는 모든 선언은 & hellip과 같은 함수 선언으로 구문 분석됩니다.

spstring byteaddstr(std::string(argv[4])); //convertchar* to spstring 

함수 선언로서 해석된다.

e.e. 변수가 아닙니다.

는 별도의 괄호를 추가하려면이 특정한 경우에 하나 개의 솔루션입니다

:

spstring byteaddstr((std::string(argv[4]))); //convertchar* to spstring 

어떤 사람들은 그 스콧 마이어스 '원래의 사용 여부에 대해 동의하지만 이것은의 가장 성가신 구문 분석 C++에서로 알려져있다 용어는 일반적으로 지금처럼 사용됩니다. std::string에서을 유도하는 것이 안전하게 동적 할당에 대한 우려를 무시할 수 복잡성과 혼란을 (추가하기 때문에 코드를 동적으로 std::string 가치가 할당이 때문에


그리고 그런데

, 하나는 일반적으로, 꽤 좋은 이유가 있어야 그것이 무엇이든간에). 그래서, 나는 그렇게하지 않는 것이 좋습니다.

+0

예, 이것은 버텀 라인입니다. 고마워요! – Popopo

+0

동적 할당에 대한 우려를 무시하면 상속에 관한 문제는 정확히 무엇입니까? 필자의 상식으로 상속을 사용하면 코드가 복잡해지고 이해하기가 어려워집니다. 더 많은 것이 있습니까? –

+0

@ BЈовић : 사실이 아닙니다. 그러나 그 속성들은 * 더 많은 일 *로 번역됩니다. –

0

std::string (및 STL 컨테이너)에서 상속하는 것은 바람직하지 않습니다. 기본 클래스로 작동하도록 설계되지 않았습니다.

중요한 것은 파생 클래스에서 메모리 관리를 어렵게 만들 수있는 가상 소멸자가 반드시 필요한 것은 아닙니다.

당신은 또한 가독성을 잃을 것입니다 : STL 클래스 나 함수를 본다면 표준을 암기했다고 가정 할 때 일어날 일을 정확히 알고 있습니다. 파생 된 클래스를 사용하여 설명서 또는 프로그램 주석에 의존해야합니다.

내 대답 : 표준 : : 문자열에서 상속 할 수있는 올바른 방법은 없습니다.

관련 문제