linux-windows cross c ++ applikation

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg udvikler en applikation, der skal køre på Linux og Windows.
Jeg har et objekt kaldet obj, som jeg vil bruge i koden, og det har forskellig adfærd på Linux og Windows. så jeg arver aaa og kaldte WindowsObj til Windows objekt og LinuxObj til Linux objekt.


Mit spørgsmål er: Sådan bruges dette objekt i koden? hvad skal jeg skrive, at det vil køre både til linux og windows?


Til swiching typer bruger jeg typedef som:


typedef uint32\_t       DWORD;


men hvad skal jeg bruge til objekter?
Jeg vil skrive denne kode:


tr1::shared\_ptr<WindowsObj> windowsobj (new WindowsObj(parameter));
tr1::shared\_ptr<LinuxObj> linuxobj (new LinuxObj(parameter));


Enhver ide?

Bedste reference


Det samme :)


class \_object
{
};

class WindowsObject : public \_object
{
};

class LinuxObject  public \_object
{
};

#if defined(WIN32)
typedef WindowsObject Object;
#else
typedef LinuxObject Object;
#endif

Object myObject;


EDIT: Naturligvis skal den grænseflade, som WindowsObject og LinuxObject udsætter, være det samme. I dette eksempel vil \_object være en abstrakt basisklasse, der definerede grænsefladen, og LinuxObject og WindowsObject ville derefter implementere denne grænseflade og skjule de platformspecifikke ting i deres implementeringsfiler.


Sample


\_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


Så ville du gøre det samme for LinuxObject.h og LinuxObject.cpp, sidstnævnte har helt forskellige præprocessorinstruktioner. for eksempel #if defined(UNIX) eller en sådan smag. Bemærk WIN32 vagterne omkring implementeringen. Derefter har du en kernehovedfil du bruger:


#if defined(WIN32)
#include "WindowsObject.h"
typedef WindowsObject Object;
#else
#include "LinuxObject.h"
typedef LinuxObject Object;
#endif


Nu i dit program


Object a;
a.doSomething();


Det er værd at bemærke, at hvis det kun er den ulige kode kode, der adskiller sig i dit komplekse objekt (som et init kald ved initialisering, ødelæggelse), kan du være bedre med et enkelt platform agnostisk objekt og sætte vagter i implementering. Denne løsning giver større mening, når der er store forskelle.

Andre referencer 1


Jeg har tendens til at bruge betinget kompilering til dette, f.eks.


#ifdef WIN32
// windows-specific code
#else
// non-windows
#endif

Andre referencer 2


Jeg foreslår at bruge en cross platform ramme, som GTK + eller wxWidgets, så du ikke havde genopfinde hjulet ...


Så skal du have den mindst mulige platform afhængige kode, og muligvis godt dybt inde i dine klasser. Der kan du bruge #ifdef til betinget at inkludere kode til Windows eller Unix.

Andre referencer 3


Du kan bruge den samme headerfil med to forskellige implementeringer i to forskellige .cpp-filer; PIMPL-idiomet gør det muligt, selvom de to implementeringer kræver helt forskellige dataelementer. Du skal blot sammensætte og linke en kilde, når du kompilerer til Windows og en anden, når du kompilerer til Linux. [16]


Et område, jeg har fundet det nyttigt, er til email-grænseflader. De to operativsystemer har helt forskellige metoder til at sende e-mails.

Andre referencer 4


Hej, hvis du kan bruge c ++, brug boost og size\_t skriv sin bedre måde.