Frage

Ich verwende in meinem Projekt zwei verschiedene Bibliotheken und beide liefern ein einfaches Rechteck struct.Das Problem dabei ist, dass es anscheinend keine Möglichkeit gibt, eine Konvertierung zwischen den Typen einzufügen, sodass ich eine Funktion in einer Bibliothek nicht mit dem Ergebnis einer Funktion in der anderen aufrufen kann.Wenn ich der Autor von einem dieser beiden wäre, könnte ich Konvertierungen erstellen, von außen kann ich das nicht.

Bibliothek a:

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

Bibliothek b:

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

Jetzt kann ich keinen Konverter erstellen class, da C++ nur in einem Schritt nach einer Konvertierung sucht.Das ist wahrscheinlich eine gute Sache, denn es gäbe viele Möglichkeiten, neue Objekte aller Art zu erstellen.

Ich kann keinen Operator erstellen, der das übernimmt struct aus a und liefert ein Objekt der class aus b:

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

Gibt es also einen vernünftigen Weg, dies zu umgehen?

bearbeiten:

Ich sollte vielleicht auch darauf hinweisen, dass ich wirklich gerne eine Lösung hätte, die die Arbeit mit dem Ergebnis nahtlos macht, da ich nicht erwarte, dieser Programmierer zu sein.(Obwohl ich zustimme, wäre eine altmodische, explizite Konvertierung eine gute Wahl gewesen.Der andere Zweig, reinterpret_cast hat das gleiche Problem..)

edit2:

Eigentlich beantwortet keiner der Vorschläge wirklich meine eigentliche Frage, Konrad Rudolph scheint richtig zu sein.C++ kann das eigentlich nicht.Scheiße, aber wahr.(Wenn es einen Unterschied macht, werde ich versuchen, Unterklassen zu bilden, wie von vorgeschlagen CodingTheWheel.

War es hilfreich?

Lösung

Wenn Sie die Strukturen nicht ändern können, haben Sie keine Alternative zum Schreiben einer manuellen Konvertierungsfunktion, da das Überladen von Konvertierungsoperatoren nur innerhalb des Klassenkörpers funktioniert.Es gibt keinen anderen Weg.

Andere Tipps

Erstellen Sie einen Zwischenscheibentyp „RectangleEx", und definieren Sie benutzerdefinierte Konvertierungen in/von Drittanbieter-String-Typen.Wenn Sie mit einer der APIs kommunizieren, tun Sie dies über die Shim-Klasse.

Eine andere Möglichkeit wäre, a abzuleiten class von beiden rect oder Rectangle, und fügen Sie dort Konvertierungen/Konstruktoren ein.

Ich bin mir nicht sicher, wie sinnvoll das ist, aber wie wäre es mit so etwas:

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

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

private:
    ...
};

Dann können Sie einfach alles einwickeln rectangle In R() und das „Richtige“ wird passieren.

In Ihrem Fall ist das vielleicht nicht machbar, aber ich habe gesehen, dass Leute ein wenig Präprozessor-Foo einsetzen, um die Typen in Kompatibilität zu bringen.

Auch dies setzt voraus, dass Sie eine oder beide Bibliotheken erstellen.

Es ist auch möglich, dass Sie dies überhaupt nicht tun möchten, sondern eine frühe Entscheidung noch einmal überdenken möchten.Oder nicht.

Warum nicht so etwas Einfaches:(Beachten Sie, dass dies möglicherweise/wahrscheinlich nicht kompiliert wird), aber Sie haben 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;

}

BEARBEITEN: Sieht aus wie bei Kokos und ich habe die gleiche Idee.

Wenn die structs waren intern die gleichen, man könnte a reinterpret_cast;Da es jedoch so aussieht, als hätten Sie 16-Bit- oder 32-Bit-Felder, müssen Sie wahrscheinlich bei jedem Aufruf konvertieren oder Wrapper für alle Funktionen einer der Bibliotheken schreiben.

Vielleicht könnten Sie es mit einer Operatorüberlastung versuchen?(Vielleicht ein =-Operator, der keine Methode Ihrer Klasse ist)?

Rect-Operator= (const Rect&,const rechteck&)

Mehr dazu in der Programmiersprache C++ von Bjarne Stroustrup oder vielleicht auf dieser Seite: http://www.cs.caltech.edu/courses/cs11/material/cpp/donnie/cpp-ops.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top