es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    A(A&& other) 
        : flag(other.flag.load()), value(other.value.load()) {}
    

    Con este constructor de movimiento, puedes modificar la función add_A en la clase B de la siguiente manera:

    void add_A(A&& a){
        vett.push_back(std::move(a));
    }
    

    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.

Comments are closed.