Beste Ansatz für Struktur-Polymorphismus in C

Schreibe ich eine einfache 2d-Vektor-Objekt. Es müssen x-und y-Komponenten, und die Länge, Kreuz-Produkt, etc. Methoden. Die Sache ist die, ich will haben die Struktur zu haben, die vielen möglichen Typen (char, int, float, double, etc.). Ich Frage mich, was wäre die beste Wahl, design-Weise, um die Interaktion mit dem Objekt? Hier ist, was ich bin derzeit in Erwägung:

1. Haben Sie den Benutzer übergeben, der ein vector-Objekt um spezielle Funktionen, wie:

Vector2Dt_Dot(Vec2Dt* vector1, Vec2Dt* vector2);

wobei 't' der Typ des Vektors. Jedoch, das problem bei diesem Ansatz ist, dass es verbietet verschiedene Arten von Interaktion mit jedem anderen, so dass ich nicht sagen konnte, berechnen Sie das Skalarprodukt a float vector2d und ein Doppel vector2d. Ein zweiter Ansatz, und was ich bin Neigung in Richtung:

2. Haben die Benutzer-pass vector-Objekt(s) als void-Zeiger, zusammen mit Ihrem Typen, wie:

Vector2D_Dot(void* vector1, unsigned vector1_type, void* vector2, unsigned vector2_type);

offensichtlich dieser Ansatz ist kompakter API-Weise und löst auch das problem von oben, aber auf Kosten von ein paar zusätzliche Parameter und geben Sicherheit.

Möglicherweise gibt es andere Lösungen, ich bin mir nicht bewusst, aber diese sind die, die ich derzeit in Betracht ziehen. Was denken Sie, ist der beste Ansatz, um dieses?

  • die Frage ist tagged c, nicht c++
  • Verwenden Sie nicht die void * alternative; es gibt zu viele Möglichkeiten, Sie können Fehler machen, die der compiler nicht abfangen (weil jeder Zeigertyp umgewandelt werden können, um eine void * in C oder C++). Zu einer Zeit, diese Frage (kurz) hatten einen C++ - tag und für eine längere Zeit zu verwenden, C++ - Referenz-Typ notation. Wenn C++ ist relevant, erwägen Sie, eine vector<vector<yourtype> >.
  • leffler: Ja, das war mein Fehler. Ich Wechsel zwischen C und C++ oft. Ich würde auf jeden Fall verwenden Sie einen Vektor-ähnliche Oberfläche, wenn es eine option in C.
InformationsquelleAutor Shokwav | 2013-08-24
Schreibe einen Kommentar