我可以在 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&lt;&gt; 一样实现它们。如果你制作一个副本,它指的是同一个菜单,并且该菜单应该在最后一个析构函数中被销毁。 gf 的 anwer 通过将 CMenu 包装在 shared_ptr 中来实现同样的效果。 没有人声称 MFC 的设计很聪明。你想与微软合作,还是我应该?【参考方案3】:

您可以将 STL 容器与智能指针结合使用来存储指向堆分配对象的指针,当容器被销毁时,这些对象会自动成为 deleted。

这项工作的正确智能指针是boost::shared_ptr。

有关详细信息,另请参阅this question。

【讨论】:

以上是关于我可以在 STL 容器中使用 MFC 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

STL 容器综述

STL容器

stl中顺序性容器,关联容器两者粗略解释

(C++ 继承)在 stl 容器中存储具有共同父对象的对象

C++ STL - 容器实现

09 STL-函数对象