我目前正在做一个大项目,我需要使用 weak_ptr
而不是 shared_ptr
.
这是我的问题。
我有一个名为 House 的类,其属性为:vector<boost::shared_ptr<People>> my_people
.
我想修改这个数据成员为vector<boost::weak_ptr<People>> my_people
.
我的 setter/getter 是
vector<boost::shared_ptr<People>>& getPeople() const
{
return my_people;
}
通常,使用简单的 weak_ptr
我可以回my_people.lock();
但是我有一个 vector ,但我不知道如何做这样的事情:
vector<boost::shared_ptr<People>>& getPeople() const
{
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end();
++it)
{
(*it).lock();
}
return my_people;
}
换句话说,我想返回 weak_ptr
的 vector 但作为 shared_ptr
的 vector .可能吗?或者我必须返回 weak_ptr
的 vector 吗?并使用 lock()
我到处使用它们?
最佳答案
你的函数是一个合理的开始:
vector<boost::shared_ptr<People>>& getPeople() const
{
for( vector<boost::weak_ptr<People>::iterator it = my_people.begin();
it != my_people.end();
++it)
{
(*it).lock();
}
return my_people;
}
但是调用 (*it).lock()
只是创建一个 shared_ptr
并把它扔掉,它不会改变 vector 元素的类型,而且你无法将 vector 作为不同类型返回。
您需要创建一个正确类型的 vector ,用 shared_ptr 对象填充它,然后返回它:
vector<boost::shared_ptr<People>> getPeople() const
{
vector<boost::shared_ptr<People>> people(my_people.size());
std::transform(my_people.begin(), my_people.end(), people.begin(),
boost::bind(&boost::weak_ptr<People>::lock, _1));
return people;
}
这遍历 my_people
的每个元素,对其调用 lock()
,并将结果分配给 people
的相应元素。
如果您知道 my_people
从不包含过期指针,那就更简单了:
vector<boost::shared_ptr<People>> getPeople() const
{
vector<boost::shared_ptr<People>> people(my_people.begin(), my_people.end());
return people;
}
这通过从 weak_ptr
元素构造每个 shared_ptr
元素来填充 people
vector 。不同之处在于,如果 weak_ptr
已过期,此版本将抛出异常,因为如果传递过期的 weak_ptr
,shared_ptr
构造函数将抛出异常。如果转换过期的 weak_ptr,使用 transform
的版本将在 vector 中放置一个空的 shared_ptr
。
关于c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895816/