]>
git.saurik.com Git - wxWidgets.git/blob - interface/wx/object.h
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     interface of wxObjectRefData 
   4 // Author:      wxWidgets team 
   6 // Licence:     wxWindows license 
   7 ///////////////////////////////////////////////////////////////////////////// 
  10     @class wxObjectRefData 
  12     This class is used to store reference-counted data. 
  14     Derive classes from this to store your own data. When retrieving information 
  15     from a wxObject's reference data, you will need to cast to your own derived class. 
  22     class MyCar: public wxObject 
  28         bool IsOk() const { return m_refData != NULL; } 
  30         bool operator == ( const MyCar& car ) const; 
  31         bool operator != (const MyCar& car) const { return !(*this == car); } 
  33         void SetPrice( int price ); 
  37         virtual wxObjectRefData *CreateRefData() const; 
  38         virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const; 
  40         DECLARE_DYNAMIC_CLASS(MyCar) 
  46     class MyCarRefData: public wxObjectRefData 
  54         MyCarRefData( const MyCarRefData& data ) 
  57             m_price = data.m_price; 
  60         bool operator == (const MyCarRefData& data) const 
  62             return m_price == data.m_price; 
  69     #define M_CARDATA ((MyCarRefData *)m_refData) 
  71     IMPLEMENT_DYNAMIC_CLASS(MyCar,wxObject) 
  73     MyCar::MyCar( int price ) 
  75         m_refData = new MyCarRefData(); 
  76         M_CARDATA->m_price = price; 
  79     wxObjectRefData *MyCar::CreateRefData() const 
  81         return new MyCarRefData; 
  84     wxObjectRefData *MyCar::CloneRefData(const wxObjectRefData *data) const 
  86         return new MyCarRefData(*(MyCarRefData *)data); 
  89     bool MyCar::operator == ( const MyCar& car ) const 
  91         if (m_refData == car.m_refData) return true; 
  93         if (!m_refData || !car.m_refData) return false; 
  95         return ( *(MyCarRefData*)m_refData == *(MyCarRefData*)car.m_refData ); 
  98     void MyCar::SetPrice( int price ) 
 102         M_CARDATA->m_price = price; 
 105     int MyCar::GetPrice() const 
 107         wxCHECK_MSG( IsOk(), -1, "invalid car" ); 
 109         return (M_CARDATA->m_price); 
 117     @see wxObject, wxObjectDataPtr<T>, @ref overview_refcount 
 119 class wxObjectRefData
 
 125         It's declared @c protected so that wxObjectRefData instances 
 126         will never be destroyed directly but only as result of a DecRef() call. 
 128     virtual ~wxObjectRefData(); 
 132         Default constructor. Initialises the internal reference count to 1. 
 137         Decrements the reference count associated with this shared data and, if 
 138         it reaches zero, destroys this instance of wxObjectRefData releasing its 
 141         Please note that after calling this function, the caller should 
 142         absolutely avoid to use the pointer to this instance since it may not be 
 148         Returns the reference count associated with this shared data. 
 150         When this goes to zero during a DecRef() call, the object will auto-free itself. 
 152     int GetRefCount() const; 
 155         Increments the reference count associated with this shared data. 
 165     This is the root class of many of the wxWidgets classes. 
 167     It declares a virtual destructor which ensures that destructors get called 
 168     for all derived class objects where necessary. 
 170     wxObject is the hub of a dynamic object creation scheme, enabling a program 
 171     to create instances of a class only knowing its string class name, and to 
 172     query the class hierarchy. 
 174     The class contains optional debugging versions of @b new and @b delete, which 
 175     can help trace memory allocation and deallocation problems. 
 177     wxObject can be used to implement @ref overview_refcount "reference counted" 
 178     objects, such as wxPen, wxBitmap and others 
 179     (see @ref overview_refcount_list "this list"). 
 184     @see wxClassInfo, @ref overview_debugging, wxObjectRefData 
 195     wxObject(const wxObject
& other
); 
 201         Performs dereferencing, for those objects that use reference counting. 
 206         This virtual function is redefined for every class that requires run-time 
 207         type information, when using the ::DECLARE_CLASS macro (or similar). 
 209     virtual wxClassInfo
* GetClassInfo() const; 
 212         Returns the wxObject::m_refData pointer, i.e. the data referenced by this object. 
 214         @see Ref(), UnRef(), wxObject::m_refData, SetRefData(), wxObjectRefData 
 216     wxObjectRefData
