Unterschiede Datentyp* Name und Datentyp Name



  • Okay, das hab ich verstanden.

    In einer Klassendefinition kann ich das jedoch leider noch nicht initialisieren. Das bedeutet, es macht immer Sinn den Standardkonstruktor zu überschreiben und sich um diese Abhandlung zu kümmern?

    class Foo
    {
    private: Karte* map2;
    
    public: Karte(void){
    map = new Karte(); // oder auch 0 für null Pointer?
    }
    };
    

    Muss der Aufruf über new geschehen? Andernfalls geht es nur über ein Objekt und dessen Adresse über den &-Operator bzw. Zeiger = anderer_Zeiger; ?



  • Das kommt auf deinen Konkreten Anwendungsfall an, in den seltensten Fällen wirst du new brauchen. (Übrigens kannst du bei new die () auch weglassen) Je nach Klasse kann es Sinn machen, mit 0 zu initialisieren oder mit einer Adresse eines Objekts.

    Weiters brauchst du das void im Konstruktor nicht, das ist C.



  • 314159265358979 schrieb:

    Wo du den Stern zwischen Karte und map2 schreibst, ist egal.

    Semantisch sind natürlich beide Formen gleichwertig. Allerdings ist die zweite Variante zu bevorzugen. Eine Deklaration besteht unter anderem aus den Teilen declaration-specifier-sequence und init-declarator-list. Hier ist Karte Teil der decl-spec-sequ und *map2 ist einziger declarator der init-decl-list, wobei der * ein operator des declarators ist.

    Anderenfalls würde beispielsweise

    Karte* map2, map3;
    

    suggerieren, dass sowohl map2 als auch map3 Zeiger sind, was aber nicht der Fall ist. Nur map2 ist hier ein Zeiger.

    314159265358979 schrieb:

    Weiters brauchst du das void im Konstruktor nicht, das ist C.

    Nö - das ist völlig in Ordnung nur nicht notwendig, da beim Weglassen implizit void verwendet wird.



  • Dein Einwand ist richtig, ich bevorzuge jedoch erstere Variante, da der * für mich zum Typ gehört. (auch wenn der Standard sagt, dass dem nicht so ist) Mehrere Zeiger in einer Deklaration habe ich bisher nicht benötigt, daher sehe ich auch keinen Grund auf die zweite Variante zu wechseln.

    void als Parameter schreiben empfinde ich als äußerst hässlich.



  • inter2k3 schrieb:

    314159265358979 schrieb:

    Wo du den Stern zwischen Karte und map2 schreibst, ist egal.

    Semantisch sind natürlich beide Formen gleichwertig. Allerdings ist die zweite Variante zu bevorzugen. (...)

    Also das ist mir entschieden zu absolut formuliert.
    Und ich bin auch anderer Meinung.

    Ich schreibe den * immer zum Typ dazu, und nie zum Namen, da es für mich logisch ein Teil des Typs ist.
    Wenn man nie mehrere Variablen gleichzeitig definiert funktioniert das auch wunderbar.
    Und genau so mache ich es.



  • Also muss man beachten dass eine Deklaration von

    Karte* map1,map2
    

    nicht die Deklaration von 2 Pointern auf ein Karte-Objekt ist, sondern map1 ein Pointer und map2 nur ein normales Objekt?

    Das void bin ich von C gewohnt 😉

    Und das mit dem new:

    Würde ich dann nun haben:

    class Foo
    {
    private: Karte* map2;
    
    public: Karte(void){
    map = Karte; // oder auch 0 für null Pointer?
    }
    };
    

    Würde das map auch mit einer Adresse eines gerade frisch angelegten Objektes von Karte beliefern? Ist hier der Unterschied mit dem Erzeugungszeitpunkt zu suchen?



  • Richtig, das erste ist ein Zeiger, das zweite nicht.

    Das void schreibt man in C++ üblicherweise nicht mehr hin, du kannst es machen, wenn du möchtest.

    Es müsste dann Karte() heißen. Beachte: Wenn du ein Objekt auf dem Stack erstellen möchtest, muss es 'Class()' heißen, auf dem Heap kannst du die () weglassen. Ist Geschmackssache, ich mache es ohne.



  • hustbaer schrieb:

    Wenn man nie mehrere Variablen gleichzeitig definiert funktioniert das auch wunderbar.
    Und genau so mache ich es.

    Also bei mir kommt es häufiger vor, dass ich zwei Zeiger gleichzeitig definiere. Ich verwende auch Variante1, aber musste in diesem Fall zu Variante2 greifen. Was schlägst Du in so einem Fall vor? Zwei getrennte Definitionen machen?



  • Eisflamme schrieb:

    hustbaer schrieb:

    Wenn man nie mehrere Variablen gleichzeitig definiert funktioniert das auch wunderbar.
    Und genau so mache ich es.

    Also bei mir kommt es häufiger vor, dass ich zwei Zeiger gleichzeitig definiere. Ich verwende auch Variante1, aber musste in diesem Fall zu Variante2 greifen. Was schlägst Du in so einem Fall vor? Zwei getrennte Definitionen machen?

    Genau.
    Eine Definition pro Zeile. Mache ich überall so, funktioniert wunderbar.
    Und ich mache das nicht nur bei Zeigern oder Referenzen so, sondern immer.

    void foo()
    {
       int x = ...;
       int y = ...;
       int z = x + y + 42;
       // ...
    }
    

    Ich finde das schön klar und übersichtlich. Man muss nicht immer überall die kürzest mögliche Schreibweise wählen.



  • Das ist doch einfach eine Stilfrage. Solange du dabei konsistent handelst ist beides ok.


Anmelden zum Antworten