Referenz auf String Objekt
-
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

-
daddy_felix schrieb:
* Bücher lesen & verstehen
* Jahrelange Erfahrungdas mit der erfahrung glaube ich nicht. sone ist doch noch en junger spund, der kA vielleicht grad die oberstufe besucht...
aber ich kann dem zustimmen. und wenn man hier im forum einfach nur lauscht kriegt man viel mit.
und mit programmiersprachen ists wie mit normalen sprachen: mit der zeit nutzt man sie anders, es werden dialekte entwickelt und best practices und so weiter
das kommt alles mit der zeit. ich hätte früher auch fast für jedes bisschen gefragt wie du. aber man kann das fast alles auch mit probieren rauskriegen (oder google)
-
Seid ihr hauptberuflich C++ Programmierer??
Trotzdem hätte ich noch eine Frage.
Ich wollte einen konstanten Text per Referenz ausgeben.
Dazu folgender Code:
#include<iostream> #include<string> using namespace std; string Text(string const Eingabe)//Definition der Funktion Text mit konstanem String { Eingabe == "Dies ist ein konstanter Text!\n"; //Den Text per Eingabe definieren return Eingabe; //Rückgabe von Eingabe } int main() { string Eingabe; //Definition der Stringvariablen Eingabe string &Text_1=Text(Eingabe); //Initialisierung der Referenzvariablen Text_1 mit Text(Eingabe) cout << Text_1 << "\n"; //Ausgabe des konstanten Textes return 0; }In der Ausgabe erscheint aber gar nichts.
Was habe ich falsch gemacht?
-
silent_max schrieb:
Seid ihr hauptberuflich C++ Programmierer??
Ich bin Softwareentwickler und arbeite derzeit hauptsächlich mit C++ und ein wenig mit Erlang
silent_max schrieb:
Was habe ich falsch gemacht?
Du hast den Debugger nicht verwendet. Dann hättest du gesehen, dass die Zuweisung "Eingabe == "Dies ist ein konstanter Text!\n";" offensichtlich nciht das macht, was du erwartest...
Wenn du den Fehler korrigiert hast, wird der Compiler meckern, dass er einem konstanten Objekt ncihts zuweisen kann.
Warum übrgibst du überhaupt den String als Referenz und gibst ihn als Rückgabewert dann wieder zurück?
-
So... Jetzt funktioniert es, habe gerade auch den Debugger benutzt:
#include<iostream> #include<string> using namespace std; string Text(string )//Definition der Funktion Text mit konstanem String { string const Eingabe = "Dies ist ein konstanter Text!\n"; //Den Text per Eingabe definieren return Eingabe; //Rückgabe von Eingabe } int main() { string Eingabe; //Definition der Stringvariablen Eingabe string &Text_1=Text(Eingabe); //Initialisierung der Referenzvariablen Text_1 mit Text(Eingabe) cout << Text_1 << "\n"; //Ausgabe des konstanten Textes return 0; }Kommen eigentlich in der Praxis Referenzen auf Strings häufig vor??