Bester Ansatz für Strukturpolymorphismus in C

8

Ich schreibe ein einfaches 2D Vektor Objekt. Es wird X- und Y-Komponenten und Längen-, Kreuzprodukt- usw. -Methoden haben. Die Sache ist, ich möchte, dass die Struktur viele mögliche Typen hat (char, int, float, double usw.). Ich fragte mich, was wäre die beste Wahl, um mit dem Objekt zu interagieren? Hier ist, was ich gerade überlege:

1. Lassen Sie den Benutzer das Vektorobjekt an spezielle Funktionen übergeben, wie:

%Vor%

wobei 't' der Typ des Vektors ist. Das Problem bei diesem Ansatz besteht jedoch darin, dass verschiedene Typen nicht miteinander interagieren können. Daher kann ich nicht sagen, dass ich das Skalarprodukt eines float vector2d und eines double vector2d berechnen soll. Ein zweiter Ansatz und worauf ich mich stütze:

2. Lassen Sie den Benutzer die Vektorobjekte als Void-Zeiger zusammen mit ihren Typen übergeben, wie:

%Vor%

offensichtlich ist dieser Ansatz kompakter API-weise und löst auch das obige Problem, aber auf Kosten einiger zusätzlicher Parameter und der Typensicherheit.

Es kann andere Lösungen geben, die mir nicht bekannt sind, aber das sind die, die ich gerade betrachte. Was ist Ihrer Meinung nach der beste Ansatz dafür?

    
Shokwav 24.08.2013, 18:54
quelle

3 Antworten

11

Sie können polymorphe Objekte verwenden. Definieren Sie die Strukturen wie folgt:

%Vor%

Dann können Sie Ihre Funktionen schreiben, um Vector2D -Zeiger zu akzeptieren, ihre jeweiligen Typfelder zu prüfen und sie in die entsprechende typisierte Variante zu konvertieren, um auf die Nutzdaten zuzugreifen.

%Vor%

Dies ist ein von Hand codierter Polymorphismus. Sie müssen lediglich sicherstellen, dass das Feld type immer auf den korrekten Wert gesetzt ist (einmal festgelegt, wenn ein typisierter Vektor erstellt wird).

Der Vorteil dieses Ansatzes für Ihre zweite Idee besteht darin, dass Sie den Typ der Vektoren in einer anderen Variablen nicht weitergeben müssen, was die Verwendung Ihrer Vektoren langwierig und fehleranfällig machen würde.

Alternativ können Sie Ihr type -Feld so definieren, dass es einen Zeiger auf eine Struktur von Funktionszeigern enthält. Sie würden ein Objekt dieser Funktions-Pointer-Struktur pro typisiertem Vektortyp erstellen, den Sie definieren, und es verwenden, um nach der Funktion zu suchen, die mit dem gegebenen Vektor verwendet werden soll. Dieser Ansatz wäre sehr nahe an dem, was C ++ unter der Haube tut.

    
cmaster 24.08.2013, 19:20
quelle
3

Sie können eine Liste mit variablen Argumenten verwenden. Ihr Prototyp wird beispielsweise wie folgt codiert:

%Vor%

Dieser Stil benötigt einen definierten Parameter, in diesem Beispiel a , gefolgt von einer beliebigen Anzahl von Parametern, deren Datentypen zur Laufzeit bestimmt werden können.

Siehe Funktionen und Objekte: va_list ; %Code%; %Code%; und va_start , für eine vollständige Beschreibung der Verarbeitung von Variablenargumentlisten.

Hoffe, das hilft. Bei Fragen zu va_args , etc. bitte fragen.

    
JackCColeman 24.08.2013 19:06
quelle
0
Was ich eigentlich wollte, war folgendes:

Ich habe eine Vector2D-Basisklasse mit dem folgenden Layout erstellt:

%Vor%

Wie Sie sehen, erlaubt dies den generischen Vektorfunktionen, diese aufzurufen, um die x- und y-Werte der abgeleiteten Klassen in doubles umzuwandeln, was die generische Funktion daran hindert, sich über Unterschiede zwischen Größen von Typen wie char und float Gedanken zu machen . Dann jede abgeleitete Klasse:

%Vor%     
Shokwav 25.08.2013 17:20
quelle

Tags und Links