可以将对象从向量A移至向量B,而不是从B转移到A
Can move object from vector A to vector B, but not from B to A?
我有一个具有对象向量的类。所讨论的对象已删除复制构造函数和复制分配运算符,因此它们具有移动构造函数和移动分配运算符,以允许它们与向量一起使用。将对象保存的类具有附加和提取方法,该方法允许对象从缓冲区中将对象附加到"对象向量"或从类"对象向量向量向buffer提取到缓冲区的"对象向量。
对象定义看起来像这样:
struct MyObject
{
int width_ = 0;
int height_ = 0;
//etc...
stImage() = default;
stImage(int width, int height, ...)
{
width_ = width;
height_ = height;
//etc...
}
stImage(const stImage& rhs) = delete;
stImage& operator= (const stImage & rhs) = delete;
stImage(stImage&& rhs) : width_(0), height_(0), ...
{
*this = std::move(rhs);
}
stImage& operator=(stImage&& rhs)
{
if (this != &rhs)
{
width_ = rhs.width_;
height_ = rhs.height_;
//etc...
rhs.width_ = 0;
rhs.height_ = 0;
//etc...
}
return *this;
}
};
附加方法编译:
void MyClass::append(MyObject * buffer)
{
data_.push_back(std::move(*buffer));
}
void MyClass::append(Vector<MyObject> * buffer)
{
for (int i = 0; i < (*buffer).size(); i++)
{
data_.push_back(std::move((*buffer)[i]));
}
}
但是,提取方法没有:
void MyClass::extract(it8 start, Length length, Vector<MyObject> * buffer) const
{
for (it8 i = start; i < (start + length); i++)
{
(*buffer).push_back(std::move(data_[i]));
}
}
给出的错误是" C2280'MyObject :: myObject(const myobject&amp;)':尝试引用已删除的函数"
我看不出为什么这两个操作在功能上彼此不同。任何对提取物的失败和附加原因的见解都不会受到赞赏,并且一种使提取工作工作的方法将更加如此。
(注意:向量是STD :: vector的自定义实现,因为原因,但据我所知,它们的作用相同。如果这可能是问题,并且STD :: vector可以很好地适应在他们站立时附加/提取物,我想我会看看是否可以。)
extract
是const成员函数,在const成员函数中,每个引用成员变量的参考均为const。当您访问data_[i]
时,返回数据类型为const MyObject&
。
std::move
只需将其输入到R值参考,在您的情况下,std::move
的返回类型为 const MyObject&&
,但是由于对象具有const
限定符,因此push_back
的选择过载将为push_back(const T&)
。
您可以使用const_cast
从data_
中删除const
,但这不是最好的解决方案。也可以使用mutable
关键字,但是最好的解决方案是将您的函数声明为非const函数,因为它正在修改对象内部状态。
constness。"提取"从data_中删除,因此不能const。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 如何将元素从向量转移到新数组?
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 如何将所有权从一个共享指针向量转移到另一个向量?
- 如何按升序将偶数从向量 a 转移到向量 b?
- 可以将对象从向量A移至向量B,而不是从B转移到A