Re: CArray::GetData
"Al" <Al@discussions.microsoft.com> ha scritto nel messaggio
news:9B5A7717-F4E2-4AF3-AD2B-E5D5EFD2BFCE@microsoft.com...
I am trying to get a pointer from an object that is of CArray but it is
also
in another CArray.
[...]
CBox* pb;
pb = (CBox*) m_tub.ElementAt(0).m_box.GetData();
doesn't get me the right array element of CBox
if I try
pb = (CBox*)m_tube.ElementAt(0).m_box.ElementAt(1).GetData();
I get an error. Is there some other way?
You did not specify what kind of error you get, the exact error message,
etc.
However, I must confess that I prefer STL containers to MFC ones (but I
prefer CString instead of std::string), especially for "composibility", i.e.
STL containers seem to behave very well when you compose them, this is not
true (at least, IMHO) for MFC containers.
So, I would suggest you to use std::vector.
I tried this code, and it compiles and works fine:
<code>
class Box
{
public:
Box()
: Num(0)
{
}
Box( LPCTSTR name, int num )
: Name( name ), Num( num )
{
}
CString Name;
int Num;
};
class Tube
{
public:
Tube()
{
}
CString Name;
std::vector< Box > Boxes;
};
void TestVector()
{
std::vector< Tube > Tubes;
Tube tube1;
tube1.Name = _T("Tube #1");
tube1.Boxes.push_back( Box( "Box1", 10 ));
tube1.Boxes.push_back( Box( "Box2", 20 ));
Tube tube2;
tube2.Name = _T("Tube #2");
tube2.Boxes.push_back( Box( "Box3", 30 ));
Tubes.push_back( tube1 );
Tubes.push_back( tube2 );
const Box * box = &(Tubes.at(0).Boxes[1]);
ASSERT( box->Name == _T("Box2") );
ASSERT( box->Num == 20 );
}
</code>
Note that I tried a similar code using CArray, but I got this compiler
error:
<error>
Error 1 error C2248: 'CObject::operator =' : cannot access private member
declared in class 'CObject' j:\programmi\microsoft visual studio
9.0\vc\atlmfc\include\afxtempl.h
</error>
Maybe to solve that kind of problem I should define a custom implementation
of some global helper function for CArray, like CopyElements...
But I find that to be a useless complexity, and IMHO a technical blunder in
definition and implementation of CArray.
For the curious ones, this is the CArray based code, giving the
aforementioned error:
<code>
class CBox
{
public:
CBox()
: Num(0)
{
}
CBox( LPCTSTR name, int num )
: Name( name ), Num( num )
{
}
CString Name;
int Num;
};
class CTube
{
public:
CTube()
{
}
CString Name;
CArray< CBox > Boxes;
};
void TestCArray()
{
CArray< CTube > Tubes;
CTube tube1;
tube1.Name = _T("Tube #1");
tube1.Boxes.Add( CBox( "Box1", 10 ));
tube1.Boxes.Add( CBox( "Box2", 20 ));
CTube tube2;
tube2.Name = _T("Tube #2");
tube2.Boxes.Add( CBox( "Box3", 30 ));
Tubes.Add( tube1 );
Tubes.Add( tube2 );
const CBox * box = (const CBox *)Tubes.ElementAt(0).Boxes.GetData();
ASSERT( box->Name == _T("Box1") );
ASSERT( box->Num == 10 );
}
</code>
Giovanni