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