修改unique_ptr的目标并初始化使用它的常量unique_ptr

Modifying unique_ptr's target and also initializing a const unique_ptr with it

本文关键字:ptr unique 常量 目标 修改 初始化      更新时间:2023-10-16

假设class OwnerMember member,它还必须有一个指向其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的构造函数都没有编译。我该怎么做?原则上似乎没有理由让我不能这样做。

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

委托构造函数来救援:

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;
};