Linux - Windows Cross C ++ приложение - PullRequest
4 голосов
/ 15 ноября 2010

Я разрабатываю приложение, которое должно работать на Linux и Windows. У меня есть объект под названием obj, который я хочу использовать в коде, и он имеет различное поведение в Linux и Windows. поэтому я наследую aaa и называю WindowsObj для объекта Windows и LinuxObj для объекта Linux.

Мой вопрос: как использовать этот объект в коде? что я должен написать, что он будет работать как для Linux, так и для Windows?

Для типов swiching я использую typedef, например:

typedef uint32_t       DWORD;

а что я должен использовать для объектов? Я хочу написать этот код:

tr1::shared_ptr<WindowsObj> windowsobj (new WindowsObj(parameter));
tr1::shared_ptr<LinuxObj> linuxobj (new LinuxObj(parameter));

Есть идеи?

Ответы [ 5 ]

3 голосов
/ 15 ноября 2010

То же самое:)

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();

Стоит отметить, что, если это просто нечетная строка кодакоторый отличается в вашем сложном объекте (например, вызовом инициализации при инициализации, уничтожении), вам может быть лучше использовать один объект, не зависящий от платформы, и использовать защиту в реализации.Это решение имеет больше смысла, когда есть огромные различия.

3 голосов
/ 15 ноября 2010

Для этого я использую условную компиляцию, например

#ifdef WIN32
// windows-specific code
#else
// non-windows
#endif
1 голос
/ 15 ноября 2010

Вы можете использовать один и тот же заголовочный файл с двумя разными реализациями в двух разных файлах .cpp;идиома PIMPL делает это возможным, даже если две реализации требуют совершенно разных элементов данных.Вы просто компилируете и связываете один источник при компиляции для Windows и другой при компиляции для Linux.

Одна область, которая мне показалась полезной, связана с интерфейсами электронной почты.Две ОС имеют совершенно разные методы отправки электронной почты.

1 голос
/ 15 ноября 2010

Я предлагаю использовать кроссплатформенный фреймворк, такой как GTK + или wxWidgets, чтобы вам не пришлось изобретать велосипед ...

Тогда у вас должен быть как можно менее зависимый от платформы код, и, возможно, глубоко внутри ваших классов. Там вы можете использовать #ifdef для условного включения кода для Windows или Unix.

0 голосов
/ 15 ноября 2010

Привет, если вы можете использовать c ++, используйте boost и size_t, так как это лучше.

...