2011-12-24 3 views
8

나는 C++ Early Objects 7th Edition으로 시작하는 책에서 프로그래밍 문제 중 하나를 다루고 있으며, 할당 중 하나는 STL 문자열 클래스에서 파생 된 클래스를 만들 것을 요청합니다. 나는 내가 할 수있는 일을 이해하고 그 해결책을 구현하기 위해 어떻게해야 하는지를 이해할 목적으로 질문을 게시하여 아무도 더 많은 제안을하지 않도록합니다.STL 문자열 클래스의 멤버 변수에 어떻게 액세스합니까?

-이 텍스트로 작성과 같은 질문 -

회문 테스트

회문 앞으로 같은 역을 읽는 문자열입니다. 예를 들어, 엄마, 아빠, 마담레이더은 문장입니다. STL string class에서 파생 된 class Pstring을 작성하십시오. Pstring class 문자열이 회문인지 여부를 판정하는 멤버 함수

bool isPalindrome() 

를 추가한다. STL string 객체를 매개 변수로 사용하여 문자열 기본 클래스 생성자에 전달하는 생성자를 포함합니다. 사용자에게 문자열을 입력하도록 요청하는 메인 프로그램을 가지고 클래스를 테스트하십시오. 프로그램은 문자열을 사용하여 Pstring 객체를 초기화 한 다음 isPalindrome()을 호출하여 입력 된 문자열이 회문인지 여부를 확인합니다.

문자열 클래스의 첨자 연산자 []를 사용하는 것이 유용 할 수 있습니다. str이 문자열 객체이고 k가 정수인 경우 str [k]는 문자열의 k 위치에서 caracter를 반환합니다.

- 끝 - 나는에서 Pstring를 유도하고있는 클래스 내가 작성하지 않은 클래스이며, 경우

내 주요 질문은 내 문자열 객체를 보유하고있는 멤버 변수에 액세스 할 어떻게 해야할지 모르겠있다 그것의 멤버들을 구현 하는가? 예를 들어

,

#include <string> 
using namespace std; 

class Pstring : public string 
{ 
public: 
    Pstring(std::string text) 
    : string(text) { } 

    bool isPalindrome() 
    { 
    // How do I access the string if I am passing it to the base class? 

    // What I think I should do is... 
    bool is_palindrome = true; 
    auto iBegin = begin(); 
    auto iEnd = end() - 1; 

    while (iBegin < iEnd && is_palindrome) 
    { 
     if (*iBegin++ != *iEnd--) 
     is_palindrome = false; 
    } 

    return is_palindrome; 

    // But I think this is wrong because... 
    // #1 The book did not discuss the keyword auto yet 
    // #2 The book discussed when a class is derived from another class, 
    // how the members from super class will be accessible to the sub class. 
    // However, with this assignment, I don't see how to access the members. 
    } 
} 

내가 할당이 첨자 표기법을 사용하여 언급 때문에 잘못입니다 뭐하는 거지 같은 나는 그러나, 느끼는 이유, 내가 돈 '경우 첨자 표기법을 사용하는 방법을 이해하지 않습니다 문자열이 저장된 변수의 이름을 알 수 없습니다.

내 의견으로는 매우 불충분 한 강사가 아닌 이상 저자가 솔루션을 제공하지 않으므로 도움을 주실 수 있습니다. 이것이 아마도 학문적 텍스트라는 사실과 관련이있을 것입니다.

+6

절대로 STL 클래스에서 파생 없습니다. 항상 나쁜 아이디어. 대신에 작곡을 해보 시지 않겠습니까? – Lalaland

+5

저자는 바보이기 때문에 해결책을 제시하지 못할 수도 있습니다. – Duck

+0

@Ethan Steinberg 그러나이 임무는 특별히 그것을 요구합니다. –

답변

3

std :: string을 상속하지 말아야합니다. std :: string은이를 위해 설계되지 않았으므로, 또한 회귀선을 찾기 위해 꼭 필요하지 않습니다. (이 질문에서 : Check if a string is palindrome이에서 링크 : C++ Palindrome finder optimization) Inheriting and overriding functions of a std::string?

회문 솔루션 :

#include <algorithm> 

bool isPal(const string& testing) { 
    return std::equal(testing.begin(), testing.begin() + testing.size()/2, testing.rbegin()); 
} 

그 책의 품질이 의심 보인다

