gpt4 book ai didi

c++ - 避免使用禁用的复制构造函数进行隐式复制

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:20 28 4
gpt4 key购买 nike

假设你有一个类 NonCopyable

class NonCopyable
{
public:
NonCopyable(int n){}
~NonCopyable(){}
[...]

private:
[members...]

private:
NonCopyable( const NonCopyable& ); //disabled (no definition)
NonCopyable& operator= ( const NonCopyable& ); //disabled (no definition)
};

对于这个类,拥有它的拷贝是不合逻辑的,因此复制构造函数和赋值运算符被禁用。

但是,当您需要 NonCopyables 对象的 vector 时:

std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable(n));

在这里,您隐式调用复制构造函数。

我被教导通过使用指向这些对象的指针而不是对象本身来解决这个问题。但这在使用和性能上都很烦人,因为您必须使用 new() 动态分配这些对象...

我的问题:有没有解决的办法?这个问题的常见解决方案是什么?

最佳答案

C++11 有一个适用于许多不可复制类的解决方案:使类可移动(而不是可复制),并使用 emplace_back 向 vector 添加新元素。

如果你需要用 C++03 捏造一些东西,也许你可以找到一种方法来实现“空”NonCopyable 对象的复制(并使用 Luchian 限制此操作的想法),并且还可以找到一种方法来实现 交换。然后你可以这样做:

std::vector<NonCopyable> m_V;
int n;
m_V.push_back(NonCopyable());
NonCopyable(n).swap(m_V.back());

关于c++ - 避免使用禁用的复制构造函数进行隐式复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963204/

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