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*