2012-03-28 12 views
-1

genannt Ich habe diese Frage an anderer Stelle gestellt und eine vage Antwort erhalten, und ich denke, es liegt daran, dass ich nicht verstehe, wie das Schlüsselwort new verwenden.C++ - Funktion nicht ordnungsgemäß zurückgegeben: Zeichenfolge Destruktor wird

Das Projekt, an dem ich arbeite, ist nur etwas, um mir zu helfen, C++ zu lernen, aber ich komme aus einem Java-Wissen. Es ist nur eine Sammlung von Strukturen und Funktionen, die ich in einem textbasierten Spiel verwenden werde.

Die Funktion, mit der ich Probleme habe, ist getStats(), die einige Werte von Variablen der Struktur Holz und die Struktur zurückgibt, von der es erbt.

/** 
*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; 
} 

Ich weiß, dass ich jetzt diese in einer dummen Art und Weise tue, werde ich es mit einer Reihe überarbeiten und einer Schleife, aber jetzt ich diese Methode verwenden. Auf der anderen Website, fragte ich sie auf sie mich informiert new zu verwenden, aber wenn ich so tun:

string toReturn = new string; 

es gibt mir eine Fehlermeldung:

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

Die vollständige Quelle ist hier: http://pastebin.com/UawrwYj7

Die Ausgabe von einem Probenlauf ist unten.

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

+8

Der beste Weg, in C++ zu verwenden 'new' ist überhaupt nicht alle. Die Sprache funktioniert nicht so. –

+0

hinweis: du willst wahrscheinlich 'string getStats()' (es ist OO ..). Was ist das Problem mit Ihrem ursprünglichen Code? Warum willst du 'neu' benutzen? –

+2

Der Code, den Sie haben, sieht perfekt aus; es gibt ** absolut keine Notwendigkeit, "neu" zu verwenden **. Funktioniert dieser Code korrekt für Sie? –

Antwort

3

Wenn die ursprüngliche Version aufgerufen wird, wird die Zeichenfolge zuerst konstruiert werden, gefüllt, dann wird eine Kopie zurückgegeben werden und Original-Zeichenkette (dh auf getStats() ‚s Stack) zerstört.

new string; gibt einen Zeiger auf einen String, nicht String-Objekt, so dass die Variable, es zu halten müssen Zeiger sein - string *, nicht string. Dies beinhaltet jedoch ein dynamisches Speichermanagement - und Sie wollen es in diesem Fall nicht.

Zusammenfassung: alles in C++ zu tun, ein anständiges Buch zu bekommen und zumindest die Grundlagen zu lernen, wie C++ wirklich von Java unterscheidet.

Bearbeiten: auch, um Ihre Funktion gut funktionieren zu lassen, lesen Sie weiter über stringstream.

4

1) Sie brauchen nicht new. C++ ist nicht Java. In C++ entstehen Objekte, wenn sie deklariert werden.

2) Der Ausdruck w.getStats(w) ist redundant. Sie müssen w nicht als Parameter übergeben, es wird implizit als this Zeiger übergeben.

3) Sie können dies nicht tun:

double x; 
toReturn += x; 

Es gibt keine std::string operator+= (double) ist. Vor der neuesten Version des C++ - Standards wurde die Formatierung im Allgemeinen nicht von der Klasse std::string durchgeführt.

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

Ich würde empfehlen jedoch, dass Sie den Operator << verwenden: Wenn Sie einen aktuellen genug Compiler haben, können Sie Ihren height, width, weight, etc, Code mit ersetzen. Dadurch können Sie Zeichenketten formatieren oder Ihre Daten in eine Datei senden, je nachdem, wie Sie sie verwenden.

Sie Hier wird getStats aktualisiert:

// 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(); 
} 

Später, wenn Sie lernen, wie man operator<< außer Kraft zu setzen, diese stattdessen versuchen:

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

Formatierung * wird * von der Bibliothek '' bereitgestellt, obwohl: 'toReturn + = std :: to_string (x);'. –

+0

Ich denke du meinst "ostringstream". – aschepler

+0

@KerrekSB Ja, natürlich. Das ist C++ 11-spezifisch, oder? Ich werde meine Antwort in Minutenschnelle aktualisieren. –

Verwandte Themen