Creación de instancias y desasignación mediante Smart-Pointers

octubre 10

Logotipo de Raima sobre fondo gris

Como se describió en la publicación anterior TBD: LINK, aprendimos que la interfaz C ++ para un esquema de base de datos en particular es generada por el compilador de esquemas. Estas interfaces constan de varias clases con métodos públicos. Algunos métodos son comunes a más de una clase (contenidos en una clase base) mientras que otros métodos son específicos de una clase en particular (contenidos en una clase especializada generada por el compilador de esquemas).

Punteros inteligentes

Las clases que definen la interfaz (clases API) tienen una y solo una variable miembro, un puntero protegido, declarado en las clases base. Por tanto, cada una de las dos clases base tiene un puntero y no hay otras variables miembro en ninguna de estas clases. Los objetos detrás de estos punteros contienen la parte principal de la implementación de la API. Estos objetos serán posteriormente referencias a objetos de clase de implementación.

Los punteros a los objetos de la clase de implementación se implementan como punteros inteligentes (http://en.wikipedia.org/wiki/Smart_pointer) cuya implementación está oculta al desarrollador de la aplicación. Los contadores de referencia se declaran en las clases de implementación y las clases de API utilizan métodos públicos explícitos para el constructor predeterminado, el constructor de copia, el operador de asignación y el destructor para implementar esto.

El contador de referencia se inicializa a uno cuando se crea una instancia del objeto de implementación. La creación de instancias es siempre el resultado de la llamada a un método en cualquiera de las clases de API. Para la interfaz Db, esta es siempre cualquiera de las funciones abiertas (declaradas como métodos estáticos en las interfaces Db) y para la interfaz Cursor es una variedad de métodos tanto en la interfaz Db como en la Cursor.

El contador de referencia se incrementa cada vez que un objeto adicional lo hace referencia y se reduce cada vez que un objeto menos lo hace referencia. Solo contabilizamos los punteros de un objeto API a un objeto de implementación y cualquier puntero de un objeto de implementación para cualquiera de las interfaces Cursor al objeto de implementación para la interfaz Db. Cuando el recuento de referencias desciende a cero, el objeto de implementación se desasigna. Este diseño garantiza que siempre que se pueda hacer referencia a un objeto de implementación directa o indirectamente desde un objeto de API, los objetos de implementación se mantendrán, pero de lo contrario se desasignarán.

Luego, el desarrollador de la aplicación crea instancias de objetos estáticos de las clases de API y las distribuye por valor de la siguiente manera:

Cursor_sensor newRecord (Db_myDatabase dbPar) {
Cursor_myRecord cursor = dbPar.New_myRecord_record ();
cursor.Set_name (“Tim”);

}

int main (intargc, char * argv []) {

Db_myDatabase db = Db_myDatabase :: Open ();
db.Initialize ();
Cursor_myRecord cursorNew = newRecord (db);

}

Como se muestra en el ejemplo anterior, los objetos de la clase API se instancian cada vez que se pasan. En el ejemplo anterior. “Db_myDatabase :: Open ()” crea una instancia de un objeto Db_myDatabase con un recuento de referencias de uno. Este objeto se usa con el constructor de copia para inicializar db en la función principal incrementando el recuento de referencias a dos. El primer objeto del que se creó una instancia se destruye, lo que vuelve a poner el recuento de referencias en uno.

El "newRecord (db)" crea una instancia de otro objeto Db_myDatabase para el parámetro formal dbPar que incrementa el recuento de referencias a dos. La función crea una instancia de un objeto Cursor_myRecord con un recuento de referencias de uno. Esta instanciación también incrementará el recuento de referencias para el objeto de implementación para el objeto Db_myDatabase a tres.

El objeto Cursor_myRecord se usa con el constructor de copia para inicializar el cursor de la misma manera que se inicializó db en la función principal. El primer objeto Cursor_myRecord del que se creó una instancia se destruye, lo que reduce el recuento de referencias a uno. Otra instanciación más tiene lugar para el objeto que se devuelve desde la función a medida que se destruye el cursor.

Una vez que se ha devuelto la función y se ha asignado el objeto Cursor_myRecord a cursorNew, el recuento de referencias para el objeto Cursor_myRecord es uno, mientras que el recuento de referencias para el objeto Db_myDatabase es dos.

Cuando la función principal devuelve db y cursorNew se destruyen, lo que disminuirá la cuenta regresiva de referencia a cero y ambos objetos de implementación serán destruidos.

A continuación, TBD: LINK damos una breve descripción de la API.

Get notified about new RDM updates

Be the first to know about new Raima Database Manager updates when they go live, use cases, industry trends and more.