2017-03-26 3 views
1

Ich habe Vector meine eigene Klasse, die Konstruktor implementiert verschieben, Zuweisungsoperator und Methode push_back für rvalue BewegenWie kann ich Move-Konstruktor statt Move-Zuweisungsoperator in meiner eigenen Klasse Vector verwenden?

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

In Verfahren push_back (T & & v) die Linie

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

Anwendungen verschieben Zuweisungsoperator . Wie kann ich den Code ändern, so dass er Move Konstruktor verwendet?

Antwort

3

Verwendung placement new:

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

Hier ist ein komplettes Beispiel: http://cpp.sh/6s4i3

+0

Dank für Ihre Antwort, aber ich habe einen Fehler: Keine der 4 Überladungsfunktionen kann Argumente konvertieren – user456

+0

Nicht sicher, welchen Compiler Sie verwenden. Hier ist ein funktionierendes Beispiel: http://cpp.sh/8m4by –

+0

Ich benutze Visual Studio 2015 gerade – user456

0

i Ball bewegte sich aber, wenn es etwas nützlich für Sie

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

    } 
} 

}; 
Verwandte Themen