【问题标题】:Can I use MFC objects in STL containers?我可以在 STL 容器中使用 MFC 对象吗?
【发布时间】:2010-05-05 22:20:03
【问题描述】:

以下代码在 MSVC2005 中无法为我编译:

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

CMenu 是一个 MFC 菜单对象(例如上下文菜单)。通过一些测试,我了解到CMenu 没有公共复制构造函数。

要做我想做的事,我需要使用动态数组。

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

当然,现在我已经失去了使用 STL 容器的所有好处。

我还有其他选择吗?

【问题讨论】:

    标签: c++ mfc memory-management


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-08
        • 2011-12-25
        • 2015-12-15
        • 2010-11-23
        相关资源
        最近更新 更多