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 gestionas una matriz en una clase de plantilla (con la longitud de la matriz como parámetro) que tiene llamadas de función recursiva?

Este es un extracto de mi código:


#include <iostream> using namespace std; class Exception { }; template <int row_length=""> class IntContainer { private: int mem[row_length]; public: IntContainer() { for (int i = 0; i < row_length; i++) mem[i] = i; } ~IntContainer() {} int get_det() { if (row_length == 2) return mem[0] + mem[1]; else if (row_length == 1) return mem[0]; else return get_cofactor(); } int get_cofactor() { if (row_length == 1) throw Exception(); IntContainer<row_length -="" 1=""> temp; return temp.get_det(); } }; int main() { IntContainer<5> ic1; cout << ic1.get_det(); }

Al compilarlo con g++, obtengo el siguiente error:

error: el tamaño '18446744073709551615' del array excede el tamaño máximo del objeto '9223372036854775807'
11|  int mem[row_length];

¿Qué debo hacer para manejar el array sin un error de compilación (lo manejo correctamente en las funciones)?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que el valor de row_length es demasiado grande para que el compilador maneje. row_length es un parámetro de plantilla para la clase IntContainer y determina el tamaño del array mem.

    Para manejar el array sin error de compilación, puedes reducir el valor de row_length o cambiar la implementación de IntContainer para asignar memoria de forma dinámica en lugar de utilizar un array estático.

    Para reducir el valor de row_length, puedes modificar la función main para instanciar la clase IntContainer con un valor más pequeño, de la siguiente manera:

    IntContainer<3> ic1; // instanciar IntContainer con row_length=3
    cout << ic1.get_det();
    

    Alternativamente, puedes cambiar IntContainer para usar memoria asignada de forma dinámica. Aquí tienes un ejemplo de implementación:

    template <int row_length="">
    class IntContainer
    {
    private:
        int* mem;
    
    public:
        IntContainer()
        {
            mem = new int[row_length];
            for (int i = 0; i < row_length; i++) mem[i] = i;
        }
    
        ~IntContainer()
        {
            delete[] mem;
        }
    
        // resto de la implementación de la clase ...
    };
    

    Con esta implementación, mem se asigna dinámicamente utilizando el operador new y el operador delete se utiliza para liberar la memoria cuando se destruye el objeto. Esto te permite gestionar el tamaño del array de forma dinámica en tiempo de ejecución, en lugar de depender de un parámetro de plantilla.

Comments are closed.