operator smartpoint



  • Bsp

    // class for acquiring and releasing a window handle
    class WindowHandle {
    public:
       WindowHandle(WINDOW_HANDLE handle): w(handle) {}
      ~WindowHandle() { destroyWindow(w); }
    
       operator WINDOW_HANDLE() { return w; }        
    
    private:
      WINDOW_HANDLE w;
    
      // The following functions are declared private to prevent
      // multiple copies of a WINDOW_HANDLE from being created.
      // See Item 28 for a discussion of a more flexible approach.
      WindowHandle(const WindowHandle&);
      WindowHandle& operator=(const WindowHandle&);
    };
    
    // this function avoids leaking resources if an
    // exception is thrown
    void displayInfo(const Information& info)
    {
      WindowHandle w(createWindow());
    
      display info in window corresponding to w;
    
    }
    

    hier, was ist das? wo ist die Methode aufgerufen?

    operator WINDOW_HANDLE() { return w; }
    


  • Wenn jemand so etwas tut:

    WindowHandle myHandle;
    
    /* ... */
    
    WINDOW_HANDLE w = myHandle;
    
    WindowHandle *myHandle = new WindowHandle();
    
    /* ... */
    
    WINDOW_HANDLE w = *myHandle;
    

    In beiden Fällen wird der Typ WindowHandle als Typ WINDOW_HANDLE benutzt. Dabei springt der operator WINDOW_HANDLE (sog. Cast-Operator) an und gibt den entsprechenden Wert zurück.



  • damit kann man einen DownCast "vermeiden"? indem man die cast-operation in Base verschiebt?



  • Was hat das mit Downcast zu tun?

    In dem Beispiel wird eine Klasse (WindowHandle) zu einem Typ (WINDOW_HANDLE, vermutlich ein Typedef für irgendeinen Long-Wert) gecastet. Da der Compiler das ohne operator nicht kann, wird einer definiert.

    Das hat also mehr was mit Konvertierungen zu tun. Ich könnte der Klasse std::string z.B. einen "operator const char*" verpassen, dann kann ich das Objekt vom Typ std::string direkt als Dateiname beim ifstream verwenden. Ohne "operator const char*" muss man dort .c_str() benutzen.

    EDIT:
    Wenn Du Deiner Basisklasse gerne mehrere "operator AbgeleiteteKlasse*" spenden möchtest, klar, damit kann man auch Downcasts verlagern.



  • kannst du mir noch ein Beispiel nennen?



  • Das beste Beispiel sind wirklich Wrapper-Klassen um irgendwelche C-Datentypen, die möglichst problemlos anstelle des gewrappten Datentyps eingesetzt werden wollen MFC's CString hat einen operator char*()(1), so daß man CString-Objekte an Funktionen weitergeben kann, die mit char-Arrays operieren können (std::string hat aus Design-Gründen keinen), Dialogelement-Klassen können einen operator HANDLE() für den Einsatz mit C WinAPI-Funktionen bereitstellen etc.

    (ein Beispiel gibt es auch in der STL - iostreams haben einen operator void*(), damit Konstrukte ala "while(fin>>zahl)..." möglich werden.

    (1) genau genommen hat CString einen operator TCHAR*() - das ist je nach Projekteinstellungen entweder char* oder wchar_t*


Anmelden zum Antworten