CTypedPtrList Class
Provides a type-safe "wrapper" for objects of class CPtrList
.
Syntax
template<class BASE_CLASS, class TYPE>
class CTypedPtrList : public BASE_CLASS
Parameters
BASE_CLASS
Base class of the typed pointer list class; must be a pointer list class ( CObList
or CPtrList
).
TYPE
Type of the elements stored in the base-class list.
Members
Public Methods
Name | Description |
---|---|
CTypedPtrList::AddHead | Adds an element (or all the elements in another list) to the head of the list (makes a new head). |
CTypedPtrList::AddTail | Adds an element (or all the elements in another list) to the tail of the list (makes a new tail). |
CTypedPtrList::GetAt | Gets the element at a given position. |
CTypedPtrList::GetHead | Returns the head element of the list (cannot be empty). |
CTypedPtrList::GetNext | Gets the next element for iterating. |
CTypedPtrList::GetPrev | Gets the previous element for iterating. |
CTypedPtrList::GetTail | Returns the tail element of the list (cannot be empty). |
CTypedPtrList::RemoveHead | Removes the element from the head of the list. |
CTypedPtrList::RemoveTail | Removes the element from the tail of the list. |
CTypedPtrList::SetAt | Sets the element at a given position. |
Remarks
When you use CTypedPtrList
rather than CObList
or CPtrList
, the C++ type-checking facility helps eliminate errors caused by mismatched pointer types.
In addition, the CTypedPtrList
wrapper performs much of the casting that would be required if you used CObList
or CPtrList
.
Because all CTypedPtrList
functions are inline, use of this template does not significantly affect the size or speed of your code.
Lists derived from CObList
can be serialized, but those derived from CPtrList
cannot.
When a CTypedPtrList
object is deleted, or when its elements are removed, only the pointers are removed, not the entities they reference.
For more information on using CTypedPtrList
, see the articles Collections and Template-Based Classes.
Example
This example creates an instance of CTypedPtrList
, adds one object, serializes the list to disk, and then deletes the object:
typedef CTypedPtrList<CObList, CMyObject*> CMyList;
CMyList ml;
CMyObject* pMyObject = new CMyObject();
ml.AddTail(pMyObject);
CFileException e;
CFile myFile;
myFile.Open(_T("CTypedPtrList_File.txt"),
CFile::modeCreate | CFile::modeWrite, &e);
CArchive ar(&myFile, CArchive::store);
ml.Serialize(ar);
ar.Close();
myFile.Close();
while (!ml.IsEmpty())
{
delete ml.GetHead();
ml.RemoveHead();
}
class CMyObject : public CObject
{
public:
int i;
void Serialize(CArchive& ar);
CMyObject() { i = 9876; }
protected:
DECLARE_SERIAL(CMyObject)
};
IMPLEMENT_SERIAL(CMyObject, CObject, 0)
void CMyObject::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring())
ar << i;
else
ar >> i;
}
Inheritance Hierarchy
BASE_CLASS
_CTypedPtrList
CTypedPtrList
Requirements
Header: afxtempl.h
CTypedPtrList::AddHead
This member function calls BASE_CLASS
::AddHead.
POSITION AddHead(TYPE newElement);
void AddHead(CTypedPtrList<BASE_CLASS, TYPE>* pNewList);
Parameters
TYPE
Type of the elements stored in the base-class list.
newElement
The object pointer to be added to this list. A NULL value is allowed.
BASE_CLASS
Base class of the typed pointer list class; must be a pointer list class ( CObList or CPtrList).
pNewList
A pointer to another CTypedPtrList object. The elements in pNewList will be added to this list.
Return Value
The first version returns the POSITION value of the newly inserted element.
Remarks
The first version adds a new element before the head of the list. The second version adds another list of elements before the head.
CTypedPtrList::AddTail
This member function calls BASE_CLASS
::AddTail.
POSITION AddTail(TYPE newElement);
void AddTail(CTypedPtrList<BASE_CLASS, TYPE>* pNewList);
Parameters
TYPE
Type of the elements stored in the base-class list.
newElement
The object pointer to be added to this list. A NULL value is allowed.
BASE_CLASS
Base class of the typed pointer list class; must be a pointer list class ( CObList or CPtrList).
pNewList
A pointer to another CTypedPtrList object. The elements in pNewList will be added to this list.
Return Value
The first version returns the POSITION value of the newly inserted element.
Remarks
The first version adds a new element after the tail of the list. The second version adds another list of elements after the tail of the list.
CTypedPtrList::GetAt
A variable of type POSITION is a key for the list.
TYPE& GetAt(POSITION position);
TYPE GetAt(POSITION position) const;
Parameters
TYPE
Template parameter specifying the type of elements stored in the list.
position
A POSITION value returned by a previous GetHeadPosition
or Find
member function call.
Return Value
If the list is accessed through a pointer to a const CTypedPtrList
, then GetAt
returns a pointer of the type specified by the template parameter TYPE. This allows the function to be used only on the right side of an assignment statement and thus protects the list from modification.
If the list is accessed directly or through a pointer to a CTypedPtrList
, then GetAt
returns a reference to a pointer of the type specified by the template parameter TYPE. This allows the function to be used on either side of an assignment statement and thus allows the list entries to be modified.
Remarks
It is not the same as an index, and you cannot operate on a POSITION value yourself. GetAt
retrieves the CObject
pointer associated with a given position.
You must ensure that your POSITION value represents a valid position in the list. If it is invalid, then the Debug version of the Microsoft Foundation Class Library asserts.
This inline function calls BASE_CLASS
::GetAt.
CTypedPtrList::GetHead
Gets the pointer that represents the head element of this list.
TYPE& GetHead();
TYPE GetHead() const;
Parameters
TYPE
Template parameter specifying the type of elements stored in the list.
Return Value
If the list is accessed through a pointer to a const CTypedPtrList
, then GetHead
returns a pointer of the type specified by the template parameter TYPE. This allows the function to be used only on the right side of an assignment statement and thus protects the list from modification.
If the list is accessed directly or through a pointer to a CTypedPtrList
, then GetHead
returns a reference to a pointer of the type specified by the template parameter TYPE. This allows the function to be used on either side of an assignment statement and thus allows the list entries to be modified.
Remarks
You must ensure that the list is not empty before calling GetHead
. If the list is empty, then the Debug version of the Microsoft Foundation Class Library asserts. Use IsEmpty to verify that the list contains elements.
CTypedPtrList::GetNext
Gets the list element identified by rPosition, then sets rPosition to the POSITION value of the next entry in the list.
TYPE& GetNext(POSITION& rPosition);
TYPE GetNext(POSITION& rPosition) const;
Parameters
TYPE
Template parameter specifying the type of elements contained in this list.
rPosition
A reference to a POSITION value returned by a previous GetNext
, GetHeadPosition
, or other member function call.
Return Value
If the list is accessed through a pointer to a const CTypedPtrList
, then GetNext
returns a pointer of the type specified by the template parameter TYPE. This allows the function to be used only on the right side of an assignment statement and thus protects the list from modification.
If the list is accessed directly or through a pointer to a CTypedPtrList
, then GetNext
returns a reference to a pointer of the type specified by the template parameter TYPE. This allows the function to be used on either side of an assignment statement and thus allows the list entries to be modified.
Remarks
You can use GetNext
in a forward iteration loop if you establish the initial position with a call to GetHeadPosition
or CPtrList::Find.
You must ensure that your POSITION value represents a valid position in the list. If it is invalid, then the Debug version of the Microsoft Foundation Class Library asserts.
If the retrieved element is the last in the list, then the new value of rPosition is set to NULL.
It is possible to remove an element during an iteration. See the example for CObList::RemoveAt.
CTypedPtrList::GetPrev
Gets the list element identified by rPosition, then sets rPosition to the POSITION value of the previous entry in the list.
TYPE& GetPrev(POSITION& rPosition);
TYPE GetPrev(POSITION& rPosition) const;
Parameters
TYPE
Template parameter specifying the type of elements contained in this list.
rPosition
A reference to a POSITION value returned by a previous GetPrev
or other member function call.
Return Value
If the list is accessed through a pointer to a const CTypedPtrList
, then GetPrev
returns a pointer of the type specified by the template parameter TYPE. This allows the function to be used only on the right side of an assignment statement and thus protects the list from modification.
If the list is accessed directly or through a pointer to a CTypedPtrList
, then GetPrev
returns a reference to a pointer of the type specified by the template parameter TYPE. This allows the function to be used on either side of an assignment statement and thus allows the list entries to be modified.
Remarks
You can use GetPrev
in a reverse iteration loop if you establish the initial position with a call to GetTailPosition
or Find
.
You must ensure that your POSITION value represents a valid position in the list. If it is invalid, then the Debug version of the Microsoft Foundation Class Library asserts.
If the retrieved element is the first in the list, then the new value of rPosition is set to NULL.
CTypedPtrList::GetTail
Gets the pointer that represents the head element of this list.
TYPE& GetTail();
TYPE GetTail() const;
Parameters
TYPE
Template parameter specifying the type of elements stored in the list.
Return Value
If the list is accessed through a pointer to a const CTypedPtrList
, then GetTail
returns a pointer of the type specified by the template parameter TYPE. This allows the function to be used only on the right side of an assignment statement and thus protects the list from modification.
If the list is accessed directly or through a pointer to a CTypedPtrList
, then GetTail
returns a reference to a pointer of the type specified by the template parameter TYPE. This allows the function to be used on either side of an assignment statement and thus allows the list entries to be modified.
Remarks
You must ensure that the list is not empty before calling GetTail
. If the list is empty, then the Debug version of the Microsoft Foundation Class Library asserts. Use IsEmpty to verify that the list contains elements.
CTypedPtrList::RemoveHead
Removes the element from the head of the list and returns it.
TYPE RemoveHead();
Parameters
TYPE
Template parameter specifying the type of elements stored in the list.
Return Value
The pointer previously at the head of the list. This pointer is of the type specified by the template parameter TYPE.
Remarks
You must ensure that the list is not empty before calling RemoveHead
. If the list is empty, then the Debug version of the Microsoft Foundation Class Library asserts. Use IsEmpty to verify that the list contains elements.
CTypedPtrList::RemoveTail
Removes the element from the tail of the list and returns it.
TYPE RemoveTail();
Parameters
TYPE
Template parameter specifying the type of elements stored in the list.
Return Value
The pointer previously at the tail of the list. This pointer is of the type specified by the template parameter TYPE.
Remarks
You must ensure that the list is not empty before calling RemoveTail
. If the list is empty, then the Debug version of the Microsoft Foundation Class Library asserts. Use IsEmpty to verify that the list contains elements.
CTypedPtrList::SetAt
This member function calls BASE_CLASS
::SetAt.
void SetAt(POSITION pos, TYPE newElement);
Parameters
pos
The POSITION of the element to be set.
TYPE
Type of the elements stored in the base-class list.
newElement
The object pointer to be written to the list.
Remarks
A variable of type POSITION is a key for the list. It is not the same as an index, and you cannot operate on a POSITION value yourself. SetAt
writes the object pointer to the specified position in the list.
You must ensure that your POSITION value represents a valid position in the list. If it is invalid, then the Debug version of the Microsoft Foundation Class Library asserts.
For more detailed remarks, see CObList::SetAt.
See also
MFC Sample COLLECT
Hierarchy Chart
CPtrList Class
CObList Class