C++ 如何在自己的类向量中使用移动构造函数而不是移动赋值运算符?
我有自己的类向量,它为右值实现了Move构造函数、Move赋值运算符和方法push_backC++ 如何在自己的类向量中使用移动构造函数而不是移动赋值运算符?,c++,c++11,vector,move-semantics,C++,C++11,Vector,Move Semantics,我有自己的类向量,它为右值实现了Move构造函数、Move赋值运算符和方法push_back template<typename T> class Vector { private: T* buffer; size_t size; size_t capacity; public: Vector(size_t s) { size = 0; capacity = s; buffer = new
template<typename T>
class Vector
{
private:
T* buffer;
size_t size;
size_t capacity;
public:
Vector(size_t s) {
size = 0;
capacity = s;
buffer = new T[capacity];
}
//Move constructor
Vector(Vector&& tmp): buffer(tmp.buffer),
size(tmp.size),
capacity(tmp.capacity)
{
tmp.buffer = nullptr;
}
//Move assignment operator
Vector& operator=(Vector&& tmp) {
size = tmp.size;
capacity = tmp.capacity;
buffer = std::move(tmp.buffer);
tmp.buffer = nullptr;
return *this;
}
void push_back(const Vector<T>& v) {
if (size >= capacity)
reserve(capacity + 5);
buffer[size++] = v;
}
//push_back for rvalue
void push_back(T&& v) {
if (size >= capacity)
reserve(capacity + 5);
buffer[size++] = std::move(v);
}
~Vector() {
delete[] buffer;
}
使用移动赋值运算符。
如何更改代码以使其使用Move Constructor 使用:
这里有一个完整的例子:我在移动球,但如果有什么对你有用的东西
#pragma once
class movement
{
private:
Ball *b;
int size;
public:
movement(void)
{
size=0;
}
Ball getBall(int i)
{
return b[i];
}
void insertBall(Ball n)
{
Ball *temp=new Ball[size+1];
for (int i = 0;i<size; i++)
{
temp[i]=b[i];
}
temp[size]=n;
delete []b;
b=temp;
size++;
}
void update(Ball food,Ball b)
{
for (int i = 0; i < size; i++)
{
//if ((b->getPoint().getX() == b->getPoint().getY())
if (food.getPoint().getX == b.getPoint().getX() && food.getPoint().getY == b.getPoint().getY())
{
insertBall(b);
}
}
}
};
#pragma一次
阶级运动
{
私人:
球*b;
整数大小;
公众:
移动(无效)
{
尺寸=0;
}
球球(国际一级)
{
返回b[i];
}
空心插入球(球n)
{
球*温度=新球[尺寸+1];
对于(inti=0;igetPoint().getX()==b->getPoint().getY())
如果(food.getPoint().getX==b.getPoint().getX()&&food.getPoint().getY==b.getPoint().getY())
{
嵌入球(b);
}
}
}
};
谢谢您的回答,但我有一个错误:4个重载函数都不能转换参数。我不确定您使用的编译器是什么。这里有一个工作示例:当我们实际使用main()时,您的示例没有编译。很抱歉,您需要在缓冲区之前使用&
。更新了我的答案。
new (&buffer[size++]) T (std::move(v));
#pragma once
class movement
{
private:
Ball *b;
int size;
public:
movement(void)
{
size=0;
}
Ball getBall(int i)
{
return b[i];
}
void insertBall(Ball n)
{
Ball *temp=new Ball[size+1];
for (int i = 0;i<size; i++)
{
temp[i]=b[i];
}
temp[size]=n;
delete []b;
b=temp;
size++;
}
void update(Ball food,Ball b)
{
for (int i = 0; i < size; i++)
{
//if ((b->getPoint().getX() == b->getPoint().getY())
if (food.getPoint().getX == b.getPoint().getX() && food.getPoint().getY == b.getPoint().getY())
{
insertBall(b);
}
}
}
};