Domanda

Sto utilizzando due librerie diverse nel mio progetto ed entrambe forniscono un rettangolo di base struct.Il problema è che sembra non esserci modo di inserire una conversione tra i tipi, quindi non posso chiamare una funzione in una libreria con il risultato di una funzione nell'altra.Se fossi l'autore di uno di questi, potrei creare conversioni, dall'esterno non posso.

biblioteca a:

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

biblioteca B:

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

Ora, non riesco a creare un convertitore class, perché C++ cercherà una conversione solo in un passaggio.Questa è probabilmente una buona cosa, perché ci sarebbero molte possibilità che comportano la creazione di nuovi oggetti di tutti i tipi.

Non riesco a creare un operatore che accetti il ​​file struct da a e fornisce un oggetto del class da b:

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

Quindi, esiste un modo sensato per aggirare questo problema?

modificare:

Forse dovrei anche sottolineare che mi piacerebbe davvero una soluzione che renda il lavoro con il risultato fluido, dal momento che non mi aspetto di essere quel programmatore.(Anche se sono d'accordo, la conversione esplicita e vecchia scuola sarebbe stata una buona scelta.L'altro ramo, reinterpret_cast ha lo stesso problema..)

modifica2:

In realtà, nessuno dei suggerimenti risponde realmente alla mia vera domanda, Corrado Rodolfo sembra essere corretto.C++ in realtà non può farlo.Fa schifo, ma è vero.(Se fa qualche differenza, proverò a creare sottoclassi come suggerito da CodingTheWheel.

È stato utile?

Soluzione

Se non puoi modificare le strutture, non hai alternativa alla scrittura di una funzione di conversione manuale perché l'overload degli operatori di conversione funziona solo all'interno del corpo della classe.Non c'è altro modo.

Altri suggerimenti

Creare un tipo di spessore intermedio "RectangleEx" e definire conversioni personalizzate da/verso tipi di stringhe di terze parti.Ogni volta che parli con una delle API, fallo tramite la classe shim.

Un altro modo sarebbe quello di ricavare a class da entrambi rect O Rectangle, e inserisci lì conversioni/costruttori.

Non sono sicuro di quanto sia sensato, ma che ne dici di qualcosa del genere:

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

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

private:
    ...
};

Quindi puoi semplicemente avvolgerli tutti rectangle In R() e la "cosa giusta" accadrà.

Potrebbe non essere fattibile nel tuo caso, ma ho visto persone impiegare un po 'di preprocessore per massaggiare i tipi in compatibilità.

Anche questo presuppone che tu stia costruendo una o entrambe le librerie.

È anche possibile che tu non voglia farlo affatto, ma desideri rivalutare alcune decisioni iniziali.O no.

Perché non qualcosa di semplice come questo:(nota che questo potrebbe/probabilmente non verrà compilato) ma hai un'idea...


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;

}

MODIFICARE: Sembra che io e Koko abbiamo la stessa idea.

Se la structSe fossero gli stessi internamente, potresti fare a reinterpret_cast;tuttavia, poiché sembra che tu abbia campi a 16 bit contro 32 bit, probabilmente sei bloccato nella conversione su ogni chiamata o nella scrittura di wrapper per tutte le funzioni di una delle librerie.

Forse potresti provarlo con il sovraccarico dell'operatore?(Forse un operatore = che non è un metodo della tua classe)?

Operatore Rect= (const Rect&,const rettangolo&)

Maggiori informazioni su questo nel linguaggio di programmazione C++ di Bjarne Stroustrup o forse in questa pagina: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top