¿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”.
davy.ai
El problema con el código es que
MY_VECTOR
intenta heredar devector<><int>>
, que no tiene un constructor que tome dos argumentos (en este cason
y un vector deint
). Por lo tanto, al intentar crear un objeto deMY_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 devector<><int>>
y los pase al constructor de la clase base utilizando la lista de inicialización. Por ejemplo:Este código define un constructor en
MY_VECTOR
que toman
y un vector deint
, que se pasan al constructor de la clase base utilizando la lista de inicialización. También establece los valores den
ym
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 unvector<><int>>
y acceder a sus elementos sin lanzar ninguna excepción.