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.

¿Cuál es la mejor manera de copiar un std::array pasado como parámetro?

He estado trabajando en un juego escrito con C++ y SDL2 en mi tiempo libre y estoy refinando algunas de mis clases base para objetos dibujables. Estos objetos tienen una posición (x e y) y un tamaño (ancho y alto). Tiene más sentido para mí almacenar estos objetos en un arreglo de tamaño fijo, así que he estado utilizando std::array para contener estos valores en mi clase ya que la longitud es fija. Sin embargo, estoy un poco confundido sobre cómo debo copiar el std::array que paso como parámetros al constructor (y en mis métodos setter también).

Así es como lo tengo ahora:

class Drawable {
    protected:
        std::array<float, 2=""> position;
        std::array<int, 2=""> drawsize;
        SDL_Texture* texture;
    public:
        // constructor
        Drawable(const std::array<float, 2="">& pos, const std::array<int, 2="">& size, SDL_Texture* text);

        // setters
        void set_pos(const std::array<float, 2="">& pos) { position = pos; }
        void set_size(const std::array<int, 2="">& size) { drawsize = size; }
};

Drawable::Drawable(const std::array<float, 2="">& pos, const std::array<int, 2="">& size, SDL_Texture* text) {
    position = pos; // ¿así?
    drawsize = size; // ???
    texture = text;
}

Estoy omitiendo muchos detalles innecesarios de la clase anterior para enfocarme en el problema principal sobre el que estoy preguntando.

Estoy confundido ya que he leído que se puede copiar std::array con asignación (por ejemplo, std::array<int, 5=""> arr2 = arr1;), pero no estoy seguro si eso es lo mismo cuando se pasa un arreglo como una referencia constante como tengo (con const std::array<int, 2="">& arr). Dado que de todos modos estoy copiando el arreglo, ¿tiene sentido pasar arreglos por referencia constante? Dado que solo tienen longitud 2, he pensado en simplemente copiar cada elemento en la variable miembro, pero si hay una solución más legible, la agradezco.

Soy relativamente nuevo en C++ y en los contenedores de la biblioteca estándar. Esto es principalmente para aprender más y divertirme :^)</int,></int,></int,></float,></int,></float,></int,></float,></int,></float,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Cuando pasas un std::array como una referencia constante, significa que estás pasando una referencia de solo lectura al array y la función no podrá modificar el contenido del array. En tu constructor, estás utilizando correctamente referencias constantes para asegurarte de que los valores pasados no sean modificados pero puedan ser utilizados para inicializar el objeto.

    Dado que deseas copiar los arrays pasados, puedes asignarlos directamente a las variables miembro de esta manera:

    position = pos;
    drawsize = size;
    texture = text;
    

    Esto copiará el contenido de los arrays pasados a las variables miembro del objeto.

    Vale la pena señalar que pasar arrays pequeños como estos por valor en lugar de por referencia constante puede ser más eficiente, ya que el compilador puede optimizar mejor el código, especialmente si la función se llama con frecuencia. Sin embargo, pasarlos por referencia puede ser útil en algunos casos, especialmente cuando se trata de arrays grandes que llevarían mucho tiempo copiar.

    En general, tu código se ve bien para lo que estás tratando de lograr, y el uso de std::array es una buena elección para arrays de tamaño fijo. ¡Sigue aprendiendo y divirtiéndote!

Comments are closed.