Por supuesto, sé que la mejor respuesta es "no escriba su propio código multiplataforma, alguien ya ha hecho lo que necesita", pero lo estoy haciendo como un pasatiempo/aprendizaje ejercicio y no en ninguna capacidad de pago. Básicamente, estoy escribiendo una aplicación de consola pequeña en C++, y me gustaría hacerlo en varias plataformas, tratando cosas como archivos, sockets e hilos. OOP parece ser una gran manera de manejar esto, pero realmente no he encontrado un buen patrón para escribir clases que compartan la misma interfaz de plataforma cruzada.OOP multiplataforma en C++
El enfoque sencillo es simplemente planear metainterfaces, usarlas en todo el resto del programa y compilar la misma clase con diferentes archivos según la plataforma, pero creo que debe haber una mejor camino que es más elegante; al menos, algo que no confunde IntelliSense y su tipo sería bueno.
que he tomado un vistazo a algunas de las clases más pequeñas en la fuente de wxWidgets, y utilizan un enfoque que utiliza un miembro privado almacenamiento de datos para la clase, por ejemplo
class Foo
{
public:
Foo();
void Bar();
private:
FooData data;
};
Luego, puede compilar este simplemente eligiendo diferentes archivos de implementación según la plataforma. Este enfoque me parece bastante torpe.
Otro enfoque que he considerado es escribir una interfaz y cambiar las clases heredadas de esa interfaz según la plataforma. Algo como esto:
class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};
class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};
Por supuesto, este tipo de tornillos hasta la creación de instancias real, ya que no sabe qué aplicación para crear un objeto de, pero eso se puede evitar mediante el uso de una función
Foo* CreateFoo();
y variando la implementación de la función según la plataforma en la que se esté ejecutando. Tampoco soy un gran admirador de esto, ya que todavía parece poco claro ensuciar el código con un montón de método de creación de instancias (y esto también sería inconsistente con el método de creación de objetos que no son de plataforma cruzada).
¿Cuál de estos dos enfoques es mejor? ¿Hay una mejor manera?
Editar: Para aclarar, mi pregunta no es "¿Cómo se escribe C++ multiplataforma?" Más bien, es "¿Cuál es el mejor método para abstraer el código multiplataforma utilizando clases en C++, conservando al mismo tiempo el mayor beneficio posible del sistema tipográfico?"
Esa es una buena idea, y definitivamente voy a echar un vistazo a lo que Boost hace allí. Tengo curiosidad, ¿este patrón permite que el estado de la clase varíe entre las implementaciones? Por ejemplo, los identificadores de archivo Posix vs Win32 tienen un tipo diferente; si estuviera escribiendo un contenedor de archivos, las estructuras/clases de estado tendrían que ser diferentes. – ShZ
Haría una clase 'file_handle', y simplemente rellenaría el handle en' void * ', por lo general. La implementación puede devolverlo a lo que necesita. Esto está garantizado seguro por el estándar. Este método también funciona bien si carga implementaciones dinámicamente, ya que simplemente reemplaza 'detail :: whatever' con' some_function_pointer', cargado desde la biblioteca. – GManNickG
+1: siempre delegue en el sistema de compilación lo que es específico del tiempo de compilación –