No heredarás de std::vector

Resuelto Armen Tsirunyan asked hace 13 años • 13 respuestas

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::vectorla interfaz. Bueno, mi primera idea, como ciudadano respetuoso de la ley, fue tener un std::vectormiembro en MyVectorla 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 :)

Armen Tsirunyan avatar Dec 04 '10 18:12 Armen Tsirunyan
Aceptado

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 MyVectores 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::vectory MyVector? ¿Cuál es mejor usar aquí y allá? ¿Qué pasa si necesito std::vectormudarme 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.

Stas avatar Dec 04 '2010 11:12 Stas

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 .

Kos avatar Dec 04 '2010 16:12 Kos