Referenz auf String Objekt
-
Belli schrieb:
Gott, bist Du blöd ...
Du wirst nie mehr aufhören, oder?Belli, ich habe keine Ahnung was du hast, aber anscheinend hast du selbst nicht verstanden wovon du redest wenn du standardmäßig lvalue-Referenzen für Strings nimmst. :xmas1:
Funktioniert es überhaupt, wie ich mir das dachte??
*facepalm*
Du kannst nicht zwei Variablen im selben Scope mit selbem Identifier definieren (ODR).
Das müsstest du jetzt aber schon wissen, oder?string &Text =Text(Text); //Referenz auf die FunktionDazu sage ich nur: WTF?
Es muss so aussehen:std::string (&Text) (std::string) = ::Text;(Ungetestet)
-
nein.
bei mir im visual studio (2012) meint der, dass du 2 mal den gleichen variablennamen verwendest... (zeile 7 -> logisch oder?!)
das ersetze ich mal bzw kommentiere die zeile aus.und jetzt meint der compiler noch, dass der "ausdruck" in zeile 16 keine funktion mit einem argument ergibt -> ok, ich benenne die funktion mal um
jetzt läuft es.
ABER: es kracht wenn du es ausführst... über das warum kannst du mal drüber nachdenken

#include <iostream> #include <string> using namespace std; string func(string Text) //Funktionsdefinition { //string Text; //Text als Stringvariable anlegen cout << "Geben Sie einen Text ein\n"; //Ausgabe getline(cin, Text); //Texteingabe return Text; //Stringvariable Text zurückgeben } int main() { string &Text = func(Text); //Referenz auf die Funktion cout << &Text << "\n"; //Ausgabe der Referenz return 0; }
-
silent_max schrieb:
Funktioniert es überhaupt, wie ich mir das dachte??
nein. Auch wenn ich nicht weiß, was du dir dabei dachtest...
* Du übergibst der Funktion "Text" einen unbekannten Parameter.
* Dann darfst du eine Variable nicht wie eine Funktion benennen. Überhaupt soltlest du dir Gedanken über eine sinnvolle Namensgebung machen und nicht einfach alles "Text" nennen. Da ist die Verwirrung komplett, mit welchem "Text" du gerade arbeitest.
* In der Funktion "Text" wird der Parameter "Text" völlig ignoriert.
* "string &Text =Text(Text); //Referenz auf die Funktion" ist keine Referenz auf eine Funktion, sondern eine Referenz auf den Rückgabewert dieser Funktion.
-
okay, was sone da sagt kann auch hand und fuss haben.
möchtest du eine referenz auf das ergebnis der funktion oder willst du einen funktionszeiger?
-
Ja entschuldigt, ich bin noch nicht ganz wach.
Hier mal der richtige Code:
#include <iostream> #include <string> using namespace std; string Text(string Eingabe) { cout << "Geben Sie einen Text ein\n"; getline(cin, Eingabe); return Eingabe; } int main() { string Eingabe; string &Text_1 =Text(Eingabe); cout << Text_1 << "\n"; return 0; }
-
Skym0sh0 schrieb:
okay, was sone da sagt kann auch hand und fuss haben.
möchtest du eine referenz auf das ergebnis der funktion oder willst du einen funktionszeiger?
Das Problem ist, dass er sich z. T. mit den Begrifflichkeiten verfusselt.
"Referenz auf Funktion" ist für mich ziemlich eindeutig eine Referenz auf eine Funktion, aber ich denke, er meint eine Referenz auf den Rückgabewert?!
Schwer zu erkennen, wenn sein Code totaler Müll ist...
-
string &Text_1 =Text(Eingabe);
Du kannst keine lvalue-Referenz auf ein prvalue haben.
Mach daraus einfach ein eigenes string-Objekt.
Über die Performance brauchst du dir keine Gedanken machen, RVO macht den Rest.
-
ich finds eh schwachsinn sich so früh gedanken über irgendwelche performance zu machen. wenn man halbwegs seinen kopf zusammenhält und nicht total ineffizienten kram schreibt passt das alles.
und wenn kurz vorm release alles zu langsam ist, setzt man einen profiler drauf an und optimiert danach.
alles andere ist in meinen augen premature optimizing, denn gerade sowas sollte der compiler durch RValue Referenzen und RVO locker in den griff kriegen, wenn nicht hilft man ihm halt und gut ist
-
Wo besteht eigentlich der Unterschied zwischen
call-by-referenceundcall-by-value??
-
-
silent_max schrieb:
Wo besteht eigentlich der Unterschied zwischen
call-by-referenceundcall-by-value??
-
Ich denke, du willst sowas:
#include <iostream> #include <string> using namespace std; // Für kleine Übungsprogramme völlig in Ordnung. Sogar gut, denn es verkürzt den Code und macht ihn leichter lesbar - alles, was man eigentlich braucht void Text(string& Eingabe) // Es wird direkt nach 'Eingabe' extrahiert. Das macht den Code in der main() und in Text() kürzer und hat auch sonst keine Nachteile. // Ich habe mich sowieso schon gefragt: Was sollte das mit dem Parameter Eingabe? Variablen, die die Funktion nur für die interne // Funktionsweise braucht, werden auch intern definiert, nicht als Parameter. { cout << "Geben Sie einen Text ein:\n"; getline(cin, Eingabe); // Die Fehlerprüfung unterlassen wir mal zugunsten der Einfachheit } int main() { string Eingabe; Text(Eingabe); cout << Eingabe << "\n"; } // Das return-Statement kann in der main() weggelassen werden
-
Sone schrieb:
Ich denke, du willst sowas:
oder sowas:
#include <iostream> #include <string> std::string ReadText() { cout << "Geben Sie einen Text ein:\n"; std::string input; getline(cin, input); return input; } int main() { string Eingabe = ReadText(); cout << Eingabe << "\n"; }
-
Skym0sh0 schrieb:
`
call-by-value
Bei CBV werden die an eine Funktion übergebenen Daten kopiert. Es besteht dann keine Verbindung mehr zwischen den Daten beim Aufrufer und den Daten in der Funktion. Werden große Objekte auf diese Weise übergeben, so ist das sehr kostspielig in Bezug auf Rechenzeit (der Kopiervorgang) und Speicherplatz (Daten sind mehrmals vorhanden).
call-by-reference
Anstatt die Daten zu kopieren werden Referenzen auf die Daten übergeben. Man kann sich das als Zeiger vorstellen: Beim Aufrufer zeigt eine Variable auf ein bestimmtes Datum, in der Funktion zeigt eine andere Variable auf dasselbe Datum. Methodenaufrufe an einem so übergebenen Objekt arbeiten also auf demselben Objekt, das auch außerhalb sichtbar ist.`
Habe ich das richtig verstanden, dass bei CBR, also call-by-reference,
-> die Performance besser ist?
-> der Zugriff auf Daten bzw. einfacher ist?
-
silent_max schrieb:
Habe ich das richtig verstanden, dass bei CBR, also call-by-reference,
-> die Performance besser ist?Ja
silent_max schrieb:
-> der Zugriff auf Daten bzw. einfacher ist?
Nein. Der Unterschied besteht darin, dass bei CBR das Objekt *nicht* kopiert wird. Änderungen an dem Objekt haben also Auswirkungen "nach außen". Deswegen sollten Objekte bei CBR möglichst "const" übergeben werden.
-
http://www.cplusplus.com/forum/general/7990/
So wie ich das jetzt verstanden habe, wird bei call-by-reference mit Pointern gearbeitet??
-
silent_max schrieb:
http://www.cplusplus.com/forum/general/7990/
So wie ich das jetzt verstanden habe, wird bei call-by-reference mit Pointern gearbeitet??
Nein.
Eine Referenz ist intern ein konstanter Pointer- daher wird bei CBR nur der Pointer statt dem Pointee kopiert.Mit Pointern hat das aber beim programmieren nichts zu tun.
-
Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??
-
silent_max schrieb:
Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??
* Bücher lesen & verstehen
* Jahrelange Erfahrung
-
daddy_felix schrieb:
silent_max schrieb:
Wie macht ihr es eigentlich, dass ihr so viel Ahnung vom Programmieren in C++ habt??
* Bücher lesen & verstehen
* Jahrelange Erfahrung+ Forum
