Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CArray внутри CArray, можно ли так сделать? 
:(
    Опции темы
Homer
Дата 8.5.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 29.12.2004

Репутация: нет
Всего: нет



Мне нужно, создать массив из объектов класса, в котором тоже есть массивы. Но при вызове функции Add вылазит вот такая ошибка:
cannot convert parameter 1 from 'class ElementGraph' to 'class ElementGraph'
ЛЮДИ, подскажите, что за ерунда.
PM MAIL   Вверх
Coocky
Дата 8.5.2005, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 25
Всего: 62



Удобно, для организации массивов, элементами которых являются собственные типы, пользоваться шаблонами 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;
Как видно, пока речь шла о одномерных массивах. Но не трудно догадаться как, например, из последнего разобранного класса сделать и 3D массивы.

Создаем код
Код


#include "stdafx.h"#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 <CMyTest,CMyTest>  
TestArray;void main()
{     TestArray.SetSize(0,1);  // начальный размер массива   
 CMyTest cm(1,1,1);         
// наш класс        
TestArray.Add(cm);         
// добавляем        
TestArray.Add(CMyTest(1,1,2));  
// еще    
TestArray.Add(CMyTest(1,1,3));  
// еще     
cout << TestArray.GetSize() << endl;
 // получить размер   
 TestArray.RemoveAt(2); 
// удалить второй 
   cout << "---------" << endl;    for (int x=0;x < TestArray.GetSize();x++) cout << TestArray[x].GetZ() << endl; 
// вывести на экран}


Описание
В данном примере демонстрируется, как можно добавлять собственные классы в массивы на основе шаблона CArray. Хотя для полной реализации в моем классе не хватает функций. Вы должны понять принцып. Шаблон массива действует на основе некоторых стандартных методов, которые должны быть описаны в Вашем классе.

Давайте посмотрим код в отладчике. Что происходит при добавлении класса. Если мы добавляем класс то вызовется конструктор копий.



Если мы добавляем класс то вызовется конструктор копий.



Нормальное использование нашего класса в шаблоне массива требует перегрузки больного количество операций и не только конструкторов, но и операций сравнения и так далее.

Если не описать перегруженную операцию, но пробовать ей воспользоваться, то при компиляции получим ошибку. И не у меня в программе, а в коде MFC от Microsoft, что страшно меня возмущает. Когда я первый раз это увидел, то был немного в растерянности, так как не мог понять, кто ошибся то?

Шпаргалка
Описать класс со всеми необходимыми перегруженными операциями.

class CMyTest
// описываем наш класс{ .......... CMyTest();
// конструктор CMyTest(int ix,int iy, int iz);
// другой конструктор CMyTest(CMyTest& cmtest);
// конструктор копий ..........};
Подключить заголовочный файл с шаблонами.

#include "afxtempl.h" // здесь шаблоны массивов
Создать объект массива на основе шаблона.

CArray <CMyTest,CMyTest> TestArray;
Пользуйтесь на здоровье.

........TestArray[x].GetZ()........



Украдено из Первых шагов
Подойдет smile ?

Это сообщение отредактировал(а) Coocky - 8.5.2005, 22:23


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.