Hoe kan ek omskep tipes in C ++?
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 .
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 struct
s 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