2017-03-26 105 views
1

我有我自己的类载体,它实现了移动的构造,移动赋值操作符和方法的push_back为右值如何在我自己的类Vector中使用Move构造函数而不是Move赋值运算符?

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构造函数?

回答

3

使用placement new

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

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

+0

感谢您的答案,但我有错误:4个重载函数都不能转换参数 – user456

+0

不确定你使用的编译器。这里是一个工作示例:http://cpp.sh/8m4by –

+0

我现在正在使用Visual Studio 2015 – user456

0

我在动球,但如果有一些有用的给你

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

    } 
} 

}; 
相关问题