* GetRefData() const; 
 219         Determines whether this class is a subclass of (or the same class as) 
 225         bool tmp = obj->IsKindOf(CLASSINFO(wxFrame)); 
 229             A pointer to a class information object, which may be obtained 
 230             by using the ::CLASSINFO macro. 
 232         @return @true if the class represented by info is the same class as this 
 233                  one or is derived from it. 
 235     bool IsKindOf(const wxClassInfo
* info
) const; 
 238         Returns @true if this object has the same data pointer as @a obj. 
 240         Notice that @true is returned if the data pointers are @NULL in both objects. 
 242         This function only does a @e shallow comparison, i.e. it doesn't compare 
 243         the objects pointed to by the data pointers of these objects. 
 245         @see @ref overview_refcount 
 247     bool IsSameAs(const wxObject
& obj
) const; 
 250         Makes this object refer to the data in @a clone. 
 253             The object to 'clone'. 
 255         @remarks First this function calls UnRef() on itself to decrement 
 256                  (and perhaps free) the data it is currently referring to. 
 257                  It then sets its own wxObject::m_refData to point to that of @a clone, 
 258                  and increments the reference count inside the data. 
 260         @see UnRef(), SetRefData(), GetRefData(), wxObjectRefData 
 262     void Ref(const wxObject
& clone
); 
 265         Sets the wxObject::m_refData pointer. 
 267         @see Ref(), UnRef(), GetRefData(), wxObjectRefData 
 269     void SetRefData(wxObjectRefData
* data
); 
 272         Decrements the reference count in the associated data, and if it is zero, 
 275         The wxObject::m_refData member is set to @NULL. 
 277         @see Ref(), SetRefData(), GetRefData(), wxObjectRefData 
 282         Ensure that this object's data is not shared with any other object. 
 284         If we have no data, it is created using CreateRefData() below, 
 285         if we have shared data, it is copied using CloneRefData(), 
 286         otherwise nothing is done. 
 291         The @e delete operator is defined for debugging versions of the library only, 
 292         when the identifier @c __WXDEBUG__ is defined. 
 294         It takes over memory deallocation, allowing wxDebugContext operations. 
 296     void operator delete(void *buf
); 
 299         The @e new operator is defined for debugging versions of the library only, when 
 300         the identifier @c __WXDEBUG__ is defined. 
 302         It takes over memory allocation, allowing wxDebugContext operations. 
 304     void* operator new(size_t size
, const wxString
& filename 
= NULL
, int lineNum 
= 0); 
 309         Pointer to an object which is the object's reference-counted data. 
 311         @see Ref(), UnRef(), SetRefData(), GetRefData(), wxObjectRefData 
 313     wxObjectRefData
*  m_refData
; 
 321     This class stores meta-information about classes. 
 323     Instances of this class are not generally defined directly by an application, 
 324     but indirectly through use of macros such as ::DECLARE_DYNAMIC_CLASS and 
 325     ::IMPLEMENT_DYNAMIC_CLASS. 
 330     @see @ref overview_rtti_classinfo, wxObject 
 336         Constructs a wxClassInfo object. 
 338         The supplied macros implicitly construct objects of this class, so there is no 
 339         need to create such objects explicitly in an application. 
 341     wxClassInfo(const wxChar
* className
, 
 342                 const wxClassInfo
* baseClass1
, 
 343                 const wxClassInfo
* baseClass2
, 
 344                 int size
, wxObjectConstructorFn fn
); 
 347         Creates an object of the appropriate kind. 
 349         @return @NULL if the class has not been declared dynamically creatable 
 350                  (typically, this happens for abstract classes). 
 352     wxObject
* CreateObject() const; 
 355         Finds the wxClassInfo object for a class with the given @a name. 
 357     static wxClassInfo
* FindClass(wxChar
* name
); 
 360         Returns the name of the first base class (@NULL if none). 
 362     const wxChar
* GetBaseClassName1() const; 
 365         Returns the name of the second base class (@NULL if none). 
 367     const wxChar
* GetBaseClassName2() const; 
 370         Returns the string form of the class name. 
 372     const wxChar
