Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.05.2011, 14:36

Adresse eines temporären Wertes: Referenz/Pointer

Hallo, ich hab gerade ein Verständnisproblem.
Ich habe in einer Klasse eine Membervariable definiert, die ich in einer Funktion zurückliefere.
Wenn ich das mit einem Pointer mache funktioniert es Problemlos, wenn ich es aber mit einer Referenz versuche bekomme ich die Warnung, dass der Wert einer temporären Variable usw zurückgeliefert wurde.

Oder anderst ausgedrückt:
Wo is der unterschied zwischen dem:

C-/C++-Quelltext

1
2
3
4
5
6
public:
//Funktioniert ohne Warnung
    string *GetRoamingPath() { return(&m_ss_RoamingPath.str()); }; //Liefert den Pfad des Roaming Ordners zurück

private:
    stringstream m_ss_RoamingPath; //Pfad zum Roaming Ordner


und dem:

C-/C++-Quelltext

1
2
3
4
5
6
//Bekomme ich die Warnung
public:
    string &GetRoamingPath() { return(m_ss_RoamingPath.str()); }; //Liefert den Pfad des Roaming Ordners zurück

private:
    stringstream m_ss_RoamingPath; //Pfad zum Roaming Ordner


Mit freundlichen Grüßen,
Ombalat

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

23.05.2011, 14:41

In dem Fall musst du wohl eine Kopie zurück geben. Er gibt bei der Benutzung des Zeigers keinen fehler aus, weil er nicht weiß, dass es ein temporäres Objekt ist.
Eine Alternative wäre, eine Referenz auf den Stream zurück zu geben. Das ist aber nicht besonders schön und auch unnötig. Bei passender Optimierung wird, glaube ich, keine neue Kopie angelegt, sondern die von der str() Methode genommen. ^^ Sollte ich mich irren, bitte korrigieren.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (23.05.2011, 14:47)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

23.05.2011, 14:57

Beide Varianten sind keine gute Idee. Das widerspricht jeglicher Idee da eine private Variable zu haben.
Du solltest da eine Kopie zurückgeben, wie auch NachoMan bereits erwähnt hat.

4

23.05.2011, 15:28

Ähm, sorry, aber ich habe das so in erinnerung, dass man bei solchen sachen, wie strings z.B. mit Referenzen arbeiten soll, um sich eben genau diesen kopiervorganz zu ersparen?
Oder gilt das nur für Parameter?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

23.05.2011, 15:36

Ich versuch das mal zu veranschaulichen.

C-/C++-Quelltext

1
2
3
4
5
6
std::string *foo = NULL;
{
    std::string bar("blub");
    foo = &bar;
} // hier wird bar zerstört
cout << *foo; //undefiniertes Verhalten.

Das gleiche passiert in deiner Methode.

Manchmal hat man eben kein Objekt das über den Scope der Methode oder Funktion hinaus erhalten bleibt. Da bleibt einem nur die Kopie zurück zu geben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

6

23.05.2011, 15:40

Das ist mir schon bewusst, nur dass es sich bei meiner Klasse, in der ich das dabei habe, um einen Singelton handelt (sry, vergessen zu erwähnen) und die Variable daher nicht zerstört wird ;)
Es funktioniert auch trotz der warnung ;)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

23.05.2011, 15:42

Schau dir mal an was stringstream::str() zurück gibt ;)
Eine Referenz auf den stringstream selbst könntest du ja zurück geben.

Es funktioniert auch trotz der warnung ;)

Nur weil es jetzt funktioniert, heißt es nicht, dass es immer funktioniert. Wie gesagt, das Verhalten ist nicht definiert.

edit: mit Singletons hat das übrigens nichts zutun. Die Rückgabe einer Referenz könnte dadurch höchstens gefährlicher werden, weil das Singleton irgentwo zerstört werden könnte.
edit2: using namespace solltest du übrigens nicht in Headern benutzen ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (23.05.2011, 15:48)


8

23.05.2011, 15:50

Oh, das liefert ne Kopie zurück :S
Ich verwend die Rückgabefunktion meist nur beim erstellen von fstreams (gleich bei der erzeugung, n einzeiler ;))
Funktionierts deshalb trotz referenz? ^^

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

23.05.2011, 15:55

Es kann funktionieren. Garantiert ist es aber nicht.
Da stringstream::str() eine Kopie zurück gibt(übrigens aus dem gleichen Grund) ist es eigentlich egal ob du eine Referenz zurück gibst. Der Compiler sollte das wegoptimieren. Es wird also keine Kopie von der Kopie erzeugt. Eine Referenz ist in dem fall also auch nicht schneller, vielleicht sogar langsamer.

edit: und selbst wenn es nicht Optimiert wird... safety first!^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (23.05.2011, 16:08)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

23.05.2011, 16:43

Mal ne rein prinzipielle Frage: Wofür der stringstream!?

Werbeanzeige