This document covers important issues in using TArray
The
use of a TArray object can avoid the need for the member
function of an end-user class to have overloaded variants to handle all possible
types of arrays of <class T> elements.
The following
example illustrates the point. It constructs a fixed flat array, a variable
flat array and a packed array of <TElement> objects.
By
taking a TArray<TElement> argument, the CTot::Total() member
function can access array elements regardless of the type of array containing
them.
class TElement // array elements
{
public:
TElement();
inline TInt GetValue() const;
void SetValue(TInt aVal);
private :
TInt iValue;
};
class CTot : public CBase
{
public :
void Total(const TArray<TElement>& anArray);
private :
TInt iTotalElements;
TInt iTotalValue;
};
TElement::TElement()
: iValue(0)
{}
inline TInt TElement::GetValue() const
{
return iValue;
}
void TElement::SetValue(TInt aVal)
{
iValue = aVal;
}
void CTot::Total(const TArray<TElement>& anArray)
{
TInt count = anArray.Count();
for (TInt jj = 0; jj < count; jj++)
iTotalValue += anArray[jj].GetValue();
iTotalElements += count;
}
Then some code using these could be:
// main body CArrayFixFlat<TElement>* fix; CArrayVarFlat<TElement>* var; CArrayPakFlat<TElement>* pak; TElement x; CTot* ptr; ptr = new CTot; fix = new CArrayFixFlat<TElement>(2); var = new CArrayVarFlat<TElement>(2); pak = new CArrayPakFlat<TElement>(2); x.SetValue(1); fix->AppendL(x); x.SetValue(2); var->AppendL(x,sizeof(x)); x.SetValue(3); pak->AppendL(x,sizeof(x)); ptr->Total(fix->Array()); ptr->Total(var->Array()); ptr->Total(pak->Array());
Without the use of TArray,
the Total() member function would need overloaded variants
to handle all the possible array types which it might expect. The CTot class
would need redefining as:
class CTot : public CBase
{
public :
void Total(const CArrayFixFlat<TElement>& anArray);
void Total(const CArrayFixSeg<TElement>& anArray);
void Total(const CArrayVarFlat<TElement>& anArray);
void Total(const CArrayVarSeg<TElement>& anArray);
void Total(const CArrayPakFlat<TElement>& anArray);
private :
TInt iTotalElements;
TInt iTotalValue;
}; To allow the Total() function to handle
arrays composed of different types of element, (i.e. arrays constructed with
different template values), then a separate variant of Total() is
required for each element type. For example, to handle arrays of <TElement1> elements
and arrays of <TElement2> elements, the CTot class
might be defined as:
class CTot : public CBase
{
public :
void TotalA(const TArray<TElement1>& anArray);
void TotalB(const TArray<TElement2>& anArray);
private :
TInt iTotalElements;
TInt iTotalValue;
}; One important point to note; the referenced TElement returned
by operator[] is declared as const. This
means that any member function of TElement must also be declared
as const, as shown in this example.