http://tikitak.narod.ru ---- Главная страница сайта
Шаг 59 - CArray и наши классы
Создаем проект
Оставляем наше консольное приложение Win32 c поддержкой MFC
Вот такое письмо от Николая
Удобно, для органицации массивов, элементами которых являются собственные типы, пользоваться шаблонами MFC.
Рассмотрим шаблон класса Carray:
Шаблон класса СArray имеет вид:
template < class TYPE, clаss ARG_Type > class CArray : public CObject
где TYPE - ТИП элементов, хранящихся в массиве. ARG - ссылка на тип заданный первым параметром.
Сохраняю в динамическом массиве объекты типа CString:
typedef CArray < CString, CString* > SArray
SArray aM1, aM2;
Тоже самое можно сделать и для любого Вашего типа:
typedef CArray < CMyClass, CMyClass* > MyArray
MyArray aM1, aM2;
Все функции доступа к элементам массива описанные в Шаге 58 меют место и здесь.
Часто, целесообразно хранить в массиве не сами элементы, а указатели на них. Для этого можно использовать шаблоны классов CTypedPtrArray.
Шаблон класса CTypedPtrArray имеет вид:
template < class Base_Class, clаss Type* >
где Base_Class - базовый класс для хранения указателей. Type - указатель на тип элементов массива.
Для Базового класса нужно использовать классы массивов не использующих шаблоны!
Например, те которые были представлены в Шаге 58 (CObArray, CptrArray: etc)
typedef CTypedPtrArray < CPtrArray, MyClass*> DArray;
DArray aM;
Некоторые функции доступа к элементам:
Устанавливаем элементу массива с индексом nIndex значение ptr:
void SetAt ( int nIndex, TYPE ptr );
Добавляем существующий массив в конец другого массива: %)
int Append( const CTypedPtrArray& src );
Вставляем элемент nCount(и так всё ясно)
void InsertAt( int nIndex, TYPE newElement, int nCount = 1 );
Как видно, пока речь шла о одномерных массивах. Но не трудно догадаться как, например, из последнего разобранного класса сделать и 3D массивы.
By Nicolay.
Создаем код
#include "afxwin.h"
#include "iostream.h"
#include "afxtempl.h"
class CMyTest
{
public:
CMyTest();
CMyTest(int ix,int iy, int iz);
CMyTest(CMyTest& cmtest);
int GetZ();
int GetX();
int GetY();
private:
int x;
int y;
int z;
};
int CMyTest::GetZ()
{
return z;
}
int CMyTest::GetX()
{
return x;
}
int CMyTest::GetY()
{
return y;
}
CMyTest::CMyTest(CMyTest& cmtest)
{
x=cmtest.GetX();
y=cmtest.GetY();
z=cmtest.GetZ();
}
CMyTest::CMyTest(int ix,int iy, int iz)
{
x=ix;
y=iy;
z=iz;
}
CMyTest::CMyTest()
{
x=0;
y=0;
z=0;
}
CArray TestArray;
void main()
{
TestArray.SetSize(0,1);
// Add
CMyTest cm(1,1,1);
TestArray.Add(cm);
TestArray.Add(CMyTest(1,1,2));
TestArray.Add(CMyTest(1,1,3));
// GetSize
cout << TestArray.GetSize() << endl;
// Remove
TestArray.RemoveAt(2);
// []
for (int x=0;x < TestArray.GetSize();x++) cout << TestArray[x].GetZ() << endl;
}
Описание
В данном примере демонстрируется, как можно создавать собственные классы на основе шаблона CArray. Хотя для полной реализации в моем классе не хватает функций. Но Вы должны понять.
Шаблон массива действует на основе некоторых стандартных методов, которые должны быть описаны в Вашем классе.
В данном отрывке, если Вы посмотрите в отладчике, то есть по шагам F10 и F11.
CMyTest cm(1,1,1);
TestArray.Add(cm); // !!!!
Что вызывается конструктор копий, который описан в моем классе
CMyTest::CMyTest(CMyTest& cmtest)
{
x=cmtest.GetX();
y=cmtest.GetY();
z=cmtest.GetZ();
}
А вот в этом коде
TestArray.Add(CMyTest(1,1,2)); // !!!
Вызывается просто конструктор c данными.
CMyTest::CMyTest(int ix,int iy, int iz)
{
x=ix;
y=iy;
z=iz;
}
Если бы я не описал эти конструктора, то при компиляции получил бы ошибку. И не у меня в программе :-))), а в коде MFC от Microsoft, что страшно меня возмущает. Почему !!!!! Почему мне не cкажут, что я балбес :-)))
Вот так. Для полной поддержки всех возможностей надо просто описать все методы, и если будет настроение я опишу все необходимое :-)
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|