5.5.2. Modificar Stack para usar control de acceso

Como un segundo ejemplo, aquí está Stack convertido en clase. Ahora la estructura anidada es private, lo que es bueno pues asegura que el programador cliente no tendrá que fijarse en ella ni podrá depender de la representación interna de Stack:

//: C05:Stack2.h
// Nested structs via linked list
#ifndef STACK2_H
#define STACK2_H

class Stack {
  struct Link {
    void* data;
    Link* next;
    void initialize(void* dat, Link* nxt);
  }* head;
public:
  void initialize();
  void push(void* dat);
  void* peek();
  void* pop();
  void cleanup();
};
#endif // STACK2_H ///:~

Listado 5.7. C05/Stack2.h


Como antes, la implementación no cambia, por lo que no se repite aquí. El programa de prueba es también idéntico. La única cosa que ha cambiado es la robustez de la interfaz de la clase. El valor real del control de acceso es impedirle traspasar las fronteras durante el desarrollo. De hecho, el compilador es el único que conoce los niveles de protección de los miembros de la clase. No hay información sobre el control de acceso añadida en el nombre del miembro que llega al enlazador. Todas las comprobaciones sobre protección son hechas por el compilador; han desaparecido al llegar a la ejecución.

Dese cuenta de que la interfaz presentada al programador cliente es ahora realmente la de una pila. Resulta que está implementada como una lista enlazada, pero usted puede cambiar esto sin afectar a la forma en que los programas cliente interactúan con ella, o (más importante aún) sin afectar a una sola línea del código cliente.