]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/object.h
Better fix
[wxWidgets.git] / include / wx / object.h
index a65117de24aac1e0ba109cccbb8b79c2988c6259..88297d21b859ce038158a2b50996268dfcf02a62 100644 (file)
@@ -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<T>::*unspecified_bool_type)() const;
+    operator unspecified_bool_type() const
+    {
+        return m_ptr ? &wxObjectDataPtr<T>::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) ;