Pointer Reference



  • Hallo zusammen,

    ich habe eine Templatemehtode, die gibt eine Reference zurück:

    T &
            List<T>::get(size_t index)
    

    Normalerweise habe ich List<T> immer mit Typen verwendet. Nun habe ich aber mal nen Pointer reingesteckt, und da kommt logischerweise sowas wie Type*& als Rückgabewert raus. Kann man dies irgendwie fixen? Was macht man den da am besten im Sinne von best practice???

    Danke schonmal. 🙂



  • Pointer sind auch Typen. Was ist das Problem an T*& ?



  • nun, meine erwartungshaltung war, wenn ich ein T* reinstecke, auch ein T* rauszubekommen, statt eines T*&, oder ist dies das selbe?



  • Wenn du einen T* raushaben willst, wieso gibt deine Methode dann eine Referenz zurück?



  • weil es ne standard get methode ist. und die list normalerweise den wert speichern soll. also sowas wie List<Object>. Nun hab ich halt mal List<Object*>, und da ist es mir aufgefallen.



  • sven_ schrieb:

    weil es ne standard get methode ist.

    Was soll das sein?

    und die list normalerweise den wert speichern soll. also sowas wie List<Object>. Nun hab ich halt mal List<Object*>, und da ist es mir aufgefallen.

    Na da ist der Wert halt ein Objekt-Zeiger. Ansonsten hättest du ja nicht List<Object*> geschrieben.



  • Get gibt T& zurück. T = int, Get gibt int& zurück. T = int*, Get gibt int*& zurück. 😕 Wo ist das Problem?^^



  • Hast du denn ein Problem mit der Pointerreferenz?



  • also ich habe mal gelesen, dass ein get auf nen container idealerweise eine reference zurück gibt. da die List<T> für zig typen verwendet wird, hier halt T & get(unsigned int index);

    ich frage mich ja so ein wenig, was den überhaupt ne reference auf nen pointer ist. da doch ne reference eigentlich ne art materialisierter pointer ist. falls ihr mich versteht?



  • genau. pointerreferenze. was muß ich mir da vorstellen drunter??? 😕



  • sven_ schrieb:

    also ich habe mal gelesen, dass ein get auf nen container idealerweise eine reference zurück gibt.

    Ohne Begründung sind solche Weisheiten relativ schwachsinnig. Da du eine non-const Referenz zurückgibst, kannst du z.B. sowas machen:

    mylist.get(blabla) = blub;
    

    Das ist aber nicht "standard get", sondern das will man so oder man will es nicht.

    ich frage mich ja so ein wenig, was den überhaupt ne reference auf nen pointer ist. da doch ne reference eigentlich ne art materialisierter pointer ist.

    Referenzen kann man als eine Art Pointer verstehen. Dann ist es halt ein Pointer auf einen Pointer. Problem?



  • nun,

    die idee mit pointer auf pointer kam mir dann auch, nur frag ich mich, warum dann mein code geht:

    Object* msg = get(i);
    if (msg != NULL){
    msg->foo();
    }
    ...
    

    Wenn get() nun tatsächlich ein Object*& zurückgibt, welches ich als Pointer auf Pointer betrachten soll, dann ist es also ein Object**. Damit dürfte aber msg->foo() nicht mehr gehen. Tuts aber. Oder übersehe ich was.



  • Wenn dir das solche Schwierigkeiten macht, vergiss das mit dem "als Pointer vorstellen".



  • na solche schwierigkeiten machst ja nun direkt nicht. aber ich wills auch nicht einfach so hinnehmen. wenn ich an mein info 1 kurs denke, funktioniert dies schon, wäre, dann aber schweine ineffizient, da es ja quasi nen materialisierter pointer ist, der auf nen pointer zeigt. somit ne doppelte indirektion. nun ist die frage, ob dies so ist. ???



  • Was der Compiler daraus macht kann dir niemand sagen. Kann eine doppelte Indirektion sein, kann eine sein, kann keine sein.



  • naja, dann lass ich es mal so. 🙂 dachte schon, muß das mit irgendwelche type_traits fixen.

    vielen danke an die runde. 🙂


Anmelden zum Antworten