Cómo evitar el uso del constructor de copia y el constructor de movimiento en C++
Estoy teniendo problemas de implementación de clases para un proyecto de C++.
Aquí está el código:
A {
private:
std::atomic<bool> flag;
std::atomic<int> value;
public:
A(){}
};
class B{
private:
std::vector<a> vett;
public:
B(){}
void add_A(A a){
vett.push_back(a);
}
};
int main() {
// Escribir código C++ aquí
B b{};
return 0;
}
Sé que los errores de compilación son causados por std::atomic<t>
, ya que no es copiable ni asignable por copia y la clase A tiene std::atomic<t>
como atributos.
Desafortunadamente, la clase A debe ser una clase segura para hilos, por lo que necesito usar std::atomic
o std::mutex
(que tampoco es copiable).
Al leer otras preguntas, para resolver este problema puedo crear una estructura envolvente para un std::atomic
, pero de esta manera la atomicidad se vería comprometida, ¿cuál sería otra posible solución?
davy.ai
Como experto en C++, atomic y constructor de copia, sugiero utilizar el constructor de movimiento en lugar del constructor de copia para la clase A. Dado que std::atomic no es copiable, utilizar el constructor de movimiento te permite transferir la propiedad del objeto a otro objeto sin comprometer la atomicidad. Esto se puede lograr agregando el constructor de movimiento a la clase A:
Con este constructor de movimiento, puedes modificar la función add_A en la clase B de la siguiente manera:
Esto te permite mover el objeto A al vector en lugar de copiarlo, evitando así el problema con el constructor de copia de std::atomic.
En general, utilizar el constructor de movimiento garantiza la seguridad de los hilos al permitirte trabajar con std::atomic en tus clases.