![]() |
|
|
![]()
|
|
| jackevsen |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 2.2.2009 Репутация: нет Всего: нет |
Хочу сделать массив картинок.
Вначале .срр файла добавляю : #include "afxtempl.h" Потом...
При компиляции выдает следующее: Microsoft Visual Studio 9.0\VC\atlmfc\include\afxwin.h(312) : error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject' Делал так:
При компиляции выдает следующее: Microsoft Visual Studio 9.0\VC\atlmfc\include\afxwin.h(312) : error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject' Когда делал массив не битмапов а int : typedef CArray<int,int> MYArray; То все компилируется нормально. Делал пример из MSDN :
Тогда тоже все нормально компилируется..... Почему с битмапами не хочет работать....? |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Патаму чта CObject не хочет и не умеет копироваться. Запрещено ему. И поделом - что ты будешь делать с копиями хандлов?
Складывай в массив указатели (не помню как там точно, но есть в MFC типизированный массив указателей). Но следить за удалением придется самому. Второй вариан - если максимальное число элементнов известно и невелико, заведи статический массив (в смысле C-массив); наличие в нем объекта можно опреджелять по хандлу. И наконец, я бы использовада нормальную std коллекцию вместо убогой MFC-шной, а внутри держала бы умные указатели с подсчетом ссылок (что-нибудь из boost или самописное). Добавлено через 3 минуты и 21 секунду Еще один вариант - коллекция HBITMAP, но тогда сам отвечаешь за их размножение и уничтожение. -------------------- ... |
|||
|
||||
| jackevsen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 2.2.2009 Репутация: нет Всего: нет |
Просто в описании CArray написано, что можно делать массив на основе любого класса (по крайней мере мне так показалось).Вот я и удивился, что с CBitmap не хочет работать.Ну да ладно...
Вообще, мне нужен массив,который может изменять свой размер в ходе выполнения программы.В интернете прочитал что есть такая вещь как std::vector.Но, вроде пишут, что изменяться этот вектор может только в большую сторону...может они и не правы. В одной книге по С++ нашел пример, в котором изменяется размер динамического массива. В общем, в своей программе написал так:
imageArray - это ссылка на динамический массив. arrayCount - это int переменная, в которую записывается текущее количество элементов в массиве imageArray; Вроде, работает....Правда я не пробовал изменять размер массива в меньшую сторону. Хотелось бы узнать мнение, насколько это хороший вариант? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не хороший. Хороший не должен заставлять программиста делать лишние движения. Т.е. коллекция должна работать сама по себе. Кроме того, стандартные коллекции примерно это и делают, только лучше.
Ну, в принципе-то можно, если второй параметр шаблона сделать ссылкой (не даром же их два). Но это путь крайне... древний и уже не кошерный. 1) std::vector может изменять размер в любую сторону, по крайней мере, формально, хотя память не освобождается. Действительно освободить память тоже можно, но редко когда стоит париться. Имеется в виду, что буфер не сжимаются, но деструкторы исправно вызываются. 2) Вся фишка в том, кто будет следить за живущими в векторе объектами. Если они имееют хорошую "объектную" семантику (т.е. конструктор копирования \ оператор присваивания \ деструктор) - никаких проблем, все будет работать как часы. Однако CObject этой семантикой не обладает, несмотря на название. Он создан, чтобы жить как указатель. Поэтому за временем его жизни должен кто-то следить. При этом следует помнить, что конструкторы-деструкторы вызываются не только при добавлении-удалении элементов, но и при всяких перемещениях внутри вектора. Например, при сортировке. Поэтому самый лучший вариант (в плане безопасности утечек и чтобы не думать о лишнем) - это положить в вектор все-таки объекты с правильной семантикой создания. В STL это называется copy-constructable. Если сам объект "не может", нужно его обернуть, либо обернуть его указатель. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |