1998-05-20 10:25:30 -04:00
|
|
|
\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
|
1998-11-21 10:40:35 -05:00
|
|
|
macros and functions and wxWindows is no exception.
|
1998-05-20 10:25:30 -04:00
|
|
|
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.
|
1998-11-21 10:40:35 -05:00
|
|
|
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.
|
1998-05-20 10:25:30 -04:00
|
|
|
|
|
|
|
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}
|
|
|
|
|
|
|
|
|