То же самое:)
class _object
{
};
class WindowsObject : public _object
{
};
class LinuxObject public _object
{
};
#if defined(WIN32)
typedef WindowsObject Object;
#else
typedef LinuxObject Object;
#endif
Object myObject;
РЕДАКТИРОВАТЬ: Естественно, интерфейс, который предоставляют WindowsObject и LinuxObject, должны быть одинаковыми.В этом примере _object
будет абстрактным базовым классом, определяющим интерфейс, а LinuxObject и WindowsObject будут реализовывать этот интерфейс, скрывая специфичные для платформы вещи в своих файлах реализации.
Пример
_object.h
class _object
{
public:
virtual void doSomething() = 0;
}; // eo class _object
WindowsObject.h
#include "_object.h"
class WindowsObject : public _object
{
public:
virtual void doSomething();
}; // eo class WindowsObject
WindowsObject.cpp
#if defined(WIN32)
#include <windows.h>
void WindowsObject::doSomething()
{
// do something totally reliant on windows here
}; // eo doSomething
#endif
Тогда вы сделаетето же самое для LinuxObject.h
и LinuxObject.cpp
, причем последние имеют совершенно разные инструкции препроцессора.например, #if defined(UNIX)
или какой-то такой аромат.Обратите внимание на WIN32
охранники вокруг реализации.Тогда у вас будет какой-нибудь основной заголовочный файл, который вы будете использовать:
#if defined(WIN32)
#include "WindowsObject.h"
typedef WindowsObject Object;
#else
#include "LinuxObject.h"
typedef LinuxObject Object;
#endif
Теперь, в вашей программе
Object a;
a.doSomething();
Стоит отметить, что, если это просто нечетная строка кодакоторый отличается в вашем сложном объекте (например, вызовом инициализации при инициализации, уничтожении), вам может быть лучше использовать один объект, не зависящий от платформы, и использовать защиту в реализации.Это решение имеет больше смысла, когда есть огромные различия.