Pointer oder Referenzen bei Übergabeparameter?



  • @volkard, lester, 1310-logik, Lolz:
    Gut, die Beispiele mit std::pair und der struct zeigen, dass man es sicherlich in den meisten Fällen schafft, auf nur einen Rückgabewert zurückzugreifen. Das hatte ich so nicht betrachtet. Ich weiß jetzt nicht, ob es in meinem Fall sinnvoll ist, bei dem Nachrichtengenerator bei jedem Aufruf eine struct zu erstellen oder ein std::pair, das Ganze ist nämlich recht zeitkritisch. Aber für andere Fälle kann mans sicherlich gebrauchen. 👍

    1310-logik schrieb:

    das mit dem rtti hab ich nicht geschnallt.

    Bei eingeschalteter RTI (runtime type identification) kann man bei polymorphen Objekten mit dem Schlüsselwort typeid den Quellocode- und Linkernamen einer Klasse bestimmen, z.B.

    MyClass obj;
    cout << typeid(Obj).name();
    


  • volkard schrieb:

    aber ich. zeig mir mal ne anwendung für wo zwei returnwerte benötig werden. ich müßte lange in der krimskramskiste suchen.

    Aus der STL:

    pair<iterator, bool> map<...>::insert(const value_type& x)
    


  • Da wird es so gemacht, aber wird es wirklich benötigt?



  • Konrad Rudolph schrieb:

    volkard schrieb:

    aber ich. zeig mir mal ne anwendung für wo zwei returnwerte benötig werden. ich müßte lange in der krimskramskiste suchen.

    Aus der STL:

    pair<iterator, bool> map<...>::insert(const value_type& x)
    

    ich meinte doch: zeig mir ein beispiel, wo wegen zwei returnwerten nicht-const parameter sein müssen.



  • .filmor schrieb:

    Da wird es so gemacht, aber wird es wirklich benötigt?

    Hmm. Siehst Du Alternativen?

    Ein anderes gutes Beispiel ist auch der Fibonacci-Code im anderen Thread oder eine bei Parsern gängige Technik, in der das aktuell erkannte Token und der Rest des Input-Streams zurückgegeben wird (oder im Falle von Spirit diverse andere Infos). Oder auch die divmod-Funktion (Resultat der Integerdivision und Rest).

    Natürlich kapselt man das normalerweise auf adäquate Weise aber im Prinzip bleibt es dabei, dass man mehrere Rückgabewerte hat.



  • Konrad Rudolph schrieb:

    .filmor schrieb:

    Da wird es so gemacht, aber wird es wirklich benötigt?

    Hmm. Siehst Du Alternativen?

    Also ich muss nicht wissen, ob das Ding schon drin ist oder nicht. Die Intention wird auf beide Arten erfüllt 😉
    (Im Ernst, ich hatte eine andere Bedeutung für das bool-Feld im Sinn).

    Konrad Rudolph schrieb:

    Ein anderes gutes Beispiel ist auch der Fibonacci-Code im anderen Thread oder eine bei Parsern gängige Technik, in der das aktuell erkannte Token und der Rest des Input-Streams zurückgegeben wird (oder im Falle von Spirit diverse andere Infos). Oder auch die divmod-Funktion (Resultat der Integerdivision und Rest).

    Alles "nur" Optimierungen. Aber du hast trotzdem Recht.

    Konrad Rudolph schrieb:

    Natürlich kapselt man das normalerweise auf adäquate Weise aber im Prinzip bleibt es dabei, dass man mehrere Rückgabewerte hat.

    Naja, also wenn auch mathematisch ein Zahlentupel zurückgegeben wird (z.B. bei divmod), bzw. die beiden Werte für sich genommen nutzlos sind, dann kann man IMO nicht von mehreren Rückgabeparametern reden.



  • volkard schrieb:

    templäd schrieb:

    und bei einem Pointer Parameter von der Funktion.

    wozu das denn? lass die kiste doch abschmieren, wenn du strlen(0) berechnen willst. und überhaupt, was sollte denn das ergebnis sein? -1? und was willste bei strcpy(0,"hallo") machen? nix? dann wir der nachste, der die 0 benutzt, das roblem haben. lass den rechner ruhig in die schutzverletzung laufen und gut ist's.

    😮 Ist das ironisch gemeint ?
    Also ich finde es allemal besser, wenn Fehler zur Compilezeit und nicht erst zu Laufzeit auffallen. Gerade irgendwoher fliegende Nullpointerexceptions (am besten noch in einer Mehrschichtenarchitektur) schaffen Arbeitsplätze - weswegen Javaisten diese Philosophie vermutlich so schätzen.... 😉 Ganz zu schweigen davon, dass bei "infrastrukturlastigen" oder "hochverfügbaren" Serveranwendungen die Windowsmaxime "Reboot-tut-gut" nicht immer zutrifft.
    Außerdem ist das Verwenden einer Referenz ein Designstatement, mit dem gerade Designfehler viel schneller auffallen.
    Ich sage mal anders herum: Außer dynamischer Speicherverwaltung und "nullable/variable references" sehe ich gar keinen Grund mehr, Pointer zu verwenden. :p

    Gruß,

    Simon2.



  • GPC schrieb:

    Neku schrieb:

    chrische5 schrieb:

    Also ich mach es auch wie Volkard, weil ich bei Funktion, die ein Parameter ändert dann immer & davorschreiben muss und somit gearnt bin: Aha, die Funktion ändert den Parameter.

    Darum gibt es ja das kleine aber feine Schlüsselwort "const" 😉 Wenn ein "const" vor dem Parameter steht, wird dieser nicht verändert - kann man ja auch gar nicht.

    Wäre ich paranoid oder bösartig, könnte ich das const mit const_cast einfach wegcasten und fröhlich das Objekt verändern :p 😉

    Dagegen hilft der Aufruf mit einem globalen static const (oder direkt "irgendein Text") ... das geht dann auch nicht mehr. 😉

    Gruß,

    Simon2.



  • Konrad Rudolph schrieb:

    Ich kann diesen Grund nicht nachvollziehen. Ich bin der Ansicht: Wenn man eine Funktion aufruft, dann sollte man sowieso unbedingt wissen, was sie tut.

    Wenn Du fremde libs verwendest ...weist du immer was die intern tun? Das bezweifle ich mal ...Du weist vielleicht was sie bewirken bzw. was hinten raus kommen soll...aber wie es intern umgesetzt ist musst du wirklich nicht wissen.


Anmelden zum Antworten