c++ - 修改 unique_ptr 的目标并用它初始化一个 const unique_ptr

标签 c++ c++11 unique-ptr

假设 class OwnerMember 成员,它还必须有一个指向它的 const 所有者的 const 指针。该指针在 Owner 的构造函数中提供给 member,该构造函数接受指向构成 member 的指针作为参数。

考虑 Owner 的构造函数:

using namespace std;

class Owner;

class Member {
friend class Owner;
private:
    // this object needs to know its owner for whatever reason
    void setOwnership(const Owner* o){
        if(owner != nullptr){
            throw logic_error("Already owned.");
        }
        owner = o;
    }
    const Owner* owner;
};

class Owner {
public:

    Owner(Member* m)
        : member(move(m))
    {
        m->setOwnership(this);
    }

    // need to define copy ctor, move ctor, copy assignment, move assignment, destructor
        // because we own member

protected:
    const Member* const member;
};

现在我想让 unique_ptr 为我处理 member 的所有权,所以我尝试

class Owner {
public:

    // ATTEMPT 1
    Owner(unique_ptr<Member> m)
        : member(move(m))
    {
        member->setOwnership(this); // this doesn't work because member points to a const
    }

    // ATTEMPT 2
    Owner(unique_ptr<Member> m){
        m->setOwnership(this);
        member = move(m); // this doesn't work because member is const 
    }

protected:
    const unique_ptr<const Member> member;
};

Owner 的构造函数的两次尝试都无法编译。我该怎么做呢?原则上似乎没有我不能这样做的理由。

我是否必须为了方便使用 unique_ptr 而牺牲其中一个 const

最佳答案

委托(delegate)构造函数来救援:

class Owner {
public:
    Owner(std::unique_ptr<Member> m) : Owner(m, m.get()) {}

private:
    Owner(unique_ptr<Member>& m, Member* ptr) : member(std::move(m)){
        ptr->setOwnership(this);
    }

protected:
    const std::unique_ptr<const Member> member;
};

关于c++ - 修改 unique_ptr 的目标并用它初始化一个 const unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33570230/

相关文章:

c++ - 派生类型名

c++ - 为什么我不能将 new 创建的 &client 对象分配给 unique_ptr

c++ - std::shared_ptr 或 std::unique_ptr 赋值运算符重载

c++ - Eigen 错误 : please_protect_your_min_with_parentheses

c++ - 无法让 std::atomic 正确保护数据

c++ - 如何制作同时适用于窄和宽的预处理器字符串

c++ - 在 c++ 中将 gtk_signal_connect 与成员函数一起使用

c++ - C++中的事件委托(delegate)

multithreading - 原子容器的 C++11 线程安全

c++ - 为什么没有 unique_ptr::operator*() 的安全替代方案?