Итак ... вы не хотите просто использовать Qt? Для реальной работы с использованием C ++ я очень рекомендую это. Это абсолютно отличный кроссплатформенный инструментарий. Я только что написал несколько плагинов, чтобы заставить его работать на Kindle, а теперь и на Palm Pre. Qt делает все легко и весело. Прямо омолаживающий, даже. Ну, до твоего первого знакомства с QModelIndex, но они предположительно поняли, что перепроектировали его, и они заменяют его;)
Как академическое упражнение, это интересная проблема. Как сам изобретатель колеса, я даже делал это несколько раз. :)
Краткий ответ: я бы пошел с PIMPL. (В источниках Qt много примеров)
В прошлом я использовал базовые классы и производные классы, специфичные для платформы, но обычно это оказывается немного более грязным, чем я думал. Я также сделал часть реализации с использованием некоторой степени указателей на функции для специфичных для платформы битов, и я был еще менее доволен этим.
Оба раза у меня возникало очень сильное чувство, что я чрезмерно разбираюсь в архитектуре и заблудился.
Я обнаружил, что использование частных классов реализации (PIMPL) с битами, специфичными для разных платформ, в разных файлах проще всего написать AND debug. Однако ... не пугайтесь # ifdef или двух, если это всего лишь несколько строк и очень ясно, что происходит. Я ненавижу загроможденную или вложенную логику # ifdef , но одна или две здесь и там могут действительно помочь избежать дублирования кода.
С PIMPL вы не будете постоянно реорганизовывать свой дизайн, поскольку обнаруживаете новые элементы, которые требуют разных реализаций между платформами. Так будут драконами.
На уровне реализации, скрытом от приложения ... нет ничего плохого и в некоторых специфичных для платформы производных классах. Если бы две реализации платформы были достаточно четко определены и почти не содержали членов данных, они были бы хорошим кандидатом для этого. Просто сделайте это после , осознав это, а не раньше, исходя из некоторой идеи, что все должно соответствовать выбранному вами шаблону.
Во всяком случае, самая большая неприятность, которую я испытываю по поводу кодирования сегодня, это то, как легко люди, кажется, теряются в идеализме. PIMPL - это шаблон, а платформенные производные классы - это еще один шаблон. Использование указателей на функции - это шаблон. Там нет ничего, что говорит, что они взаимоисключающие.
Однако, как общее руководство ... начните с PIMPL.