【问题标题】:How can I use Move constructor instead of Move assignment operator in my own class Vector?如何在我自己的类 Vector 中使用 Move 构造函数而不是 Move 赋值运算符?
【发布时间】:2025-12-10 16:10:02
【问题描述】:

我有自己的 Vector 类,它实现了 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;
    }

在方法 push_back(T&& v) 中一行

buffer[size++] = std::move(v);

使用移动赋值运算符。 如何更改代码以使其使用 Move 构造函数?

【问题讨论】:

    标签: c++ c++11 vector move-semantics


    【解决方案1】:

    使用placement new:

    new (&buffer[size++]) T (std::move(v));
    

    这是一个完整的例子:http://cpp.sh/6s4i3

    【讨论】:

    • 感谢您的回答,但我有一个错误:4 个重载函数都不能转换参数
    • 不确定您使用的是什么编译器。这是一个工作示例:cpp.sh/8m4by
    • 当我们在 main() 中实际 instantiate the vector 时,您的示例无法编译。
    • 抱歉,buffer 之前需要一个 &amp;。更新了我的答案。
    【解决方案2】:

    我正在移动球,但如果有对你有用的东西

    #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);
            }
    
        }
    }
    
    };
    

    【讨论】:

      最近更新 更多