2009-02-14 5 views
5

En C++ en Win32:No es necesario para exportar clases solo con funciones virtuales/en línea?

Supongamos que tengo una DLL con un archivo de encabezado que declara una clase. La DLL exporta algunos medios para obtener un puntero/referencia a una instancia de esa clase, como una función de fábrica.

¿Estoy en lo cierto al creer que no es necesario marcar esa clase como exportada usando __declspec si solo va a llamar funciones virtuales o en línea en sus instancias?

Por el contrario, ¿es necesario exportar la declaración de clase si se desea llamar a funciones miembro no virtuales?

Respuesta

6

¿Estoy en lo cierto al creer que no es necesario marcar esa clase como exportada usando __declspec si solo va a llamar funciones virtuales o en línea en sus instancias?

Sí, esto es correcto, y eso es lo que COM hace, la DLL expotys 4 métodos, uno de ellos regresa a la fábrica de clases, que todos sus miembros son funciones virtuales puras.

Por el contrario, ¿es necesario exportar la declaración de clase si se desea llamar a funciones miembro estáticamente definidas?

No, solo exporte las funciones de miembro estático.

1

No es necesario solo si la función/clase tiene toda su definición en un archivo de cabecera. No depende de la virtualidad.

Por lo tanto, si no exporta toda su clase, se puede utilizar por código de cliente siempre que no tenga ninguna definición de función pública o protegida en un archivo cpp.

También puede declarar solo funciones miembro específicas para exportar en lugar de toda la clase, utilizando __declspec en la declaración de función y no en la declaración de nombre de clase.

+0

"No depende de la virtualidad" ¿No es así? Si una función es virtual, se invoca a través de vptr/vtable. Los objetos COM, por ejemplo, no exportan todas las implementaciones de método (ni siquiera ninguna). – ChrisW

+0

Sí, pero los objetos COM exportan la tabla vptr. – jmucchiello

+0

No, no: en su lugar, el objeto COM contiene un puntero a su propio vtable (por lo que cualquiera que tenga una instancia de objeto COM no necesita estar vinculado a las funciones exportadas del objeto COM, o incluso vinculado a su vtable). – ChrisW

1

Estoy en lo correcto al creer ...

Sí yo creo que sí, pero:

  • deberá probar (no puedo por el momento)

  • Es posible que desee tener cuidado con el uso de métodos en línea: porque si los cambia más adelante, debe reconstruir todos los demás componentes que dependen (se han construido con) esta clase (es decir, el archivo DLL). ya no está en absoluto bien aislado o autónomo ... los métodos en línea están bien dentro de una única DLL, pero conducen a un tipo de 'DLL Hell' si se usan en la interfaz exportada de una DLL).

Por el contrario, es necesario exportar la declaración de la clase si se quiere llamar a funciones miembro definidas estáticamente?

Si no toda la clase, necesita exportar al menos esos métodos estáticos individuales.

1

C++ name mangling sirve como una carga para el éxito de escribir moduladores de compilación cruzada, simplemente declare la clase que desea exponer como una interfaz que no contiene más que funciones virtuales. El diseño de la clase con funciones virtuales podría estar 'estandarizado', piense en COM.

Cuestiones relacionadas