* GetClassName() const; 
 375         Returns the size of the class. 
 380         Initializes pointers in the wxClassInfo objects for fast execution of IsKindOf(). 
 381         Called in base wxWidgets library initialization. 
 383     static void InitializeClasses(); 
 386         Returns @true if this class info can create objects of the associated class. 
 388     bool IsDynamic() const; 
 391         Returns @true if this class is a kind of (inherits from) the given class. 
 393     bool IsKindOf(const wxClassInfo
* info
) const; 
 400     This is helper template class primarily written to avoid memory leaks because of 
 401     missing calls to wxObjectRefData::DecRef(). 
 403     Despite the name this template can actually be used as a smart pointer for any 
 404     class implementing the reference counting interface which only consists of the two 
 405     methods @b T::IncRef() and @b T::DecRef(). 
 407     The difference to wxSharedPtr<T> is that wxObjectDataPtr<T> relies on the reference 
 408     counting to be in the class pointed to where instead wxSharedPtr<T> implements the 
 409     reference counting itself. 
 415     class MyCarRefData: public wxObjectRefData 
 418         MyCarRefData()  { m_price = 0; } 
 420         MyCarRefData( const MyCarRefData& data ) 
 423             m_price = data.m_price; 
 426         void SetPrice( int price )  { m_price = price; } 
 427         int GetPrice()              { return m_price; } 
 436         MyCar( int price ) : m_data( new MyCarRefData ) 
 438             m_data->SetPrice( price ); 
 441         MyCar& operator =( const MyCar& tocopy ) 
 443             m_data = tocopy.m_data; 
 447         bool operator == ( const MyCar& other ) const 
 449             if (m_data.get() == other.m_data.get()) return true; 
 450             return (m_data->GetPrice() == other.m_data->GetPrice()); 
 453         void SetPrice( int price ) 
 456            m_data->SetPrice( price ); 
 461            return m_data->GetPrice(); 
 464         wxObjectDataPtr<MyCarRefData> m_data; 
 469             if (m_data->GetRefCount() == 1) 
 472             m_data.reset( new MyCarRefData( *m_data ) ); 
 479     @category{rtti,smartpointers} 
 481     @see wxObject, wxObjectRefData, @ref overview_refcount, wxSharedPtr<T>, 
 482          wxScopedPtr<T>, wxWeakRef<T> 
 484 class wxObjectDataPtr
<T
> 
 490         @a ptr is a pointer to the reference counted object to which this class points. 
 491         If @a ptr is not NULL @b T::IncRef() will be called on the object. 
 493     wxObjectDataPtr
<T
>(T
* ptr 
= NULL
); 
 496         This copy constructor increases the count of the reference counted object to 
 497         which @a tocopy points and then this class will point to, as well. 
 499     wxObjectDataPtr
<T
>(const wxObjectDataPtr
<T
>& tocopy
); 
 503         Decreases the reference count of the object to which this class points. 
 505     ~wxObjectDataPtr
<T
>(); 
 508         Gets a pointer to the reference counted object to which this class points. 
 513         Reset this class to ptr which points to a reference counted object and 
 514         calls T::DecRef() on the previously owned object. 
 519         Conversion to a boolean expression (in a variant which is not 
 520         convertable to anything but a boolean expression). 
 522         If this class contains a valid pointer it will return @true, if it contains 
 523         a @NULL pointer it will return @false. 
 525     operator unspecified_bool_type() const; 
 528         Returns a reference to the object. 
 530         If the internal pointer is @NULL this method will cause an assert in debug mode. 
 532     T
& operator*() const; 
 535         Returns a pointer to the reference counted object to which this class points. 
 537         If this the internal pointer is @NULL, this method will assert in debug mode. 
 539     T
* operator->() const; 
 545     wxObjectDataPtr
<T
>& operator=(const wxObjectDataPtr
<T
>& tocopy
); 
 546     wxObjectDataPtr
