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 hacer una herencia correcta de contenedores STL en C++?

Considere este fragmento de código:

struct MY_VECTOR : public vector<vector<int>> 
{
    int n = this->size();
    int m = (*this)[0].size(); //<== fixed   this[0].size()
    int at(int i, int j)
    {
        if (i < 0 || j < 0 || i >= n || j >= m)
            return 0;
        else
            return (*this)[i][j];
    }
};

Quiero acceder a los elementos, pero sin lanzar excepciones. (Podría haber sobrecargado el operador [], pero no es relevante para mí en este momento). En primer lugar, nunca he intentado heredar de los contenedores STL, así que ni siquiera estoy seguro de si está bien hacerlo. (Ya he leído que es generalmente una mala idea, pero al menos quiero intentarlo). En segundo lugar, ni siquiera estoy seguro de que todo funcione correctamente, porque como ya he dicho, nunca he intentado hacer tales cosas. Así que intenté crear un objeto MY_VECTOR y llamar al constructor.

struct MY_VECTOR : public vector<vector<int>>
{
    int n = this->size();
    int m = (*this)[0].size();
    int at(int i, int j)
    {
        if (i < 0 || j < 0 || i >= n || j >= m)
            return 0;
        else
            return (*this)[i][j];
    }
};

int main()
{
    int n;
    cin >> n;
    MY_VECTOR a(n, vector<int>(n));
}

Y no compila y no entiendo por qué. ¿No debe heredarse el constructor de vector<><int>>? ¿O hay un problema diferente que no veo?

Error del compilador: “Error E0289: No existe ninguna instancia del constructor “MY_VECTOR::MY_VECTOR” que coincida con la lista de argumentos”.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que MY_VECTOR intenta heredar de vector<><int>>, que no tiene un constructor que tome dos argumentos (en este caso n y un vector de int). Por lo tanto, al intentar crear un objeto de MY_VECTOR con estos argumentos, el compilador no puede encontrar un constructor coincidente y arroja un error.

    Para solucionar esto, una solución podría ser definir un constructor en MY_VECTOR que tome los mismos argumentos que el constructor de vector<><int>> y los pase al constructor de la clase base utilizando la lista de inicialización. Por ejemplo:

    struct MY_VECTOR : public vector<><int>>
    {
        int n;
        int m;
    
        MY_VECTOR(int n, vector<int> v) : vector<><int>>(n, v), n(n), m(v.size()) {}
    
        int at(int i, int j)
        {
            if (i < 0 || j < 0 || i >= n || j >= m)
                return 0;
            else
                return (*this)[i][j];
        }
    };
    

    Este código define un constructor en MY_VECTOR que toma n y un vector de int, que se pasan al constructor de la clase base utilizando la lista de inicialización. También establece los valores de n y m en función del tamaño del objeto construido.

    Con esto, debería poder crear un objeto de MY_VECTOR con los mismos argumentos que un vector<><int>> y acceder a sus elementos sin lanzar ninguna excepción.

Comments are closed.