2012-03-28 6 views
-1

이 질문을 다른 곳에서 묻고 애매한 대답을 얻었습니다. new 키워드를 사용하는 방법을 이해하지 못해서라고 생각합니다.C++ 함수가 올바르게 반환되지 않습니다. 문자열 소멸자가 호출되는 중

내가 연구하고있는 프로젝트는 C++ 학습을 시작하는 데 도움이되는 것이지만 Java 지식으로 시작합니다. 그것은 단지 텍스트 기반 게임에서 사용할 구조체와 함수의 모음입니다.

내가 문제가되는 기능은 getStats()입니다.이 기능은 구조용 목재의 변수 및 상속 된 구조의 일부 값을 반환합니다.

/** 
*Returns information regarding the status of the wood. 
*@param the wood to retrieve. 
*@return A string representing the stats. 
*/ 
string getStats(wood toGet) 
{ 
    string toReturn; 

    //Substruct specific variables. 
    toReturn += "Type: "; 
    toReturn += toGet.type; 
    toReturn += "\nAge: "; 
    toReturn += toGet.age; 

    //Superstruct variables. 
    toReturn += "\nHeight: "; 
    toReturn += toGet.height; 
    toReturn += "\nWidth: "; 
    toReturn += toGet.width; 
    toReturn += "\nWeight: "; 
    toReturn += toGet.weight; 
    toReturn += "\nGeneric name: "; 
    toReturn += toGet.name; 
    toReturn += "\nState of Matter: "; 
    toReturn += toGet.stateOfMatter; 
    toReturn += "\nFlammable: "; 
    toReturn += toGet.flammable; 
    toReturn += "\n"; 

    return toReturn; 
} 

내가 지금 바보 같은 방법으로이 일을하고 실현

, 나는 배열과 루프와 재 작업 것이다, 그러나 지금 나는이 방법을 사용하고 있습니다. 다른 웹 사이트에 그들이 new를 사용하는 저를 알렸다에 내가 물었다하지만이 같은 수행 할 때 http://pastebin.com/UawrwYj7 :

conversion from ‘std::string* {aka std::basic_string *}’ to non-scalar type ‘std::string {aka std::basic_string }’ requested

전체 소스는 여기에 있습니다 :

string toReturn = new string; 

그것은 나에게 오류를 제공

샘플 실행 결과는 다음과 같습니다.

Type: Birch
Age:
Height:
Width:
Weight: d
Generic name:
State of Matter: solid
Flammable:

+8

가장 좋은 방법은 C++에서 new'가에 있지'사용 모든. 언어가 그렇게 작동하지 않습니다. –

+0

note :'string getStats()'(아마도 OO ..)를 원할 것입니다. btw 원래 코드의 문제점은 무엇입니까? 왜'new'를 사용하고 싶습니까? –

+2

코드가 완벽하게 유용합니다. ** 새로운 사용 **은 절대적으로 필요하지 않습니다 **. 이 코드가 올바르게 작동합니까? –

답변

3

일본어 버전이 호출 될 때, 스트링은 제 1 필드, 구성되며, 다음 복사 반송되고 원래 문자열 (즉 getStats()의 스택에) 소멸한다.

new string; 문자열이 아닌 문자열 객체에 포인터를 반환하므로 변수는 포인터이어야 개최 - string *하지 string. 그러나 이것은 동적 인 메모리 관리를 포함하며,이 경우에는 원하지 않습니다.

요약 : C++에서 아무 것도하지 않고, C++이 Java와 완전히 다르므로 약간의 책을 사서 최소한 기본을 배웁니다.

을 수정하십시오. 또한 함수를 잘 작동 시키려면 stringstream에 대해 읽으십시오.

4

1) new은 필요하지 않습니다. C++은 Java가 아닙니다. C++ 객체는 선언 될 때 존재하게됩니다.

2) 표현 w.getStats(w)은 중복됩니다. 매개 변수로 w을 전달할 필요가 없으며 암시 적으로 this 포인터로 전달됩니다.

3)이 작업을 수행 할 수 없습니다

double x; 
toReturn += x; 

std::string operator+= (double) 없습니다. C++ 표준의 가장 최신 버전 이전에는 일반적으로 std::string 클래스에서 서식을 지정하지 않았습니다.당신이 운영자 <<를 사용하지만,

double x; 
toReturn += std::to_string(x); 

내가 추천 할 것입니다 : 당신이 최근에 충분한 컴파일러가있는 경우, 당신은 당신의 height, width, weight, 등, 코드를 대체 할 수 있습니다. 이렇게하면 사용 방법에 따라 문자열 서식을 지정하거나 데이터를 파일로 보낼 수 있습니다.

다음

은 당신의 getStats 업데이트됩니다 : 당신이 operator<<을 재정의하는 방법을 배울 때

// Untested code 
std::string getStats() 
{ 
    std::ostringstream oss; 
    oss << "Type: " << this->type << "\n"; 
    oss << "Age: " << this->age << "\n"; 
    oss << "Height: " << this->height << "\n"; 
    oss << "Width: " << this->width << "\n"; 
    // and so on 
    return oss.str(); 
} 

나중에 대신이 시도 :

friend std::ostream& operator<<(std::ostream& os, const wood& w) { 
    os << "Type: " << w.type << "\n"; 
    os << "Age: " << w.age << "\n"; 
    os << "Height: " << w.height << "\n"; 
    os << "Width: " << w.width << "\n"; 
    // and so on 
    return os; 
} 
std::string getStats() { 
    std::ostringstream oss; 
    oss << *this; 
    return oss.str(); 
} 
+0

서식 지정 *은 ''라이브러리에 의해 제공되지만, : toReturn + = std :: to_string (x);'. –

+0

나는 당신이'ostringstream'을 의미한다고 생각합니다. – aschepler

+0

@KerrekSB 네, 물론입니다. 그건 C++ 11에 특화된 것입니까, 그렇죠? 내 대답을 분만에 업데이트하겠습니다. –

관련 문제