Конечно, я знаю, что лучший ответ - "не пишите свой собственный кросс-платформенный код, кто-то уже сделал то, что вам нужно", но я делаю это как упражнение для занятий хобби/обучения, а не в любом платном вместимость. В основном, я пишу небольшое консольное приложение на С++, и я хотел бы сделать его кросс-платформой, имея дело с такими вещами, как файлы, сокеты и потоки. ООП - это отличный способ справиться с этим, но я не нашел хорошего шаблона для написания классов, которые используют одну и ту же межплатформенную платформу.
Легкий подход заключается в том, чтобы просто спланировать некоторый метаинтерфейс, использовать его во всей остальной части программы и просто скомпилировать один и тот же класс с разными файлами в зависимости от платформы, но я чувствую, что там лучше быть что более элегантно; по крайней мере, что-то, что не путает IntelliSense и его аналоги, было бы неплохо.
Я просмотрел некоторые из меньших классов в источнике wxWidgets, и они используют подход, который использует закрытый элемент, содержащий данные для класса, например
class Foo
{
public:
Foo();
void Bar();
private:
FooData data;
};
Затем вы можете скомпилировать это, просто выбрав разные файлы реализации в зависимости от платформы. Этот подход кажется довольно неуклюжим для меня.
Другим подходом, который я рассмотрел, является создание интерфейса и замена классов, которые наследуются от этого интерфейса в зависимости от платформы. Что-то вроде этого:
class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};
class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};
Конечно, этот вид винтов вверх по фактическому экземпляру, так как вы не знаете, какую реализацию для создания объекта, но это можно обойти с помощью функции
Foo* CreateFoo();
и изменения реализации функции, основанной на той платформе, на которой вы работаете. Я тоже не большой поклонник этого, потому что он по-прежнему кажется неуклюжим, засоряя код кучей метода создания экземпляров (и это также будет несовместимо с методом создания объектов без межплатформенности).
Какой из этих двух подходов лучше? Есть ли лучший способ?
Изменить: Чтобы уточнить, мой вопрос не "Как вы пишете кросс-платформенный С++?" Скорее, это "Какой лучший способ абстрагировать кросс-платформенный код с помощью классов на С++, сохраняя при этом как можно больше преимуществ от системы типов?"