He buscado pero no puedo encontrar la respuesta a "Cuando" para usarlos. Sigo oyendo que es bueno porque me ahorra esa copia extra. Fui por ahí poniéndolo en cada clase que tenía pero de alguna manera no parecía tener sentido para algunas clases: S He leído innumerables tutoriales sobre LValues y RValues y std :: move vs. std :: copy vs. memcpy frente a memmove, etc. e incluso lee en throw() pero no estoy seguro de cuándo usar eso tampoco.Cuándo usar Mover Constructores/Asignaciones
Mi código es el siguiente:
struct Point
{
int X, Y;
Point();
Point(int x, int y);
~Point();
//All my other operators here..
};
Entonces tengo una matriz de clase de que al igual que (cosa sorta RAII):
class PA
{
private:
std::vector<Point> PointsList;
public:
PA();
//Variadic Template constructor here..
~PA();
//Operators here..
};
¿Debo utilizar un constructor mover y copiar el constructor? Lo tenía en la clase Point pero me pareció raro, así que lo eliminé. Luego lo tuve en la clase PA, pero pensé que no haría mucho, así que también lo eliminé. Luego, en mi clase de mapas de bits mi compilador se quejaba de tener miembros de puntero, pero no sobrecarga por lo que hice:
//Copy Con:
BMPS::BMPS(const BMPS& Bmp) : Bytes(((Bmp.width * Bmp.height) != 0) ? new RGB[Bmp.width * Bmp.height] : nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
std::copy(Bmp.Bytes, Bmp.Bytes + (width * height), Bytes);
BMInfo = Bmp.BMInfo;
bFHeader = Bmp.bFHeader;
}
//Move Con:
BMPS::BMPS(BMPS&& Bmp) : Bytes(nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
Bmp.Swap(*this);
Bmp.Bytes = nullptr;
}
//Assignment:
BMPS& BMPS::operator = (BMPS Bmp)
{
Bmp.Swap(*this);
return *this;
}
//Not sure if I need Copy Assignment?
//Move Assignment:
BMPS& BMPS::operator = (BMPS&& Bmp)
{
this->Swap(Bmp);
return *this;
}
//Swap function (Member vs. Non-member?)
void BMPS::Swap(BMPS& Bmp) //throw()
{
//I was told I should put using std::swap instead here.. for some ADL thing.
//But I always learned that using is bad in headers.
std::swap(Bytes, Bmp.Bytes);
std::swap(BMInfo, Bmp.BMInfo);
std::swap(width, Bmp.width);
std::swap(height, Bmp.height);
std::swap(size, Bmp.size);
std::swap(bFHeader, Bmp.bFHeader);
}
Es esto correcto? ¿Hice algo malo o incorrecto? ¿Necesito tirar()? ¿Deberían mis operadores de asignación y movimiento ser los mismos? ¿Necesito una tarea de copia? Ahh tantas preguntas: c El último foro en el que pregunté no pudo responder a todas las preguntas, por lo que me quedé confundido. Finalmente, ¿debería usar unique_ptr para Bytes? (Que es una matriz de bytes/píxeles.)
Esto definitivamente me hizo comenzar y pensar. No respondió algunas de las preguntas para las que me hubiera gustado obtener respuestas específicas, pero es más que suficiente para comenzar a aprender por mí mismo. Muchas gracias. – Brandon