Funktions Zeiger



  • Gugelmoser schrieb:

    cooky451 schrieb:

    Getter, Suchfunktionen o.ä. -> Pointer.

    Du gibst einen Zeiger auf das Attribut bei Getter zurück? Oder wie meinst du das?

    Wenn das Attribut optional ist und keinen "Nullzustand" hat, natürlich. Wie auch sonst? 😉

    CppZgr schrieb:

    Meintest du das so mit der Referenz?
    Weil da ist doch jetzt kein unterschied beide Funktionen sind intern gleich.

    Ein Pointer würde Sinn machen, wenn man noch nicht genau wüsste ob das Objekt auch existiert. Aber bei globalen oder statischen Variablen kann man sich ziemlich sicher sein, dass die da sind. Daher Referenzen.



  • @Videonauth: GCC unter Linux
    Compile:

    22:15: Fehler: »system« wurde in diesem Gültigkeitsbereich nicht definiert [Habe ich rausgemacht
    
    6:5: Warnung: »c« wird in dieser Funktion uninitialisiert verwendet [-Wuninitialized]
    

    Ausführen:

    Speicherzugriffsfehler
    

    EDIT:
    Außerdem (zu den Gettern): Mit Pointern kann man "erwingen" (zumindestens besser als mit Referenzen) das wirklich mit dem Pointer gearbeitet wird. Bei Referenzen:

    #include <iostream>
    
    class X {
      private:
        int i;
      public:
        void setI(int i) { this->i=i; }
        int& getIRef() { return i; }
        int* getIPtr() { return &i; }
    };
    
    int main() {
      X myX;
      myX.setI(5);
      int *ptr = myX.getIPtr();
      *ptr = 6; // myX.i wird direkt bearbeitet.
      int cpy = myX.getIRef(); // myX.i wird kopiert!
      int &ref = myX.getIRef(); // so wäre es richtig. 
      cpy = 7;
      std::cout << myX.getIRef() << std::endl;
      std::cout << cpy << std::endl;
      std::cout << ref << std::endl;
      std::cout << *ptr << std::endl;
    }
    


  • pyhax schrieb:

    @Videonauth: GCC unter Linux
    Compile:

    22:15: Fehler: »system« wurde in diesem Gültigkeitsbereich nicht definiert [Habe ich rausgemacht
    
    6:5: Warnung: »c« wird in dieser Funktion uninitialisiert verwendet [-Wuninitialized]
    

    Ausführen:

    Speicherzugriffsfehler
    

    Ooooops ja das mach Booh Booh stimmt, müsste dann so aussehen

    #include <iostream>
    using namespace std;
    
    void f (int* ptr)
    {
        *ptr=8;
    }
    
    int main()
    {
    int a;
    int b;
    int* c = &b;
    
    f(&a); // mit referenz
    f(c); // mit zeiger
    
    cout<<"Ausgabe: "<< a << endl;
    cout<<"Ausgabe: "<< b << endl;
    
    system("PAUSE");
    return 0;
    }
    

    Schreib das grade alles so, ohne IDE im Hintergrund oder Zugriff auf compiler.



  • Irgendwie Blick ich da nicht durch.

    Ob ich es jetzt so mache

    int glob;
    
    int &f ( )  // Mit Referenz 
    { 
     glob = 8; 
     return glob; 
    }
    

    oder so:

    int glob_2
    
    int *f_2 ( )  // Mit Zeiger
    {
    glob_2 = 1;
    return &glob_2; 
    }
    

    Das ist doch intern beides das gleiche.

    😕



  • nein. Ein Pointer kann NULL sein, eine Referenz dagegen nicht.



  • cooky451 schrieb:

    Gugelmoser schrieb:

    cooky451 schrieb:

    Getter, Suchfunktionen o.ä. -> Pointer.

    Du gibst einen Zeiger auf das Attribut bei Getter zurück? Oder wie meinst du das?

    Wenn das Attribut optional ist und keinen "Nullzustand" hat, natürlich. Wie auch sonst? 😉

    Und wieso keine Referenz? Das Attribut gibt es doch mit ziemlicher Sicherheit.

    CppZgr schrieb:

    [...]

    Klar, mit beiden Dingen erreichst du dein Ziel. Nichtsdestotrotz sind es zwei völlig verschiedene Typen.



  • Gugelmoser schrieb:

    Und wieso keine Referenz? Das Attribut gibt es doch mit ziemlicher Sicherheit.

    Hä? Ne, eben nicht, es ist optional.

    class a
    {
      std::unique_ptr<b> b_;
    public:
      a(bool has)
        : b_(has ? make_unique<b>() : nullptr)
      {}
      const b* get_b()
      {
        return b_.get();
      }
    };
    


  • daddy_felix schrieb:

    nein. Ein Pointer kann NULL sein, eine Referenz dagegen nicht.

    Was ich sagen wollte war das es ja egal ist ob ich es sowie in Bsp. 1 oder sowie in Bsp. 2 mache, da mein Compiler aus beidem intern das gleiche zusammenfrickelt.

    Bsp. 1

    int glob; 
    
    int &f ( )  // Mit Referenz 
     { 
      glob = 8; 
      return glob; 
     }
    

    Bsp. 2

    int glob_2
    
    int *f_2 ( )  // Mit Zeiger
    {
    glob_2 = 1;
    return &glob_2; 
    }
    


  • was der Compiler daraus macht, ist egal. Es geht um die Anwender deines Codes und um die Möglichkeit, dass die Funktion bei einem Pointer eben auch NULL zurückliefern kann. Somit ist eine zusätzliche Fehlerbehandlung notwendig. Man hat aber die Möglichkeit gewonnen, ein "Fehlschlagen" der Funktion ohne Exceptions zu signalisieren.



  • CppZgr schrieb:

    Was ich sagen wollte war das es ja egal ist ob ich es sowie in Bsp. 1 oder sowie in Bsp. 2 mache, da mein Compiler aus beidem intern das gleiche zusammenfrickelt.

    Ja. Wie wärs wenn du dann noch auf Schleifen verzichtest und nur noch goto nimmst, ist doch egal, der Compiler frickelt das Gleiche zusammen. 🙄


Anmelden zum Antworten