Pointer: Wann und wozu?



  • Helmut.Jakoby schrieb:

    Pointer auf Objekte haben u.a. den Vorteil, das die Objekte auf dem Heap liegen.

    Du vermischst gerade zwei Konzepte – Zeiger und Speicherverwaltung. Man kann sehr wohl Zeiger haben, ohne Speicher manuell zu verwalten. Das ist auch ein sinnvoller Anwendungszweck von Zeigern. Um Speicherverwaltung wegzukapseln, gibt es RAII (am wichtigsten sind Container und Smart-Pointer).



  • Ich sollte also kein Array von Objekten erzeugen, sondern diese in einem Container erzeugen.

    Ich habe zu den Pointer noch eine Frage: Wenn ich nun eine Klasse definiere und ich z.B. einen... Titel fesetsetzen möchte, so kann die Größe doch variabel sein. Ist es dort sinnvoller einen Pointer zu verwenden oder einfach die Größe beim anlegen durch den Konstruktor festzusetzen?

    EDIT: Bei einem Objekt-Array dann einfach ein Vektor-Container verwenden oder kann man diesen auch typisieren?



  • trax1988 schrieb:

    Ich sollte also kein Array von Objekten erzeugen, sondern diese in einem Container erzeugen.

    Ja.
    Kein Problem, wenn Du dem Buch folgst und anfangs mal Arrays benutzt. Aber spaäter gehts in Richtung std::vector und std::array. Wenn Du das im Hinterkopf hast, ist alles im Lot.

    trax1988 schrieb:

    Ich habe zu den Pointer noch eine Frage: Wenn ich nun eine Klasse definiere und ich z.B. einen... Titel fesetsetzen möchte, so kann die Größe doch variabel sein. Ist es dort sinnvoller einen Pointer zu verwenden oder einfach die Größe beim anlegen durch den Konstruktor festzusetzen?

    Pointer. Also nee, Pointer wäre zwar richtig, aber RAII ist noch wichtiger. Um den Pointer eine Klasse basten, die genau das macht, daß Du nicht mehr selber delete aufrufen mußt. Ach, die gibt's für Titel natürlich auch schon. std::string heißt sie.

    trax1988 schrieb:

    Bei einem Objekt-Array dann einfach ein Vektor-Container verwenden oder kann man diesen auch typisieren?

    vector<DeineKlasse>//gut
    bzw
    vector<DeineKlasse*>//nicht so gut, aber bei Vererbung nötig
    irgendwo gabs für den zweiten Fall sowas wie Pointer-Container, die sind wieder gut.



  • trax1988 schrieb:

    Ich habe zu den Pointer noch eine Frage: Wenn ich nun eine Klasse definiere und ich z.B. einen... Titel fesetsetzen möchte, so kann die Größe doch variabel sein. Ist es dort sinnvoller einen Pointer zu verwenden oder einfach die Größe beim anlegen durch den Konstruktor festzusetzen?

    Wenn ich dich richtig verstehe meinst du sowas:

    Klasse objekt("Titel");
    

    Da nimmst du std::string und damit brauchst du dir keine Gedanken über Länge/Größe zu machen.

    trax1988 schrieb:

    EDIT: Bei einem Objekt-Array dann einfach ein Vector-Container verwenden oder kann man diesen auch typisieren?

    Du musst dem Container schon mitteilen, von welchem Typ er Objekte halten soll.
    Z.B.

    vector<int> ganzzahlen;
    

    edit: Für Zeiger nimmst du dann Smart-Pointer:
    http://www.c-plusplus.net/forum/134971
    http://www.c-plusplus.net/forum/284191?highlight=scopedptr



  • Lybrial schrieb:

    Wenn du z.B. eine Methode hast, die einen Parameter übergeben bekommt, den du verändern möchtest, dann ist dieser Wert nur innerhalb der Funktion gültig, außerhalb nicht.
    Das passiert nicht, wenn der übergebene Parameter ein Pointer ist.

    Nur das man unter C++ hier in der Regel eher Referenzen verwendet (Es sei den der Parameter soll optional sein).



  • Ich danke allen für ihre Antworten. Ihr habt mir damit weitergeholfen. Endlich mal kein Forum, in dem man patzige Antworten zu erwarten hat :D.



  • Pointer haben aber gegenüber Referenzen den Vorteil, dass man nicht ausversehen eine Kopie erzeugen kann.

    Foo& give_foo() { ... }
    Foo myFoo = give_foo(); // Coy-Constructor wird getriggert, unmöglich bei Pointer-Rückgabe.
    


  • Ethon schrieb:

    Pointer haben aber gegenüber Referenzen den Vorteil, dass man nicht ausversehen eine Kopie erzeugen kann.

    Foo& give_foo() { ... }
    Foo myFoo = give_foo(); // Coy-Constructor wird getriggert, unmöglich bei Pointer-Rückgabe.
    

    wenn das die gefahr ist, stimmts woanders nicht.



  • Ethon schrieb:

    Pointer haben aber gegenüber Referenzen den Vorteil, dass man nicht ausversehen eine Kopie erzeugen kann.

    Foo& give_foo() { ... }
    Foo myFoo = give_foo(); // Coy-Constructor wird getriggert, unmöglich bei Pointer-Rückgabe.
    

    Sehe ich als konstruiert an, da man hier ja absichtlich ein neues Objekt anlegt (Zuweisung zu einer Variable eines Typs, nicht einer Referenz). Das kann durchaus beabsichtigt sein. Wenn man keine Kopien will, kann man die Klasse entsprechend designen.

    Ich mag im Gegenzug z.B. Zeigerrückgaben nicht sonderlich, da man nicht sieht, wer für den Speicher verantwortlich ist.



  • asc schrieb:

    Ich mag im Gegenzug z.B. Zeigerrückgaben nicht sonderlich, da man nicht sieht, wer für den Speicher verantwortlich ist.

    Es sei denn, man (oder die benutzte Bibliothek) folgt konsequent der Linie, dass rohe Zeiger nicht besitzend sind.


Anmelden zum Antworten