Vra

Ek gebruik twee verskillende biblioteke in my projek, en beide van hulle lewer 'n basiese reghoek struct. Die probleem met hierdie is dat dit lyk asof daar geen manier om 'n omskakeling tussen die tipes voeg wees, so ek kan nie bel 'n funksie in een biblioteek met die gevolg van 'n funksie in die ander. As ek was die skrywer van een van hierdie, kan ek doelskoppe skep, van buite af, ek kan nie.

biblioteek 'n:

typedef struct rectangle { sint16 x; sint16 y; uint16 w; uint16 h; } rectangle;

biblioteek b:

class Rect {
  int x; int y; int width; int height;
  /* ... */
};

Nou, ek kan nie 'n converter class, want C ++ net sal kyk vir 'n omskakeling in een stap. Dit is waarskynlik 'n goeie ding, want daar baie moontlikhede met betrekking tot die skep van nuwe voorwerpe van alle vorme van tipes sou wees.

Ek kan 'n operateur wat die struct neem van a en lewer 'n voorwerp van die class van b nie:

foo.cpp:123 error: ‘operator b::Rect(const rectangle&)’ must be a nonstatic member function

So, is daar 'n sinvolle manier om hierdie?

wysig:

Ek moet dalk ook daarop wys dat ek wil regtig graag 'n paar oplossing wat maak die werk met die gevolg naatlose, want ek het nie verwag dat dit kodeerder wees. (Alhoewel ek stem saam, ou-skool, eksplisiete, omskakeling sou 'n goeie keuse wees. Die ander arm, reinterpret_cast het dieselfde probleem ..)

edit2:

Eintlik is een van die voorstelle werklik beantwoord my werklike vraag, Konrad Rudolph blyk korrek te wees. C ++ kan eintlik nie doen nie. Suig, maar waar. (As dit enige verskil maak, ek gaan subclassing probeer soos voorgestel deur CodingTheWheel .

Was dit nuttig?

Oplossing

As jy die strukture nie dan kan verander jy het geen alternatief vir die skryf van 'n handleiding omskakeling funksie omdat oorlaai omskakeling operateurs werk net binne die klas liggaam. Daar is geen ander manier nie.

Ander wenke

Skep 'n intermediêre shim tipe "RectangleEx", en definieer persoonlike doelskoppe na / van die 3de party soorte string. Wanneer jy praat met óf API, doen dit deur middel van die shim klas.

Nog 'n manier sou wees om 'n class trek uit óf rect of Rectangle, en voeg doelskoppe / vervaardigerskampioenskap daar.

Nie seker hoe sinvol dit is nie, maar hoe oor iets soos hierdie:

class R
{
public:
    R(const rectangle& r) { ... };
    R(const Rect& r) { ... };

    operator rectangle() const { return ...; }
    operator Rect() const { return ...; }

private:
    ...
};

Dan kan jy net draai elke rectangle in R() en die "regte ding" sal gebeur.

Dit is dalk nie haalbaar in jou geval wees, maar ek het gesien dat mense in diens te neem 'n bietjie voorverwerker-cat aan die tipes massering in verenigbaarheid.

Selfs hierdie veronderstel dat jy die bou van een of albei biblioteke.

Dit is ook moontlik dat jy nie wil hê om dit te doen nie, maar wil hê na re-beoordelen sommige vroeë besluit. Of nie.

Hoekom nie iets eenvoudig soos volg: (let op hierdie mag / sal waarskynlik nie saam te stel), maar jy kry die idee ...


private Rect* convert(const rectangle& src)
{
    return new Rect(src.x,src.y,src.w,src.h);
}
int main()
{
    rectangle r;
    r.x = 1;
    r.y = 2;
    r.w = 3;
    r.h = 4;

    Rect* foo = convert(&r);
    ...
    delete foo;

}

verander. Dit lyk asof koko se en ek het dieselfde idee

As die structs was dieselfde inwendig, kan jy dit doen 'n reinterpret_cast ; Maar, aangesien dit lyk asof jy 'n 16-bit vs 32-bit velde, is jy waarskynlik vas omskakeling op elke oproep, of skryf omhulsels vir alle funksies van een van die biblioteke.

Miskien kan jy dit probeer met operateur oorlading? (Miskien a = operateur wat nie 'n metode van jou klas)?

Rect operateur = (const Rect &, konst reghoek &)

Meer hieroor in die C ++ programmeringstaal deur Bjarne Stroustrup of miskien op hierdie bladsy: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top