X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c1e10a22b6a2f859d23024bdb57f84665f66f89e..f8b1df0b15f843b8f47efb9bee38f1de0fa95020:/include/wx/object.h?ds=sidebyside diff --git a/include/wx/object.h b/include/wx/object.h index a65117de24..88297d21b8 100644 --- a/include/wx/object.h +++ b/include/wx/object.h @@ -19,8 +19,8 @@ #include "wx/memory.h" -class WXDLLIMPEXP_BASE wxObject; -class WXDLLIMPEXP_BASE wxString; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxString; #ifndef wxUSE_EXTENDED_RTTI #define wxUSE_EXTENDED_RTTI 0 @@ -65,12 +65,12 @@ class WXDLLIMPEXP_BASE wxString; // conditional compilation // ---------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxClassInfo; -class WXDLLIMPEXP_BASE wxHashTable; -class WXDLLIMPEXP_BASE wxObject; -class WXDLLIMPEXP_BASE wxPluginLibrary; -class WXDLLIMPEXP_BASE wxObjectRefData; -class WXDLLIMPEXP_BASE wxHashTable_Node; +class WXDLLIMPEXP_FWD_BASE wxClassInfo; +class WXDLLIMPEXP_FWD_BASE wxHashTable; +class WXDLLIMPEXP_FWD_BASE wxObject; +class WXDLLIMPEXP_FWD_BASE wxPluginLibrary; +class WXDLLIMPEXP_FWD_BASE wxObjectRefData; +class WXDLLIMPEXP_FWD_BASE wxHashTable_Node; // ---------------------------------------------------------------------------- // wxClassInfo @@ -80,7 +80,7 @@ typedef wxObject *(*wxObjectConstructorFn)(void); class WXDLLIMPEXP_BASE wxClassInfo { - friend class WXDLLIMPEXP_BASE wxObject; + friend class WXDLLIMPEXP_FWD_BASE wxObject; friend WXDLLIMPEXP_BASE wxObject *wxCreateDynamicObject(const wxString& name); public: wxClassInfo( const wxChar *className, @@ -408,7 +408,7 @@ inline void* wxCheckCast(void *ptr) class WXDLLIMPEXP_BASE wxObjectRefData { - friend class WXDLLIMPEXP_BASE wxObject; + friend class WXDLLIMPEXP_FWD_BASE wxObject; public: wxObjectRefData() : m_count(1) { } @@ -456,7 +456,26 @@ public: } T *get() const { return m_ptr; } - T *operator->() const { return get(); } + + // test for pointer validity: defining conversion to unspecified_bool_type + // and not more obvious bool to avoid implicit conversions to integer types + typedef T *(wxObjectDataPtr::*unspecified_bool_type)() const; + operator unspecified_bool_type() const + { + return m_ptr ? &wxObjectDataPtr::get : NULL; + } + + T& operator*() const + { + wxASSERT(m_ptr != NULL); + return *(m_ptr); + } + + T *operator->() const + { + wxASSERT(m_ptr != NULL); + return get(); + } void reset(T *ptr) { @@ -480,8 +499,6 @@ public: if (m_ptr) m_ptr->DecRef(); m_ptr = ptr; - if (m_ptr) - m_ptr->IncRef(); return *this; } @@ -594,7 +611,7 @@ inline wxObject *wxCheckDynamicCast(wxObject *obj, wxClassInfo *classInfo) #if wxUSE_EXTENDED_RTTI class WXDLLIMPEXP_BASE wxDynamicObject : public wxObject { - friend class WXDLLIMPEXP_BASE wxDynamicClassInfo ; + friend class WXDLLIMPEXP_FWD_BASE wxDynamicClassInfo ; public: // instantiates this object with an instance of its superclass wxDynamicObject(wxObject* superClassInstance, const wxDynamicClassInfo *info) ;