2003-09-24 19:59:03 +00:00
|
|
|
\section{\class{wxScopedPtr}}\label{wxscopedptr}
|
2002-08-08 09:57:05 +00:00
|
|
|
|
|
|
|
This is a simple scoped smart pointer implementation that is similar to
|
2003-09-15 16:10:06 +00:00
|
|
|
the \urlref{Boost}{http://www.boost.org/} smart pointers but rewritten to
|
2002-08-08 09:57:05 +00:00
|
|
|
use macros instead.
|
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
A smart pointer holds a pointer to an object. The memory used by the object is
|
|
|
|
deleted when the smart pointer goes out of scope. This class is different from
|
|
|
|
the \texttt{std::auto\_ptr<>} in so far as it doesn't provide copy constructor
|
|
|
|
nor assignment operator. This limits what you can do with it but is much less
|
|
|
|
surprizing than the ``destructive copy'' behaviour of the standard class.
|
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\wxheading{Example}
|
|
|
|
|
|
|
|
Below is an example of using a wxWindows scoped smart pointer and
|
|
|
|
pointer array.
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
class MyClass { /* ... */ };
|
|
|
|
|
|
|
|
// declare a smart pointer to a MyClass called wxMyClassPtr
|
|
|
|
wxDECLARE_SCOPED_PTR(MyClass, wxMyClassPtr)
|
|
|
|
// declare a smart pointer to an array of chars
|
|
|
|
wxDECLARE_SCOPED_ARRAY(char, wxCharArray)
|
|
|
|
|
|
|
|
...
|
|
|
|
|
|
|
|
// define the first pointer class, must be complete
|
|
|
|
wxDEFINE_SCOPED_PTR(MyClass, wxMyClassPtr)
|
|
|
|
// define the second pointer class
|
|
|
|
wxDEFINE_SCOPED_ARRAY(char, wxCharArray)
|
|
|
|
|
|
|
|
// create an object with a new pointer to MyClass
|
|
|
|
wxMyClassPtr theObj(new MyClass());
|
|
|
|
// reset the pointer (deletes the previous one)
|
|
|
|
theObj.reset(new MyClass());
|
|
|
|
|
|
|
|
// access the pointer
|
|
|
|
theObj->MyFunc();
|
|
|
|
|
|
|
|
// create an object with a new array of chars
|
|
|
|
wxCharArray theCharObj(new char[100]);
|
|
|
|
|
|
|
|
// access the array
|
|
|
|
theCharObj[0] = "!";
|
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
\wxheading{Declaring new smart pointer types}
|
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
To declare the smart pointer class \texttt{CLASSNAME} containing pointes to a
|
|
|
|
(possibly incomplete) type \texttt{TYPE} you should use
|
2004-02-22 01:16:32 +00:00
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\begin{verbatim}
|
2003-09-15 16:10:06 +00:00
|
|
|
wxDECLARE_SCOPED_PTR( TYPE, // type of the values
|
2002-08-08 09:57:05 +00:00
|
|
|
CLASSNAME ); // name of the class
|
|
|
|
\end{verbatim}
|
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
And later, when \texttt{TYPE} is fully defined, you must also use
|
2004-02-22 01:16:32 +00:00
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
\begin{verbatim}
|
|
|
|
wxDEFINE_SCOPED_PTR( TYPE, CLASSNAME );
|
|
|
|
\end{verbatim}
|
|
|
|
to implement the scoped pointer class.
|
|
|
|
|
|
|
|
The first argument of these macro is the pointer type, the second is the name
|
|
|
|
of the new smart pointer class being created. Below we will use wxScopedPtr to
|
2002-08-08 09:57:05 +00:00
|
|
|
represent the scoped pointer class, but the user may create the class with any
|
|
|
|
legal name.
|
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
Alternatively, if you don't have to separate the point of declaration and
|
|
|
|
definition of this class and if you accept the standard naming convention, that
|
|
|
|
is that the scoped pointer for the class \texttt{Foo} is called
|
|
|
|
\texttt{FooPtr}, you can use a single macro which replaces two macros above:
|
2004-02-22 01:16:32 +00:00
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
\begin{verbatim}
|
|
|
|
wxDEFINE_SCOPED_PTR_TYPE( TYPE );
|
|
|
|
\end{verbatim}
|
2004-02-22 01:16:32 +00:00
|
|
|
|
2003-09-15 16:10:06 +00:00
|
|
|
Once again, in this cass \texttt{CLASSNAME} will be \texttt{TYPEPtr}.
|
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\wxheading{Include files}
|
|
|
|
|
|
|
|
<wx/ptr\_scpd.h>
|
|
|
|
|
|
|
|
\wxheading{See also}
|
|
|
|
|
|
|
|
\helpref{wxScopedArray}{wxscopedarray}\rtfsp
|
|
|
|
|
|
|
|
\latexignore{\rtfignore{\wxheading{Members}}}
|
|
|
|
|
|
|
|
\membersection{wxScopedPtr::wxScopedPtr}
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
\func{}{explicit wxScopedPtr}{\param{type}{ * T = NULL}}
|
2002-08-08 09:57:05 +00:00
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
Creates the smart pointer with the given pointer or none if {\tt NULL}. On
|
2002-08-08 09:57:05 +00:00
|
|
|
compilers that support it, this uses the explicit keyword.
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
2003-09-24 19:43:00 +00:00
|
|
|
\membersection{wxScopedPtr::\destruct{wxScopedPtr}}
|
2003-09-17 17:27:36 +00:00
|
|
|
|
|
|
|
\func{}{\destruct{wxScopedPtr}}{\void}
|
|
|
|
|
2003-09-24 19:43:00 +00:00
|
|
|
Destructor frees the pointer help by this object if it is not {\tt NULL}.
|
2003-09-17 17:27:36 +00:00
|
|
|
|
|
|
|
|
2003-06-29 15:44:08 +00:00
|
|
|
\membersection{wxScopedPtr::release}
|
|
|
|
|
|
|
|
\func{T *}{release}{\void}
|
|
|
|
|
|
|
|
Returns the currently hold pointer and resets the smart pointer object to
|
|
|
|
{\tt NULL}. After a call to this function the caller is responsible for
|
|
|
|
deleting the pointer.
|
|
|
|
|
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\membersection{wxScopedPtr::reset}
|
|
|
|
|
|
|
|
\func{\void}{reset}{\param{T}{ p * = NULL}}
|
|
|
|
|
2003-06-29 15:44:08 +00:00
|
|
|
Deletes the currently held pointer and sets it to {\it p} or to NULL if no
|
2002-08-08 09:57:05 +00:00
|
|
|
arguments are specified. This function does check to make sure that the
|
|
|
|
pointer you are assigning is not the same pointer that is already stored.
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\membersection{wxScopedPtr::operator *}
|
|
|
|
|
|
|
|
\func{const T\&}{operator *}{\void}
|
|
|
|
|
|
|
|
This operator works like the standard C++ pointer operator to return the object
|
|
|
|
being pointed to by the pointer. If the pointer is NULL or invalid this will
|
|
|
|
crash.
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
2003-06-22 22:20:40 +00:00
|
|
|
\membersection{wxScopedPtr::operator -$>$} % TODO
|
2002-08-08 09:57:05 +00:00
|
|
|
|
2003-06-22 22:20:40 +00:00
|
|
|
\func{const T*}{operator -$>$}{\void} % TODO
|
2002-08-08 09:57:05 +00:00
|
|
|
|
|
|
|
This operator works like the standard C++ pointer operator to return the pointer
|
|
|
|
in the smart pointer or NULL if it is empty.
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\membersection{wxScopedPtr::get}
|
|
|
|
|
|
|
|
\func{const T*}{get}{\void}
|
|
|
|
|
|
|
|
This operator gets the pointer stored in the smart pointer or returns NULL if
|
|
|
|
there is none.
|
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
2002-08-08 09:57:05 +00:00
|
|
|
\membersection{wxScopedPtr::swap}
|
|
|
|
|
2003-06-29 15:44:08 +00:00
|
|
|
\func{\void}{swap}{\param{wxScopedPtr}{ \& other}}
|
2002-08-08 09:57:05 +00:00
|
|
|
|
2003-06-29 15:44:08 +00:00
|
|
|
Swap the pointer inside the smart pointer with {\it other}. The pointer being
|
|
|
|
swapped must be of the same type (hence the same class name).
|
2002-08-08 09:57:05 +00:00
|
|
|
|
2003-09-17 17:27:36 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%%%%%%% wxScopedTiedPtr %%%%%%%
|
|
|
|
\section{\class{wxScopedTiedPtr}}\label{wxscopedtiedptr}
|
|
|
|
|
|
|
|
This is a variation on the topic of \helpref{wxScopedPtr}{wxscopedptr}. This
|
|
|
|
class is also a smart pointer but in addition it ``ties'' the pointer value to
|
|
|
|
another variable. In other words, during the life time of this class the value
|
|
|
|
of that variable is set to be the same as the value of the pointer itself and
|
|
|
|
it is reset to its old value when the object is destroyed. This class is
|
|
|
|
especially useful when converting the existing code (which may already store
|
|
|
|
the pointers value in some variable) to the smart pointers.
|
|
|
|
|
|
|
|
\wxheading{Example}
|
|
|
|
|
|
|
|
\wxheading{Derives from}
|
|
|
|
|
|
|
|
\helpref{wxScopedPtr}{wxscopedptr}
|
|
|
|
|
|
|
|
\wxheading{Include files}
|
|
|
|
|
|
|
|
<wx/ptr\_scpd.h>
|
|
|
|
|
|
|
|
\latexignore{\rtfignore{\wxheading{Members}}}
|
|
|
|
|
|
|
|
\membersection{wxScopedTiedPtr::wxScopedTiedPtr}\label{wxscopedtiedptrctor}
|
|
|
|
|
|
|
|
\func{}{wxScopedTiedPtr}{\param{T **}{ppTie}, \param{T *}{ptr}}
|
|
|
|
|
|
|
|
Constructor creates a smart pointer initialized with \arg{ptr} and stores
|
|
|
|
\arg{ptr} in the location specified by \arg{ppTie} which must not be
|
|
|
|
{\tt NULL}.
|
|
|
|
|
|
|
|
\membersection{wxScopedTiedPtr::\destruct{wxScopedTiedPtr}}\label{wxscopedtiedptrdtor}
|
|
|
|
|
|
|
|
\func{}{\destruct{wxScopedTiedPtr}}{\void}
|
|
|
|
|
|
|
|
Destructor frees the pointer help by this object and restores the value stored
|
|
|
|
at the tied location (as specified in the \helpref{constructor}{wxscopedtiedptrctor})
|
|
|
|
to the old value.
|
|
|
|
|
|
|
|
Warning: this location may now contain an uninitialized value if it hadn't been
|
|
|
|
initialized previously, in particular don't count on it magically being
|
|
|
|
{\tt NULL}!
|
|
|
|
|
|
|
|
|