我可以在 STL 容器中使用 MFC 对象吗?
Posted
技术标签:
【中文标题】我可以在 STL 容器中使用 MFC 对象吗?【英文标题】:Can I use MFC objects in STL containers? 【发布时间】:2010-05-05 22:20:03 【问题描述】:以下代码在 MSVC2005 中无法为我编译:
std::vector<CMenu> vec(10);
CMenu
是一个 MFC 菜单对象(例如上下文菜单)。通过一些测试,我了解到CMenu
没有公共复制构造函数。
要做我想做的事,我需要使用动态数组。
CMenu* menus = new CMenu[10];
// ...
delete [] menus;
当然,现在我已经失去了使用 STL 容器的所有好处。
我还有其他选择吗?
【问题讨论】:
【参考方案1】:您可以使用pointer containers 或智能指针容器,例如使用来自 Boost 或 TR1 的 shared_ptr
:
std::vector<shared_ptr<CMenu> > vec;
vec.push_back(make_shared<CMenu>());
【讨论】:
【参考方案2】:MFC 对象是 Windows 句柄的简单包装器,并且大多数旨在释放析构函数中的句柄。因此,拥有一个复制构造函数会很危险,因为第一个被破坏会使另一个无效。
让您的容器代替手柄,并在每次需要转换回 MFC-land 时使用 FromHandle。
【讨论】:
更聪明的设计是像shared_ptr<>
一样实现它们。如果你制作一个副本,它指的是同一个菜单,并且该菜单应该在最后一个析构函数中被销毁。 gf 的 anwer 通过将 CMenu 包装在 shared_ptr 中来实现同样的效果。
没有人声称 MFC 的设计很聪明。你想与微软合作,还是我应该?【参考方案3】:
您可以将 STL 容器与智能指针结合使用来存储指向堆分配对象的指针,当容器被销毁时,这些对象会自动成为 delete
d。
这项工作的正确智能指针是boost::shared_ptr。
有关详细信息,另请参阅this question。
【讨论】:
以上是关于我可以在 STL 容器中使用 MFC 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章