gpt4 book ai didi

c++ - 在 unique_ptr 中显式调用对象的复制构造函数

转载 作者:行者123 更新时间:2023-11-30 01:03:21 24 4
gpt4 key购买 nike

我使用带有 const std::unique_ptr 的 pimpl 习惯用法来保存类实现。我的类(class)需要支持复制构造和复制分配。我想做的是在 unique_ptr 中手动调用 impl 类的复制构造函数。但是,我看不出如何。

#include <memory>

struct potato {
potato();
~potato();
potato(const potato& p);

private:
struct impl;
const std::unique_ptr<impl> _pimpl;
};

struct potato::impl {
int carbs = 42;
};

potato::potato()
: _pimpl(std::make_unique<impl>()) {
}

potato::~potato() = default;

potato::potato(const potato& p) {
// Try to call the copy constructor of impl, stored in unique_ptr, not the
// unique_ptr copy-constructor (which doesn't exist).
_pimpl.get()->impl(p._pimpl); // This doesn't work.
}

我已经检查了另一个关于在对象上显式调用复制构造函数的问题。一个答案建议使用 placement new。

Object dstObject;
new(&dstObject) Object(&anotherObject);

我可以在我的复制构造函数中使用它吗?如果是这样,如何?我真的不明白那里发生了什么。谢谢。

最佳答案

What I'd like to do is manually call the copy constructor of the impl class inside the unique_ptr

这是你的错误。当您在 potato 的(复制)构造函数中时,没有已经构建的 impl 对象,您必须在其上“手动”调用复制构造函数。

只需构造您的新 impl 并将对要复制的原始 impl 的引用传递给它。

potato::potato(const potato& p)
: _pimpl(std::make_unique<impl>(*p._pimpl) {
}

至于赋值,你可以轻松转发到impl赋值运算符:

potato &operator=(const potato &p) {
*_pimpl = *p._pimpl;
return *this;
}

关于c++ - 在 unique_ptr 中显式调用对象的复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53677094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com