<T
>& operator=(T
* ptr
); 
 552 // ============================================================================ 
 553 // Global functions/macros 
 554 // ============================================================================ 
 556 /** @ingroup group_funcmacro_rtti */ 
 560     Returns a pointer to the wxClassInfo object associated with this class. 
 564 #define CLASSINFO( className ) 
 567     Used inside a class declaration to declare that the class should be made 
 568     known to the class hierarchy, but objects of this class cannot be created 
 569     dynamically. The same as DECLARE_ABSTRACT_CLASS(). 
 573 #define DECLARE_CLASS( className ) 
 576     Used inside a class declaration to declare that the class should be 
 577     made known to the class hierarchy, but objects of this class cannot be created 
 578     dynamically. The same as DECLARE_CLASS(). 
 585     class wxCommand: public wxObject 
 587         DECLARE_ABSTRACT_CLASS(wxCommand) 
 596 #define DECLARE_ABSTRACT_CLASS( className ) 
 599     Used inside a class declaration to make the class known to wxWidgets RTTI 
 600     system and also declare that the objects of this class should be 
 601     dynamically creatable from run-time type information. Notice that this 
 602     implies that the class should have a default constructor, if this is not 
 603     the case consider using DECLARE_CLASS(). 
 610     class wxFrame: public wxWindow 
 612     DECLARE_DYNAMIC_CLASS(wxFrame) 
 615         const wxString& frameTitle; 
 621 #define DECLARE_DYNAMIC_CLASS( className ) 
 624     Used in a C++ implementation file to complete the declaration of a class 
 625     that has run-time type information. The same as IMPLEMENT_ABSTRACT_CLASS(). 
 629 #define IMPLEMENT_CLASS( className, baseClassName ) 
 632     Used in a C++ implementation file to complete the declaration of a class 
 633     that has run-time type information and two base classes. The same as 
 634     IMPLEMENT_ABSTRACT_CLASS2(). 
 638 #define IMPLEMENT_CLASS2( className, baseClassName1, baseClassName2 ) 
 641     Used in a C++ implementation file to complete the declaration of a class 
 642     that has run-time type information. The same as IMPLEMENT_CLASS(). 
 649     IMPLEMENT_ABSTRACT_CLASS(wxCommand, wxObject) 
 651     wxCommand::wxCommand(void) 
 657 #define IMPLEMENT_ABSTRACT_CLASS( className, baseClassName ) 
 660     Used in a C++ implementation file to complete the declaration of a class 
 661     that has run-time type information and two base classes. The same as 
 666 #define IMPLEMENT_ABSTRACT_CLASS2( className, baseClassName1, baseClassName2 ) 
 669     Used in a C++ implementation file to complete the declaration of a class 
 670     that has run-time type information, and whose instances can be created 
 678     IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) 
 680     wxFrame::wxFrame(void) 
 686 #define IMPLEMENT_DYNAMIC_CLASS( className, baseClassName ) 
 689     Used in a C++ implementation file to complete the declaration of a class 
 690     that has run-time type information, and whose instances can be created 
 691     dynamically. Use this for classes derived from two base classes. 
 695 #define IMPLEMENT_DYNAMIC_CLASS2( className, baseClassName1, baseClassName2 ) 
 698     Same as @c const_cast<T>(x) if the compiler supports const cast or @c (T)x for 
 699     old compilers. Unlike wxConstCast(), the cast it to the type @c T and not to 
 700     <tt>T *</tt> and also the order of arguments is the same as for the standard cast. 
 704     @see wx_reinterpret_cast(), wx_static_cast() 
 706 #define wx_const_cast(T, x) 
 709     Same as @c reinterpret_cast<T>(x) if the compiler supports reinterpret cast or 
 710     @c (T)x for old compilers. 
 714     @see wx_const_cast(), wx_static_cast() 
 716 #define wx_reinterpret_cast(T, x) 
 719     Same as @c static_cast<T>(x) if the compiler supports static cast or @c (T)x for 
 720     old compilers. Unlike wxStaticCast(), there are no checks being done and 
 721     the meaning of the macro arguments is exactly the same as for the standard 
 722     static cast, i.e. @a T is the full type name and star is not appended to it. 
 726     @see wx_const_cast(), wx_reinterpret_cast(), wx_truncate_cast() 
 728 #define wx_static_cast(T, x) 
 731     This case doesn’t correspond to any standard cast but exists solely to make 
 732     casts which possibly result in a truncation of an integer value more 
 737 #define wx_truncate_cast(T, x) 
 740     This macro expands into <tt>const_cast<classname *>(ptr)</tt> if the compiler 
 741     supports const_cast or into an old, C-style cast, otherwise. 
 745     @see wx_const_cast(), wxDynamicCast(), wxStaticCast() 
 747 #define wxConstCast( ptr, classname ) 
 750     This macro returns the pointer @e ptr cast to the type @e classname * if 
 751     the pointer is of this type (the check is done during the run-time) or 
 752     @NULL otherwise. Usage of this macro is preferred over obsoleted 
 753     wxObject::IsKindOf() function. 
 755     The @e ptr argument may be @NULL, in which case @NULL will be returned. 
 762     wxWindow *win = wxWindow::FindFocus(); 
 763     wxTextCtrl *text = wxDynamicCast(win, wxTextCtrl); 
 766         // a text control has the focus... 
 770         // no window has the focus or it is not a text control 
 774     @see @ref overview_rtti, wxDynamicCastThis(), wxConstCast(), wxStaticCast() 
 776 #define wxDynamicCast( ptr, classname ) 
 779     This macro is equivalent to <tt>wxDynamicCast(this, classname)</tt> but the latter provokes 
 780     spurious compilation warnings from some compilers (because it tests whether 
 781     @c this pointer is non-@NULL which is always true), so this macro should be 
 788 #define wxDynamicCastThis( classname ) 
 791     This macro checks that the cast is valid in debug mode (an assert failure 
 792     will result if wxDynamicCast(ptr, classname) == @NULL) and then returns the 
 793     result of executing an equivalent of <tt>static_cast<classname *>(ptr)</tt>. 
 797     @see wx_static_cast(), wxDynamicCast(), wxConstCast() 
 799 #define wxStaticCast( ptr, classname ) 
 802     Creates and returns an object of the given class, if the class has been 
 803     registered with the dynamic class system using DECLARE... and IMPLEMENT... 
 808 wxObject 
*wxCreateDynamicObject(const wxString
& className
); 
 812 /** @ingroup group_funcmacro_debug */ 
 816     This is defined in debug mode to be call the redefined new operator 
 817     with filename and line number arguments. The definition is: 
 820     #define WXDEBUG_NEW new(__FILE__,__LINE__) 
 823     In non-debug mode, this is defined as the normal new operator. 
 827 #define WXDEBUG_NEW( arg )