이를 참조하십시오. 무료 함수 (당신이 물어 보는 사람에 따라 다름)는 항상 멤버 함수보다 선호되며, 특히 상속보다 선호됩니다.당신이 상속을 사용해야하는 경우


: 당신이 자동차를 사용하지 않을 경우

class Pstring : public string 
{ 
    //... 

    bool isPalindrome() 
    { 
     return std::equal(begin(), begin() + size()/2, rbegin()); 

     // as a side-note, 'iterator' will refer to the inherited return type of begin() 
     // Also, 'operator[](x)' will call the subscript operator 
    } 
}; 
+0

응답 해 주셔서 감사합니다. 나는 이것이 좋은 습관이 아니라는 것을 알고있다. 그러나, 위의 시도와 같은 방식으로 내 솔루션을 구현하도록 특별히 요청합니다. STL 문자열 클래스에서 파생 된 클래스를 생성 한 다음 문자열이 회귀 인 경우 테스트 할 함수를 만듭니다. 과제를 완료하려고합니다. 더 이상 고급 방법을 사용하거나 할당 요청 방법에서 벗어나는 자체 솔루션을 구현할 수 없습니다. –

+0

@ fhaddad78 그냥 멤버 함수에서 그 코드를 래핑 할 수 있습니다. std :: string의 멤버 함수는 계속 사용할 수 있습니다. – Pubby

+0

응답 해 주셔서 감사합니다. 연산자 [] (x)를 직접 호출하는 것을 간과하고 중침 표기법을 사용하는 방법을 알아 내려고했습니다. –

0

을, 당신은 단순히 auto이 경우에 어쨌든 해결 무엇 인 대신 std::string::iterator를 사용할 수 있습니다.

따라서 문제 # 1이 만족된다.


당신이 begin()를 호출하고 end() 당신은 슈퍼 클래스 표준 : : 문자열의 회원 begin()end()을 요구하고있다.

따라서 문제 # 2가 만족된다.

1

auto 해당 키워드가 최근에 언어에 추가되었으므로 책에 적용되지 않았습니다. 컴파일러가 1 년 이상되었거나 큰 이름 중 하나가 아닌 경우 아마도 컴파일러가 지원하지 않을 것입니다.

이 문제의 경우 적절한 해결책을 위해 멤버 변수에 액세스 할 필요가 없으므로 문제가 무엇인지 또는 도달 가능한지 여부를 걱정할 필요가 없습니다. 좋은 점은 표준에 의해 지정된 것이 없기 때문입니다. 특정 컴파일러에 의해 정의 된 모든 구현 세부 사항입니다. 깊이 파고들 경우 자신이 무엇을 잘못하고 있는지 스스로에게 질문해야합니다.

물론 부모 클래스의 멤버 함수는 자식 클래스의 멤버 함수로 정확하게 액세스됩니다.

멤버 운영자 오버로드는 다소 까다 롭지 만 여전히 나쁘지는 않습니다. *this 인 인스턴스를 제공해야합니다. operator 키워드로도 전화 할 수는 있지만 내 의견으로는 조금 어설픈 것입니다.

if ((*this)[i] == (*this)[j]) 

if (operator[](i) == operator[](j)) 
+1

'auto' 키워드가 주변에 있었기 때문에 B. 자동으로 유용한 것을하고 있습니다. 최근에 추가 된 것이 있습니다. – Pubby

+0

@ 마크 랜섬 OK. 나는이 모든 것을 함께 나쁜 일로 처리 할 것이다. 난 정말이 문제에 혼란스러워했다. 왜냐하면 하위 솔루션을 과부하시키지 않거나 내 문자열을 찾을 수있는 멤버 변수에 앉아 있지 않는 한 어떻게하는지 이해하지 못하는 내 솔루션에서 첨자 표기법을 사용하기 때문이다. 내가 할 수없는 것처럼 보인다. –

+1

@ fhaddad78, 회원 운영자를 포함하도록 답변을 업데이트했습니다. –

0

이 시도 :

#include <string> 

class Pstring : public std::string 
{ 
public: 
    Pstring(const std::string &text) 
     : std::string(text) { } 

    bool isPalindrome() 
    { 
     std::string::size_type len = length(); 
     std::string::size_type half = len/2; 
     for (std::string::size_type idx = 0; idx < half; ++idx) 
     { 
      if ((*this)[idx] != (*this)[len-idx-1]) 
       return false; 
     } 
     return true; 
    } 
}; 
관련 문제