2017-11-21 6 views
0

Ich schreibe gerade eine Reihe von Funktionen und Klassen zum Rendern und Organisieren vertex Daten. Ich möchte diese Funktionen und Klassen auch als .lib bereitstellen.
Das Problem ist, dass diese Funktionen und Klassen wissen müssen, wie die struct vertex (Erstellungszeit von .lib) aussieht (d. H. Die Definition davon), weil sie std::vector<Vertex> verwenden).
Allerdings würde ich gerne die Bibliothek Funktionen und Klassen für verschiedene vertex Definitionen verwenden, da die Eigenschaften der vertex je nach Modell zu zeichnen ändern können.Mit Klasse/Struktur nicht in .lib definiert

Gibt es eine Möglichkeit, die .lib zu bauen, ohne die vertex Struktur zu bestimmen?

+0

Wenn Sie '' Vertex'' nicht zur Vereinigung aller möglichen Daten machen, benötigen Sie für jede Knotenorganisation eindeutige Strukturen und benötigen daher eindeutige Instanzen von '' std :: vector <> ''. Sie könnten einfach 'generische binäre Blobs' mit flexiblen Layouts (d. H. Vertex Buffer) verwenden und sie als '' std :: vector '' zusammen mit einer Eingabe-Layout-Beschreibung übergeben. Einige Beispiele finden Sie unter [DirectXMesh] (https://github.com/Microsoft/DirectXMesh) und [DirectXTK] (https://github.com/Microsoft/DirectXTK). –

Antwort

0

Meine ursprüngliche Antwort war Vorlagen angenommen, die Sie sagen, dass Sie nicht verwenden. Randnotiz: Mit einer Vorlage für Ihren Typ Vertex würde funktionieren, aber die Bibliothek müsste eine Header-only-Bibliothek werden. Sie sollten diese Option ernsthaft in Betracht ziehen.

Wenn Sie das nicht möchten, dann würde vielleicht ein Interface-Ansatz funktionieren (vorausgesetzt, Sie sind mit der Leistungseinbuße zufrieden). Zum Beispiel für Vertex:

class Vertex 
{ 
public: 
    virtual double getX() = 0; 
    virtual double getY() = 0; 
    ... 
}; 

Dann vielleicht eine Fabrik für die Erstellung von ihnen: konnte

void doStuff(VertexFactory* fac) 
{ 
    std::vector<Vertex*> vertices; 

    for(int i = 0, i < 100; ++i) 
     vertices.push_back(fac->createVertex(i, i)); 

    //then do some other stuff 
} 

Und Ihre Kundennummer:

class VertexFactory 
{ 
public: 
    virtual Vertex* createVertex(double x, double y) = 0; 
}; 

Die Bibliothek einige Code wie diese haben könnte Verwenden Sie es wie folgt:

class MyVertex : public Vertex 
{ 
public: 
    double getX() override { return 1.0; } 
    double getY() override { return 2.0; } 
}; 

class MyVertexFactory : public VertexFectory 
{ 
public: 
    MyVertex* createVertex(double x, double y) override 
    { 
     return new MyVertex; 
    } 
}; 

int main(int argc, const char** argv) 
{ 
    MyVertexFactory fac; 
    doStuff(&fac); 
} 
+0

Mein Vertex ist nur eine gewöhnliche Struktur. Keine Vorlage wird jetzt verwendet – XoR

0

Sie könnten es zu einem Vektor von Zeigern machen (oder Smart-Zeigern, aber dann müssen Sie eine Schnittstelle veröffentlichen). Eine weitere Option ist, dass die Objekte, die Sie aus der Bibliothek zurückholen, Stubs zu den tatsächlichen Objekten sind. Alternative Bibliotheken müssten innerhalb Ihrer "pimpl" arbeiten. Ein Bündel von Funktionen ist jedoch nicht sehr objektorientiert. Sie könnten eine Schnittstellenklasse veröffentlichen, damit Sie über einen Vektor von Smartpointern auf die Schnittstelle verfügen können.

+0

Also sollte ich nur std :: vector überall verwenden, so dass ich die Vertex deklarieren kann und damit die Klassen müssen nicht wissen, die Vertex-Definition beim Erstellen der .lib? – XoR

+0

Ja. Das wird funktionieren. Sie müssen Ihre eigenen neuen und zerstören Methoden auch bereitstellen. Dies ist die alte-skool C-Bibliothek. –

Verwandte Themen