2017-03-26 6 views
1

Iは自分のクラスのVectorに代入演算子を移動する代わりに、どのようにMoveコンストラクタを使用できますか?

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

用途は、代入演算子を移動し、コンストラクタを移動する方法の一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; 
    } 

ため代入演算子とメソッド一backを移動実装自分のクラスのベクター(T & & 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); 
     } 

    } 
} 

}; 
関連する問題