No heredarás de std::vector
Ok, esto es realmente difícil de confesar, pero en este momento tengo una fuerte tentación de heredar std::vector
.
Necesito alrededor de 10 algoritmos personalizados para vectores y quiero que sean miembros directos del vector. Pero, naturalmente, también quiero tener el resto de std::vector
la interfaz. Bueno, mi primera idea, como ciudadano respetuoso de la ley, fue tener un std::vector
miembro en MyVector
la clase. Pero luego tendría que volver a proporcionar manualmente toda la interfaz std::vector. Demasiado para escribir. A continuación, pensé en la herencia privada, de modo que en lugar de volver a proporcionar métodos escribiera un montón de using std::vector::member
's' en la sección pública. En realidad, esto también es tedioso.
Y aquí estoy, realmente creo que puedo simplemente heredar públicamente de std::vector
, pero proporciono una advertencia en la documentación de que esta clase no debe usarse polimórficamente. Creo que la mayoría de los desarrolladores son lo suficientemente competentes como para entender que esto no debería usarse polimórficamente de todos modos.
¿Es mi decisión absolutamente injustificable? Si es así, ¿por qué? ¿Puede proporcionar una alternativa que tenga miembros adicionales que sean realmente miembros pero que no implique volver a escribir toda la interfaz del vector? Lo dudo, pero si puedes, seré feliz.
Además, aparte del hecho de que algún idiota puede escribir algo como
std::vector<int>* p = new MyVector
¿ Existe algún otro peligro realista al usar MyVector? Al decir realista descarto cosas como imaginar una función que toma un puntero a un vector...
Bueno, he expuesto mi caso. He pecado. Ahora depende de ti perdonarme o no :)
En realidad, no hay nada de malo en la herencia pública de std::vector
. Si necesitas esto, hazlo.
Sugeriría hacerlo sólo si es realmente necesario. Sólo si no puedes hacer lo que quieres con funciones gratuitas (por ejemplo, debes mantener algún estado).
El problema es que MyVector
es una entidad nueva. Significa que un nuevo desarrollador de C++ debe saber qué diablos es antes de usarlo. ¿ Cuál es la diferencia entre std::vector
y MyVector
? ¿Cuál es mejor usar aquí y allá? ¿Qué pasa si necesito std::vector
mudarme MyVector
? ¿Puedo usarlo swap()
o no?
No produzca nuevas entidades sólo para hacer que algo se vea mejor. Estas entidades (especialmente las tan comunes) no van a vivir en el vacío. Vivirán en un ambiente mixto con una entropía en constante aumento.
Todo el STL fue diseñado de tal manera que los algoritmos y los contenedores están separados .
Esto llevó a un concepto de diferentes tipos de iteradores: iteradores constantes, iteradores de acceso aleatorio, etc.
Por lo tanto, le recomiendo que acepte esta convención y diseñe sus algoritmos de tal manera que no les importe cuál es el contenedor en el que están trabajando , y solo requerirían un tipo específico de iterador que necesitarían para realizar su operaciones.
Además, permítanme redirigirlos a algunos buenos comentarios de Jeff Attwood .