Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在自己的类向量中使用移动构造函数而不是移动赋值运算符?_C++_C++11_Vector_Move Semantics - Fatal编程技术网

C++ 如何在自己的类向量中使用移动构造函数而不是移动赋值运算符?

C++ 如何在自己的类向量中使用移动构造函数而不是移动赋值运算符?,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

我有自己的类向量,它为右值实现了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 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);
        }

    }
}

};