Re: CArray
"David Webber" <dave@musical-dot-demon-dot-co.uk> ha scritto nel messaggio
news:uGF2YPtHIHA.4880@TK2MSFTNGP03.phx.gbl...
"mido1971" <mido1971@discussions.microsoft.com> wrote in message
news:4327DF07-1C3A-4AE4-867A-78C0294117BF@microsoft.com...
hi,
how can i use a CArray in multidimensional like CString [2][2] and how
can i
insert the data
thanks for help
Very schematically:
class CMyArray1D : public CArray<CString, CString &>
{
// Write members including copy constructor and = operator
}
class CMyArray2D : public CArray<CMyArray1D, CMyArray1D &>
{
// Write members including copy constructor and = operator
}
Dave: you correctly answered OP's question, which asked about CArray.
What I don't like about CArray, is the fact that I need to write copy ctor
and operator=.
I think that if the OP uses std::vector, there is a default copy mechanism
implemented, i.e. copy ctor and operator= don't need to be explicitly
defined.
So, I would do something like this:
<code>
typedef std::vector< CString > StringArray;
typedef std::vector< StringArray > StringMatrix;
StringMatrix strings;
</code>
or better, I would implement the 2D matrix using a single array (1D), but I
would define a pair of methods like Get and Set, which take in input two
integers (row and column) and access in read/write the given string element.
<code>
class StringMatrix
{
public:
StringMatrix();
explicit StringMatrix( int rows, int columns );
...
CString Get( int row, int col ) const;
StringMatrix & Set( int row, int col, const CString & s );
...
private:
typedef std::vector< CString > StringArray;
StringArray m_strings;
int m_rowCount;
int m_columnCount;
int GetIndex( int row, int col ) const;
};
</code>
Get and Set could be implemented something like this:
<code>
// Given (
inline int StringMatrix::GetIndex( int row, int col ) const
{
return ( row * m_columnCount + col );
}
CString StringMatrix::Get( int row, int col ) const
{
return m_strings.at( GetIndex( row, col ) );
}
StringMatrix & StringMatrix::Set( int row, int col, const CString & s )
{
m_strings.at( GetIndex( row, col ) ) = s;
return *this;
}
</code>
The fact that Set returns a reference to the object, allows chained call,
e.g.:
aStringMatrix.Set( 1, 3, _T("Hello") ).Set( 2, 5, _T("World") ).Set( 0, 3,
_T("Ciao") );
Giovanni