c++ - 从共享指针的取消引用值中获取共享指针

标签 c++ pointers memory shared-ptr

想象一下有一个共享指针的 vector

typedef vector< shared_ptr< classA > > PointerVector;

还有一个 B 类,它也有一个共享指针 vector 作为成员,以及一个将已经取消引用的共享指针推回到这个 vector 中的方法。

ClassB
{
public:
    void add(classA &ref);
private:
    PointerVector vector;
}

假设 main 为 add 函数提供了一个取消引用的 shared_ptr 实例:

主要是:

shared_ptr< classA > sharedptr ( new classA );
ClassA &ref = *sharedptr;
ClassB B;
B.add(ref);

有没有办法实现 add 函数来接受一个解除引用的共享指针并将其转换为初始共享指针?然后将其推回到矩阵中?

这就是我想要做的:

void ClassB::add(classA &ref) {
    shared_ptr< classA > ptr = &ref;
    vector.push_back( ptr );
}

注意 1: 当将 classA 添加到 vector 时,我希望共享指针计数增加 1。我不需要创建另一个共享指针,我想“找到”对象以前拥有的共享指针。

注意 2:我不能使用 make_shared 因为我目前在 tr1

最佳答案

通常您不能只是“查找” 指向对象的指针,因为没有任何东西可以跟踪是否指向特定对象。您应该自己设计这种机制或使用标准库提供的机制:enable_shared_from_this .

第 1 步:从 std::enable_shared_from_this 派生您的类并提供一个成员函数来获取指针:

#include <memory>

struct ClassA: std::enable_shared_from_this<ClassA>
{
    std::shared_ptr<ClassA> get_pointer() 
    {
        return shared_from_this();
    }
    //...
};

第 2 步:确保要获取指针的所有对象都由 shared_ptr 管理:

std::shared_ptr<ClassA> original_ptr(new ClassA);

第 3 步:每当您想要获取指向对象的共享指针时,调用第 1 步中定义的函数:

void ClassB::add(classA& ref) {
    shared_ptr<classA> ptr = ref.get_pointer();
    vector.push_back( ptr );
}

关于c++ - 从共享指针的取消引用值中获取共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46382838/

相关文章:

python - 在 C++ 中保存数据,从 Python 加载 - 推荐的数据格式

c - 读写动态分配的内存

c++ - Streams 中的内联忽略

c++ - std::priority_queue 和 make_heap API 设计

c++ - 删除数组指针堆损坏

C# 从数组返回对象留下指向数组项的指针

android - 将静态变量保留更长的时间 - Android

java - 在特定时间点释放 Java 内存

c++ - std::map std::find 问题

c - 访问传递给函数的结构成员变量