2016-10-03 2 views
0

C++에서 어휘 분석기를 작성 중이므로 서브 클래스에 to_string() 메서드를 포함해야합니다. 이 방법은 어휘 분석기에서 사용하지 않지만 디버깅 목적으로 포함시켜야한다고 말합니다. 필자가 작성한 to_string 메쏘드는 오류를 계속 발생시키고 왜 확신을 못합니다. 여기에 내가 무엇을 가지고 : 그것은 작동해야처럼이 보인다int를 to_string 메서드의 문자열로 변환 C++

string *AddopToken::to_string() 
{ 
    token_type_type tokenType = get_token_type(); 
    addop_attr_type addopAttr = get_attribute(); 
    return "[TOKEN TYPE: " + tokenType + ", ATTRIBUTE TYPE: " + addopAttr + "]"; 
} 

하지만, 어떤 이유로 그렇지 않습니다.

다음은 AddopToken 헤더에 addop_attr_type의 typedef입니다.

typedef enum addop_attr { ADDOP_ADD = 400, 
          ADDOP_SUB = 401, 
          ADDOP_OR = 402, 
          ADDOP_NO_ATTR = 499 } addop_attr_type; 

addopAttr의 유형 addop_attr_type입니다 그래서 비록 정말 모든이의 int 상수이다. 나는 C++이 int를 문자열로 변환 할 수 있다고 생각했습니다. 내 to_string()가 올바르게 작동 할 수 있도록 이러한 변수를 문자열로 변환하는 방법이 있습니까?

+0

'std :: to_string (addopAttr) .c_str()'을 사용하십시오. – 0x499602D2

+0

아니요, C++은 당신을 위해 절대 아무것도하지 않습니다. 너는 모든 것을 스스로해야만한다. 그것이 C++을 정말 대단한 것으로 만듭니다. 'std :: tostring()'을 사용하십시오. –

+0

[C++에서 int를 int로 변환하는 가장 쉬운 방법] 가능한 복제본 (http://stackoverflow.com/questions/5590381/easiest-way-to-convert-int-to-string-in-c) – MrEricSir

답변

0

C++에서는 문자열 리터럴이나 문자열 리터럴을 정수로 연결하는 데 +를 사용할 수 없습니다. 당신이 필요로하는 코드는

char buff[1204]; 
sprintf(buff, "[TOKEN_TYPE; %d , ATTRUBUTE_TYPE %d ]", tokenType, addopAttr); 

return std::string(buff); 

당신은 거기에 비슷한 일을 달성하기위한 발명 한 사람 C++ 기능을 많이도 있습니다, 그리고는 임시 버퍼를 제거한다 오래된 C 함수의 sprintf를 사용하지 않아도, 그러나 밑에있는 일을 따라 가기가 더 어려워지는 단점이 있습니다.

+0

나는 이것을 시도했다. 컴파일러는 그것을 허용하지 않을 것이다. 오류가 발생했습니다 : 'sprintf'는이 범위에서 선언되지 않았고 다른 하나는'error : std :: string {aka std :: basic_string } '을'std :: string {aka std :: basic_string 반환 문자열 (버프) ' – user3869795

+0

#include sprintf를 얻을 수 있습니다. 다른 오류는 문자열 대신 포인터를 요청했기 때문입니다. C++에서는 그렇게 할 필요가 없습니다. 단지 코드를 작성하기가 더 어려워집니다. std ;; 문자열은 C 문자열과 달리 변수와 같습니다. –

+0

헤더 파일에 대한 코드와 헤더에 슈퍼 클래스뿐만 아니라'to_string()'메소드의 리턴 타입은'string *'포인터였습니다. 우리는 그것을 바꾸지 말라고 들었습니다. – user3869795

0

이 당신을 위해 작동합니다 :

편집 : 지금은 문자열에 대한 포인터를 반환, 당신이 그것을 사용을 완료 한 후에는 포인터를 삭제하는 것을 잊지 마십시오.

std::string* AddopToken::to_string() const{ 

      token_type_type tokenType = get_token_type(); 
      addop_attr_type addopAttr = get_attribute(); 

      std::string* result = std::string(); 
      *result = std::string("[TOKEN TYPE: ") + std::to_string(tokenType) + std::string(", ATTRIBUTE TYPE: ") + std::to_string(addopAttr) + std::string("]"); 

      return result; 
     } 

C++ "[TOKEN TYPE :"을 char [14]로 표시하고 문자열이 아닙니다. int를 std :: to_string()을 사용하여 문자열로 변환합니다.

+0

이 메소드는 슈퍼 클래스에서'string *'으로 정의되어 있으므로 포인터를 처리해야합니다. 어떻게 영향을 미칠까요? – user3869795

+0

새 포인터를 만들고 포인터를 반환하십시오. 그러나 포인터가 끝나면 포인터를 지우는 것을 기억해야합니다. – user3196144

+0

나는 이것을 시도하고 그것은 작동하지 않았다. 왜 그런지는 모르겠지만 어떤 이유로'오류 : 'AddopToken :: get_attribute() const'에 대한 호출과 일치하는 함수가 없다는 것을 알 수 있습니다.'get_attribute()'메소드 정의되고 제대로 작동하며 const 메소드가 아니기 때문입니다. 사실'to_string'의 서명은'string * AddopToken :: to_string() const {....}' – user3869795

관련 문제