以下代码在MSVC2005中不能为我编译:
std::vector<CMenu> vec(10);
CMenu
是MFC菜单对象(例如上下文菜单)。通过一些测试,我了解到CMenu
没有公共拷贝构造函数。
要做我想做的事情,我需要使用动态数组。
CMenu* menus = new CMenu[10];
// ...
delete [] menus;
当然,现在我已经失去了使用STL容器的所有好处。
我还有其他选择吗?
答案 0 :(得分:6)
您可以使用pointer containers或智能指针的容器,例如使用Boost或TR1中的shared_ptr
:
std::vector<shared_ptr<CMenu> > vec;
vec.push_back(make_shared<CMenu>());
答案 1 :(得分:1)
MFC对象是围绕Windows句柄的简单包装器,大多数设计用于释放析构函数中的句柄。因此,拥有一个复制构造函数是危险的,因为第一个被破坏会使另一个无效。
让您的容器代替句柄,并在每次需要转换回MFC-land时使用FromHandle。
答案 2 :(得分:0)
您可以将STL容器与智能指针结合使用,以存储指向堆分配对象的指针,这些对象在容器被销毁时自动delete
。
这项工作的正确智能指针是boost::shared_ptr。
有关详情,请参阅this question。