![]() |
|
|
![]()
|
|
| Homer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 29.12.2004 Репутация: нет Всего: нет |
Мне нужно, создать массив из объектов класса, в котором тоже есть массивы. Но при вызове функции Add вылазит вот такая ошибка:
cannot convert parameter 1 from 'class ElementGraph' to 'class ElementGraph' ЛЮДИ, подскажите, что за ерунда. |
|||
|
||||
| Coocky |
|
|||
![]() 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 массивы. Создаем код
Описание В данном примере демонстрируется, как можно добавлять собственные классы в массивы на основе шаблона 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()........ Украдено из Первых шагов Подойдет Это сообщение отредактировал(а) Coocky - 8.5.2005, 22:23 -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |