git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1015 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \section{Run time class information overview}\label{runtimeclassoverview}
 | |
| 
 | |
| Classes: \helpref{wxObject}{wxobject}, \helpref{wxClassInfo}{wxclassinfo}.
 | |
| 
 | |
| One of the failings of C++ is that no run-time information is provided
 | |
| about a class and its position in the inheritance hierarchy.
 | |
| Another is that instances of a class cannot be created just by knowing the name of a class,
 | |
| which makes facilities such as persistent storage hard to implement.
 | |
| 
 | |
| Most C++ GUI frameworks overcome these limitations by means of a set of
 | |
| macros and functions and wxWindows is no exception.
 | |
| Each class that you wish to be known the type system should have
 | |
| a macro such as DECLARE\_DYNAMIC\_CLASS just inside the class declaration.
 | |
| The macro IMPLEMENT\_DYNAMIC\_CLASS should be in the implementation file.
 | |
| Note that these are entirely optional; use them if you wish to check object
 | |
| types, or create instances of classes using the class name. However,
 | |
| it is good to get into the habit of adding these macros for all classes.
 | |
| 
 | |
| Variations on these \helpref{macros}{macros} are used for multiple inheritance, and abstract
 | |
| classes that cannot be instantiated dynamically or otherwise.
 | |
| 
 | |
| DECLARE\_DYNAMIC\_CLASS inserts a static wxClassInfo declaration into the
 | |
| class, initialized by IMPLEMENT\_DYNAMIC\_CLASS. When initialized, the
 | |
| wxClassInfo object inserts itself into a linked list (accessed through
 | |
| wxClassInfo::first and wxClassInfo::next pointers). The linked list
 | |
| is fully created by the time all global initialisation is done.
 | |
| 
 | |
| IMPLEMENT\_DYNAMIC\_CLASS is a macro that not only initialises the static
 | |
| wxClassInfo member, but defines a global function capable of creating a
 | |
| dynamic object of the class in question. A pointer to this function is
 | |
| stored in wxClassInfo, and is used when an object should be created
 | |
| dynamically.
 | |
| 
 | |
| wxObject::IsKindOf uses the linked list of wxClassInfo. It takes
 | |
| a wxClassInfo argument, so use CLASSINFO(className) to return an
 | |
| appropriate wxClassInfo pointer to use in this function.
 | |
| 
 | |
| The function \helpref{wxCreateDynamicObject}{wxcreatedynamicobject} can be used
 | |
| to construct a new object of a given type, by supplying a string name.
 | |
| If you have a pointer to the wxClassInfo object instead, then you
 | |
| can simply call wxClassInfo::CreateObject.
 | |
| 
 | |
| \subsection{wxClassInfo}\label{wxclassinfooverview}
 | |
| 
 | |
| \overview{Run time class information overview}{runtimeclassoverview}
 | |
| 
 | |
| Class: \helpref{wxClassInfo}{wxclassinfo}
 | |
| 
 | |
| This class stores meta-information about classes. An application
 | |
| may use macros such as DECLARE\_DYNAMIC\_CLASS and IMPLEMENT\_DYNAMIC\_CLASS
 | |
| to record run-time information about a class, including:
 | |
| 
 | |
| \begin{itemize}\itemsep=0pt
 | |
| \item its position in the inheritance hierarchy;
 | |
| \item the base class name(s) (up to two base classes are permitted);
 | |
| \item a string representation of the class name;
 | |
| \item a function that can be called to construct an instance of this class.
 | |
| \end{itemize}
 | |
| 
 | |
| The DECLARE\_... macros declare a static wxClassInfo variable in a class, which is initialized
 | |
| by macros of the form IMPLEMENT\_... in the implementation C++ file. Classes whose instances may be
 | |
| constructed dynamically are given a global constructor function which returns a new object.
 | |
| 
 | |
| You can get the wxClassInfo for a class by using the CLASSINFO macro, e.g. CLASSINFO(wxFrame).
 | |
| You can get the wxClassInfo for an object using wxObject::GetClassInfo.
 | |
| 
 | |
| See also \helpref{wxObject}{wxobject} and \helpref{wxCreateDynamicObject}{wxcreatedynamicobject}.
 | |
| 
 | |
| \subsection{Example}
 | |
| 
 | |
| In a header file wx\_frame.h:
 | |
| 
 | |
| \begin{verbatim}
 | |
| class wxFrame: public wxWindow
 | |
| {
 | |
|   DECLARE_DYNAMIC_CLASS(wxFrame)
 | |
| 
 | |
|  private:
 | |
|   char *frameTitle;
 | |
|  public:
 | |
|   ...
 | |
| };
 | |
| \end{verbatim}
 | |
| 
 | |
| In a C++ file wx\_frame.cc:
 | |
| 
 | |
| \begin{verbatim}
 | |
| IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow)
 | |
| 
 | |
| wxFrame::wxFrame(void)
 | |
| {
 | |
| ...
 | |
| }
 | |
| \end{verbatim}
 | |
| 
 | |
| 
 |