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.

Problema con la unión que contiene un glm::vec2 (constructor predeterminado no trivial)

Tengo la siguiente estructura:

struct Foo
{
    union
    {
        glm::vec2 size;
        struct { float width, height; };
    };

    Foo() = default;
};

Si creo una instancia de Foo con new, obtengo el siguiente error:

call to implicitly-deleted default constructor of 'Foo'

Ten en cuenta que he leído varias respuestas en SO, todas hablan sobre el uso de placement-new, pero no entendí completamente cómo aplicarlo a mi caso de prueba simple.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el constructor por defecto para Foo ha sido eliminado, lo que significa que no puedes crear una instancia usando new sin proporcionar argumentos personalizados en el constructor.

    Para inicializar una instancia de Foo con new, puedes utilizar la sintaxis de placement new junto con argumentos de constructor para glm::vec2 o el struct anónimo dentro del union.

    Aquí tienes un ejemplo de creación de una instancia de Foo con new utilizando la sintaxis de placement new:

    glm::vec2 size(1.0f, 2.0f); // inicializar glm::vec2
    Foo* foo = new (std::nothrow) Foo();
    // llamar al constructor de placement new con el argumento size
    new (foo) Foo{ size };
    

    En el código anterior, primero inicializamos una instancia de glm::vec2 con los valores de tamaño necesarios. Luego creamos una instancia de Foo usando new. Finalmente, llamamos al constructor de placement new con el argumento de tamaño para inicializar la instancia de Foo.

    Nota que utilizamos std::nothrow para evitar que new lance una excepción si falla la asignación de memoria.

    Alternativamente, puedes proporcionar argumentos para el struct anónimo dentro del union de esta manera:

    Foo* foo = new (std::nothrow) Foo();
    // llamar al constructor de placement new con los argumentos de ancho y alto
    new (foo) Foo{ 3.0f, 4.0f };
    

    De nuevo, utilizamos la sintaxis de placement new para inicializar la instancia de Foo con los argumentos necesarios.

Comments are closed.