Referenz auf String Objekt



  • 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-reference und call-by-value ??





  • silent_max schrieb:

    Wo besteht eigentlich der Unterschied zwischen call-by-reference und call-by-value ??

    http://bit.ly/ZeU1cf



  • 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:

    keine 5 sekunden google...

    `

    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 Erfahrung

    das 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?


Anmelden zum Antworten