c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector

标签 c++ boost vector shared-ptr weak-ptr

我目前正在做一个大项目,我需要使用 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;
}

但是调用 (*i​​t).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_ptrshared_ptr 构造函数将抛出异常。如果转换过期的 weak_ptr,使用 transform 的版本将在 vector 中放置一个空的 shared_ptr

关于c++ - 有一个 weak_ptr 的 vector ,想要返回一个 shared_ptr 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895816/

相关文章:

c++ - 如何使用 C++ 清除 OpenCV 中的白色背景?

c++ - 请有人解释为什么这里含糊不清?

c++ - 自定义数据类型是否是可变大小效率的可能且可行的选择?

c++ - 尝试在 Codeblocks 上使用 Boost 库会给出未定义的引用

ios - 我可以像快速调整常规 View 一样调整贝塞尔路径的大小吗?

c++ - 将派生类推送到c++中基类的 vector

c++ - 构造函数的参数数量

c++ - 如何在 boost::msm 中实现可访问状态机 (SM) 后端/前端的 "BaseState"

c++ - 创建没有夏令时的 boost::local_time::custom_time_zone

c++ - 如何打印数组的所有连续子数组