2010-05-05 2 views
2

Следующий код не компилируется для меня в msvc2005:Могу ли я использовать объекты MFC в контейнерах STL?

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

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

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

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

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

Есть ли у меня другие возможности?

ответ

6

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

std::vector<shared_ptr<CMenu> > vec; 
vec.push_back(make_shared<CMenu>()); 
0

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

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

Для получения дополнительной информации см. Также this question.

1

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

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

+0

Более разумный дизайн должен был реализовывать их, аналогичные 'shared_ptr <>'. Если вы делаете копию, это относится к тому же меню, и это меню должно быть уничтожено в последнем деструкторе. gf's anwer достигает того же путем обертывания CMenu в shared_ptr вместо этого. – MSalters

+0

Никто никогда не утверждал, что дизайн MFC был умным. Вы хотите взять это с Microsoft, или я должен? –