Pregunta

¿Cuál es la mejor manera de poner una clase contenedor o alguna otra clase dentro de una clase como miembro privado o público?

Requisitos:

1.Vector < someclass > dentro de mi clase

2. Agregar y contar la interfaz del vector es necesaria

¿Fue útil?

Solución

Si el estado del contenedor es parte del invariante de la clase, entonces, si es posible, debería ser privado.

Por ejemplo, si el contenedor representa un vector tridimensional, entonces parte de la invariante podría ser que siempre contiene exactamente 3 números. Exponerlo como miembro público permitiría que el código externo a la clase cambie el tamaño de los contenedores, lo que a su vez podría causar problemas para cualquier rutina que requiera que el tamaño del contenedor sea constante. Mantener el contenedor privado limita los lugares en su software donde el tamaño del contenedor se puede modificar a las funciones miembro de la clase.

Otros consejos

Si un miembro se declara Privado o Público depende completamente de su aplicación. ¿Podría darnos más detalles?

Un punto importante para recordar al declarar a su miembro es que si proporciona un " getter " para recuperarlo, ya no estás encapsulando ese objeto. En cambio, puede ser bueno escribir métodos de envoltura que expongan solo la funcionalidad que desea exponer.

Por ejemplo, con un miembro de Vector, puede escribir un método AddItem y Clear, si esa es toda la funcionalidad que desea exponer.

Como estás hablando de una clase, creo que debería ser privada. Si desea que sea público, cree una estructura, para que sea obvio que desea que se usen las variables miembros .

Una alternativa viable para exponer al miembro vector es crear una función de visitante (o un iterador interno). De esta manera obedece mejor la ley de Deméter:

class ContWrapper {
    std::vector<int> _ints;
public:
    class Action {
    public: 
        virtual void accept( int i ) = 0;
    };
    void each_int( Action& a );
};

También tenga mucho cuidado al exportar, p. también un std::vector<T> de una biblioteca: ¡el código del cliente podría no usar la misma implementación STL que usted, por lo que el diseño de estas variables miembro puede diferir!

Haga que todos los miembros sean privados y use métodos de acceso, esto le permite cambiar la implementación más adelante. Solo en circunstancias muy inusuales haría público cualquier miembro de datos.

Recuerde que cambiar la implementación ocurre más a menudo de lo que puede imaginar, no se trata solo de cambiar el tipo de contenedor, sino que tal vez desee cambiar el mecanismo. Supongamos que estaba almacenando nombres en una lista, después de un tiempo puede optar por indexar esta lista con un hash y le gustaría actualizar el hash cada vez que agregue un nuevo nombre. Si su implementación está adecuadamente encapsulada, hacer esto es fácil, si acaba de exponer el vector necesitaría hacer cambios que ajusten la interfaz (y así el cambio se extenderá).

Si esto es nuevo a nuevo, puede leer: http: // en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)

Hay una tercera forma: a veces es mejor heredar del contenedor y anular sus métodos para lograr su objetivo (por ejemplo, seguridad de subprocesos). De todos modos, hacerlo público casi siempre no es una buena idea.

Teniendo en cuenta que desea encapsular el contenedor dentro de otra clase implica que no puede ser público, y también los métodos públicos de su clase no deberían exponer nada específico de la implementación sobre el contenedor. De esa manera, la implementación de su clase (es decir, el contenedor) se puede cambiar sin cambiar su interfaz.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top