www.adept7.kiev.ua
| Форум| Гостевая| Ссылки| Программы| Исходные тексты| Наши партнеры.|
   
| Главная| Рассылки| Услуги| Библиотека| Новости| Авторам| Программистам| Студентам|
delphi c++ assembler
  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
 

Rambler's Top100 Rambler's Top100

©  Adept Design Studio

Используются технологии uCoz