Ist sowas schlechter Stil?



  • freshman schrieb:

    Obwohl, wenn bla einfach nur Funktion und nicht zur Klasse gehört, darf sie doch eh nix am Objekt verändern, oder?

    Doch, sie darf alles, was am Objekt public ist, benutzen bzw. aufrufen. (Im Beispiel den operator=)



  • habe natürlich nicht soweit gedacht, daß die public Methoden und Operatorfunktionen ja von bla aufgerufen werden können und dann so das Original verändert wird.
    /*freshman.merken(erstZuEndeDenkenDannPosten);*/
    Meine Aussage:

    freshman schrieb:

    Obwohl, wenn bla einfach nur Funktion und nicht zur Klasse gehört, darf sie doch eh nix am Objekt verändern, oder?

    bezog sich nur auf die private-Attr, ohne an oben genanntes zu denken.



  • @freshman:
    angenommen du siehst jetz diesen code

    bla(blubb);
    

    weisst du dann ob blubb verändert wird?
    Antwort: Nein du weisst es nicht, du müsstest dir explicit die Parameter anschaun.
    dagegen wenn der aufruf im quelltext so steht:

    bla(&blubb);
    

    dann siehst du sofort "oho, der ändert was an meiner variable"
    folglich is das ganze mit Zeigern besser lesbar,
    und das es Konstante Referenzen gibt ist mir bewusst tut aber hier nichts zur Sache.
    Und hier kann man das eben nicht mit einer const referenz machen DA die Variable eben verändert wird
    ...



  • d.h. jedesmal, wenn ich einen zeiger an eine funktion übergebe, soll ich annehmen, dass sie das objekt verändert, auf das er zeigt?

    void foo (T const *);
    

    auch da?

    das ist dasselbe in schweinchenrosa.



  • Dafür gibts ja konstante Referenzen...
    das ganze hier sind ja Stil fragen,
    und ich halte _diesen_ Stil wie ich ihn meine für am besten.
    Und der Threadersteller wollte ja genau sowas wissen; Anregungen bzw. Kritik

    und:

    d.h. jedesmal, wenn ich einen zeiger an eine funktion übergebe, soll ich annehmen, dass sie das objekt verändert, auf das er zeigt?

    Das wäre ja wohl ein Optimum oder?
    Und genau so sollte es auch sein...



  • k1ro schrieb:

    Dafür gibts ja konstante Referenzen...

    Erklaer mir mal fix wie ich 0 als konstante Referenz auf Foobar uebergeben kann. Damit tue ich mir immer so schwer.

    d.h. jedesmal, wenn ich einen zeiger an eine funktion übergebe, soll ich annehmen, dass sie das objekt verändert, auf das er zeigt?

    Das wäre ja wohl ein Optimum oder?
    Und genau so sollte es auch sein...

    Ne. Es gibt Zeiger und Referenzen. Und zwischen diesen beiden gibt es einen Unterschied. Wieso sollte ich diesen Unterschied ignorieren und immer nur eins und nie das andere verwenden?

    Ein Zeiger muss ja nicht immer das Objekt aendern, und ich wuesste auch nicht warum das so sein sollte...



  • Ein Zeiger als Parameter muss das Objekt nicht immer verändern.
    Aber wenn ich bei einer Klasse, die ich normal nicht mit Zeigern anspreche-z.B. std::string-, einen Zeiger als Parameter verlange, wird man sicherlich mißtrauisch!
    Eine Referenz sieht beim Funktionsauf dagegen eher nach einem Input-Paramter aus, der nicht verändert wird (man sieht ja beim Aufruf nicht, daß der Parameter nicht konstant ist)



  • @k1ro:
    Allgemein denkt man bei einem Zeiger als Argument, dass man hier auch 0 übergeben kann. Genau dafür werden Zeiger als Argument in der Regel verwendet.



  • Ja, das mit der 0 Stimmt auf jeden Fall.
    Aber ansonsten werdet ihr mir ja wohl recht geben, mir geht es v.a. um Lesbarkeit ...

    Immerhin teilt Zeigermeister die gleiche Einstellung mit mir, dann bin ich schonmal nich so ganz verloren 😉 ^^



  • Ich hab schon oft gehört dass das die Lesbarkeit erhöhen soll aber irgendwie find ich

    swap(a,b);
    

    einfach besser als:

    swap(&a,&b);
    


  • Wenn man Argumentanzeigen hat wie Visual Studio oder ansatzweise kdevelop dann ist die frage überflüssig, da dann ein const unveränderlichkeit anzeigt. In dem Fall ist es nur dann guter stil, wenn man für alles referenzen nimmt.
    Wenn man eine solche praktische funktion nicht hat, ist dies aber trotzdem kein Grund dann stattdessen einen pointer zu nehmen. In C++ ist das schlechter stil und es ist natürlich auch riskanter. Man sollte sich nicht umbringen nur um zu erreichen das bei einer funktion sofort sichtbar ist, ob sie was verändert. Wenn man eine Funktion benutzt, sollte man so oder so ihren Zweck kennen und wissen, ob sie was verändert oder nicht.

    Die Übergabe an Zeiger mit 0 könnte man umgehen, indem man

    1. Das Design ändert und vermeidet, nullen irgendwo mitten in der Argumentliste zu übergeben (was zugegebenermaßen nicht immer mögl ist) oder
    2. Was auch das Design betrifft: Die Argumentliste so zu gestalten, dass jene Argumente, die nicht zwingend übergeben werden müssen, als letzte angibt und mit Standartwerten intialisiert.

    Ich lehne pointer nicht völligst ab, aber wo es geht sollte man doch referenzen benutzen und wenn nötig, auf dieses Ziel umdesignen. Einfach um diese ewigen Pointer-Probleme zu vermeiden.



  • randa schrieb:

    WIn dem Fall ist es nur dann guter stil, wenn man für alles referenzen nimmt.

    Nein!
    Zeiger sind etwas anderes als Referenzen. Die sind UNTERSCHIEDLICH. Du kannst nicht eins durch das andere Ersetzen.

    Die Übergabe an Zeiger mit 0 könnte man umgehen, indem man

    Blödsinn, sowas will man auch nicht.

    1. Das Design ändert und vermeidet, nullen irgendwo mitten in der Argumentliste zu übergeben (was zugegebenermaßen nicht immer mögl ist) oder

    OK, dann erklär mir mal wie ich einen ungültigen Wert per Referenz übergebe.
    Es geht nicht. Wie soll ich da das Design ändern?

    1. Was auch das Design betrifft: Die Argumentliste so zu gestalten, dass jene Argumente, die nicht zwingend übergeben werden müssen, als letzte angibt und mit Standartwerten intialisiert.

    Welchen Standardwert hat denn eine const Referenz? Eine sinnlose Default Objekt Konstruktion?

    Yeah, das verbessert den Code ungemein...

    Ich lehne pointer nicht völligst ab, aber wo es geht sollte man doch referenzen benutzen und wenn nötig, auf dieses Ziel umdesignen. Einfach um diese ewigen Pointer-Probleme zu vermeiden.

    Du hast Zeiger einfach nicht kapiert - das wird es sein.
    Zeigerprobleme? Das einzige Problem dass man bei Zeigern hat, ist dass 'rumzeigen'. Aber wer braucht das schon?

    Man kann Zeiger auch wunderschön verwenden ohne nur annähernd ein Risiko einzugehen.

    Abgesehen davon braucht man Zeiger. Schau dir Java an, dort gibt es Null Referenzen. Warum? Weil du einfach ab und zu einen NULL Wert brauchst. Und das geht mit C++ Referenzen nicht. Da kannst du nix rumdesignen (OK, können schon, es ist aber nicht sinnvoll).



  • Shade: Kennst du das Null Object Pattern?



  • Kennst du das Null Object Pattern?

    Moment, war das nicht so ein Message eating Ding, also etwas, was auf eine Anfrage hin einfach nichts zut, so wie Objective-Cs nil?
    Jaja, könnte selbst googlen, bin aber grad zu faul.



  • @Shade of mine: Allein schon die art wie do den text zerpflückst zeugt von einer hohen (aber unbegründeten) aggresivität. Muss man für so ne scheiße denn streiten oder den ton erhöhen? Wenn einer schon bei so nem schwachsinn in die Luft springt.

    Shade of Mine schrieb:

    Zeigerprobleme? Das einzige Problem dass man bei Zeigern hat, ist dass 'rumzeigen'. Aber wer braucht das schon?

    Das ist jetzt aber wirklich schwachsinn. Laber nicht.

    Außerdem hats du mich nicht richtig verstanden, undzwar aus dem einfachen grund, weil ich alles, was ich über zeiger gesagt habe nur die Argumente betrifft. Ich habe doch nicht davon geredet, auf Zeiger völligst zu verzichten (was selbstverständlich schwachsinn ist).

    Zu deiner letzten Aussage: ich halte es schon für sinnvoll. Referenzen gibts nicht aus Spass an der Freud, sondern weil sie mehr sicherheit geben. Das nutze ich aus wo es geht.

    Zu den ungültigen Werten: Wenn das default ein ungültiger Wert ist, kann man das benutzen (z.B. Zeiger in einer Klasse, die dann durch die Standadkonstruktion 0 wären). Ansonsten muss man natürlich einen Zeiger nehmen.
    Das kann man aber eben doch manchmal vermeiden.

    Und wenn du wieder vor Wut kochst, zähl von 10 bis 0 runter und poste danach. 😉
    Ich mag einfach keine stressigen diskussionen.


Anmelden zum Antworten