String in Fuktion zurückliefern

S

spex

Moin,

Ich möchte in einer Funktion einen String zurückliefern.
Ich hab mir das jetzt so gedacht:

Code:
#include <iostream>
#include <string>

string test()
{
 return "Hallo Peter!";
}

int main()
{
 std::cout << test();
}

Das wär ja am logischsten, funktioniert aber nicht.
Wie funktionierts dann :)

MfG sp³
 
Hallo,
wenn du den String innerhalb der Funktion erzeugst, wird der benötigte Speicher auf dem Stack angelegt, welcher nach dem Verlassen der Funktion natürlich futsch ist. Du könntest es so machen:
C++:
const char *test(string& str)
{
    str = "Hallo Peter!";
    return str.c_str();
}

string str;
cout << test(str);
Gruß
MCoder
 
Danke, geht.

Noch eine Frage, wofür steht das * vor dem Funktionsname ?
Sry ich bin Anfänger was C++ betrifft!
 
wenn du den String innerhalb der Funktion erzeugst, wird der benötigte Speicher auf dem Stack angelegt, welcher nach dem Verlassen der Funktion natürlich futsch ist.
In diesem Fall eher nicht. Entweder es wird beim Verlassen der Funktion der Kopierkonstruktor von string aufgerufen und eine Kopie des Objektes zurückgegeben oder der Compiler erstellt das Objekt gleich im Stackframe des Aufrufers. Ein optimierungsfreudig eingestellter Compiler könnte die Funktion hier sogar „inlinen“.

Das einzige Problem beim ursprünglichen Code war das fehlende std:: vor string. Folgendes funktioniert also problemlos:
C++:
#include <iostream>
#include <string>

std::string test() {
    return "Hallo Peter!";
}

int main() {
    std::cout << test();
    return 0;
}

Grüße,
Matthias
 
Noch besser!
Also ist das
C++:
#include <string>
vollkommen überflüssig!

Das C++ Forum hier ist Top!
 
Hi.
Noch besser!
Also ist das
C++:
#include <string>
vollkommen überflüssig!
Nein, ist es nicht. In der <string> Headerdatei steht die Deklaration für die std::string Klasse drin. Es kann sein, das es auch funktioniert wenn man das include weggläßt, aber nur wenn die Deklaration irgendwie anders (zum Beispiel durch das Einbinden von <iostream>) bereits gelesen wurde.

Das Problem war nur das du den Namensraum nicht spezifiziert hast, in dem die std::string Klasse definiert ist. Das kann man auf verschiedene Weise machen - da gibts aber genug Themen, such einfach mal nach "Namensraum" hier Forum.

Gruß
 
Zurück