Somos seres extraordinariamente adaptables, incluso en situaciones a las que quizá no deberíamos adaptarnos. El estilo de la librería CStash ha sido un modelo a seguir para los programadores en C durante mucho tiempo. Sin embargo, si se examina por un momento, se dará cuenta de que utilizar esta librería puede resultar incómodo. Cuando se usa hay que pasar, por ejemplo, la dirección de la estructura a cada función de la librería. Por eso, al leer el código, los mecanismos de la librería se mezclan con el significado de las llamadas a las funciones, lo cual dificulta la comprensión del programa.
Sin embargo, uno de los mayores obstáculos al trabajar con librerías en C es el problema llamado conflicto de nombres (name clashes). C trabaja con un único espacio de nombres de funciones. Esto significa que, cuando el enlazador busca el nombre de una función, lo hace en una única lista de nombres maestra. Además, cuando el compilador trabaja sobre una unidad de traducción, un nombre de función sólo puede hacer referencia a una única función con ese nombre.
Suponga que compra dos librerías de diferentes proveedores y que cada librería tiene una estructura que se debe inicializar y destruir. Ambos proveedores han decidido nombrar a dichas operaciones initialize() y cleanup(). ¿Cómo se comportaría el compilador si se incluyeran los ficheros de cabecera de ambas librerías en la misma unidad de traducción? Afortunadamente, el compilador C dará un mensaje de error indicando que hay una incoherencia de tipos en las listas de argumentos de ambas declaraciones. No obstante, aunque no incluya los ficheros de cabecera en la misma unidad de traducción, seguirá teniendo problemas con el enlazador. Un buen enlazador detectará y avisará cuando se produzca uno de estos conflictos de nombres. Sin embargo, hay otros que simplemente tomarán el primer nombre de la función que encuentren, buscando en los ficheros objeto en el orden en el que fueron pasados en la lista de enlazado. (Este comportamiento se puede considerar incluso una ventaja ya que permite reemplazar las funciones de las librerías ajenas con funciones propias.)
En cualquiera de los dos casos, en C es imposible usar dos librerías en las cuales existan funciones con nombres idénticos. Para solucionar este problema, los proveedores de librerías en C suelen poner un prefijo único a todas las funciones de la librería. En el ejemplo, las funciones initialize() y cleanup() habría que renombrarlas como CStash_initialize() y CStash_cleanup(). Ésta es una técnica lógica: se decoran los nombres de las funciones con el nombre de la estructura sobre la cual trabajan.
Éste es el momento de dar el primer paso hacia la construcción de clases en C++. Como el lector ha de saber, las variables declaradas dentro de una estructura no tienen conflictos de nombres con las variables globales. ¿Por qué, entonces, no aprovechar esta característica de las variables para evitar los conflictos de nombres de funciones declarándolas dentro de la estructura sobre la cual operan? O sea, ¿por qué no hacer que las funciones sean también miembros de las estructuras?