Могу ли я использовать объекты MFC в контейнерах STL? - PullRequest
2 голосов
/ 06 мая 2010

Следующий код не компилируется для меня в MSVC2005:

std::vector<CMenu> vec(10);

CMenu - это объект меню MFC (например, контекстное меню). В ходе некоторых испытаний я узнал, что CMenu не имеет открытого конструктора копирования.

Чтобы сделать то, что я хотел, мне нужно было использовать динамический массив.

CMenu* menus = new CMenu[10];
// ...
delete [] menus;

Конечно, теперь я потерял все преимущества использования контейнера STL.

Есть ли у меня другие варианты?

Ответы [ 3 ]

6 голосов
/ 06 мая 2010

Вы можете использовать контейнеры указателей или контейнеры интеллектуальных указателей, например, используя shared_ptr от Boost или TR1:

std::vector<shared_ptr<CMenu> > vec;
vec.push_back(make_shared<CMenu>());
1 голос
/ 06 мая 2010

MFC-объекты - это простые оболочки вокруг дескрипторов Windows, и большинство из них предназначены для освобождения дескриптора в деструкторе. Из-за этого было бы опасно иметь конструктор копирования, потому что первый разрушенный сделает другой недействительным.

Позвольте вашему контейнеру вместо этого держать дескрипторы, и используйте FromHandle каждый раз, когда вам нужно преобразовать обратно в MFC-land.

0 голосов
/ 06 мая 2010

Вы можете использовать контейнеры STL в сочетании с интеллектуальными указателями для хранения указателей на объекты, выделенные кучей, которые автоматически delete d при уничтожении контейнера.

Правильный умный указатель для этой работы - boost :: shared_ptr .

Подробнее см. Также этот вопрос .

...