Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CBitmap в CArray, не хочет работать... 
:(
    Опции темы
jackevsen
Дата 25.2.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хочу сделать массив картинок.

Вначале .срр файла добавляю : #include "afxtempl.h"

Потом...

Код

CBitmap newBMP;

typedef CArray<CBitmap,CBitmap> MYArray;
MYArray imageArray;
imageArray.Add(newBMP); 


При компиляции выдает следующее:

Microsoft Visual Studio 9.0\VC\atlmfc\include\afxwin.h(312) : error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject'

Делал так:

Код

CBitmap newBMP;

typedef CArray<CBitmap,CBitmap&> MYArray;
MYArray imageArray;
imageArray.Add(newBMP); 


При компиляции выдает следующее:

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 :

Код

typedef CArray<CPoint,CPoint> MYArray;
MYArray imageArray;
imageArray.Add(CPoint(0,0)); 


Тогда тоже все нормально компилируется.....

Почему с битмапами не хочет работать....?  smile 
PM MAIL   Вверх
Earnest
Дата 25.2.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Патаму чта CObject не хочет и не умеет копироваться. Запрещено ему. И поделом - что ты будешь делать с копиями хандлов? 
Складывай в массив указатели (не помню как там точно, но есть в MFC типизированный массив указателей). Но следить за удалением придется самому. Второй вариан - если максимальное число элементнов известно и невелико, заведи статический массив (в смысле C-массив); наличие в нем объекта можно опреджелять по хандлу.
И наконец, я бы использовада нормальную std  коллекцию вместо убогой MFC-шной, а внутри держала бы умные указатели с подсчетом ссылок (что-нибудь из boost или самописное).

Добавлено через 3 минуты и 21 секунду
Еще один вариант - коллекция HBITMAP, но тогда сам отвечаешь за их размножение и уничтожение.


--------------------
...
PM   Вверх
jackevsen
Дата 8.3.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Просто в описании CArray написано, что можно делать массив на основе любого класса (по крайней мере мне так показалось).Вот я и удивился, что с CBitmap не хочет работать.Ну да ладно...

Вообще, мне нужен массив,который может изменять свой размер в ходе выполнения программы.В интернете прочитал что есть такая вещь как std::vector.Но, вроде пишут, что изменяться этот вектор может только в большую сторону...может они и не правы.

В одной книге по С++ нашел пример, в котором изменяется размер динамического массива. В общем, в своей программе написал так:

Код

int newSize = arrayCount * 2;
CBitmap *newArray = new CBitmap[newSize];

CBitmap *FromArray = imageArray;
CBitmap *ToArray = newArray;

for(int i = 0; i < arrayCount; i++){
    ToArray->Attach(FromArray->Detach());
    ToArray++;
    FromArray++;
}

delete [] imageArray;

imageArray = newArray;


imageArray - это ссылка на динамический массив.
arrayCount - это int переменная, в которую записывается текущее количество элементов в массиве imageArray;

Вроде, работает....Правда я не пробовал изменять размер массива в меньшую сторону.

Хотелось бы узнать мнение, насколько это хороший вариант?
PM MAIL   Вверх
Earnest
Дата 15.3.2009, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Не хороший. Хороший не должен заставлять программиста делать лишние движения. Т.е. коллекция должна работать сама по себе. Кроме того, стандартные коллекции примерно это и делают, только лучше.
Цитата(jackevsen @  8.3.2009,  16:20 Найти цитируемый пост)
Просто в описании CArray написано, что можно делать массив на основе любого класса 

Ну, в принципе-то можно, если второй параметр шаблона сделать ссылкой (не даром же их два).
Но это путь крайне... древний и уже не кошерный. 

1) std::vector может изменять размер в любую сторону, по крайней мере, формально, хотя память не освобождается. Действительно освободить память тоже можно, но редко когда стоит париться. Имеется в виду, что буфер не сжимаются, но деструкторы исправно вызываются.

2) Вся фишка в том, кто будет следить за живущими в векторе объектами. Если они имееют хорошую "объектную" семантику (т.е. конструктор копирования \ оператор присваивания \ деструктор) - никаких проблем, все будет работать как часы. Однако CObject этой семантикой не обладает, несмотря на название. Он создан, чтобы жить как указатель. 
Поэтому за временем его жизни должен кто-то следить. При этом следует помнить, что конструкторы-деструкторы вызываются не только при добавлении-удалении элементов, но и при всяких перемещениях внутри вектора. Например, при сортировке. Поэтому самый лучший вариант (в плане безопасности утечек и чтобы не думать о лишнем) - это положить в вектор все-таки объекты с правильной семантикой создания. В STL это называется copy-constructable. Если сам объект "не может", нужно его обернуть, либо обернуть его указатель.



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


 




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


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

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