2013-10-02 3 views
1

문자열에 대한 포인터를 매개 변수로 사용하는 함수가 있습니다. 해당 문자열의 하위 문자열을 찾으려고하지만 use *str.substr()을 사용하려고하지만 멤버 함수를 호출하려고합니다. substr()str은 클래스가 아닙니다. std:string* 어떻게해야합니까?포인터의 부분 문자열 얻기

#include <string> 
using namespace std; 

int main() { 
    string str; 
    foo(&str); 
} 

void foo(string *str){ 
    string temp = *str.substring(int, int); 
} 

위의 내용은 코드의 개요입니다. 코드를 의미 연산자 우선 순위 규칙의

답변

3

당신은 떨어지고있다 fould는, 당신은 포인터 디 레퍼런스 연산자 ->

str->substring(a, b); 

를 사용하거나 명시 적으로 괄호를 사용하여

*(str.substring(int, int)); 

로 읽 당신이 원하는 것에 관한 것

(*str).substring(int, int); 

단순한 졸

foo(const std::string& str){ 
    std::string temp = str.substring(a, b); 
} 
1

그것은 operator precedence 때문이다 : 인수가 널 (NULL)이 될 수 없다면의 ution은 참조를 전달하는 것입니다. 컴파일러는 실제로

*(str.substr(...)) 

이 문제를 해결하기위한 몇 가지 방법이 있습니다로 볼 수 있도록 요소 선택 연산자 .는, 참조 연산자 *보다 더 높은 우선 순위를 가지고 있습니다. 필자가 추천하는 것은 포인터를 사용하지 않고 대신 인수를 참조하는 것입니다. 그런 다음 역 참조 또는 가능한 null 포인터에 대해 신경 쓸 필요가 없습니다. 그리고 원래의 문자열을 수정하고 싶지 않다면 상수 참조.

void foo(const std::string& str) 
{ 
    // ... 

    std::string temp = str.substr(...); 

    // ... 
} 

추천

이어서 오퍼레이터 어드레스의 호출없이

std::string str = ...; 
foo(str); 
관련 문제