4 Stimmen

Verknüpfte Listen in C: Wie möglich ist ein OO-Design?

Ich arbeite daran, eine dynamische verknüpfte Liste in C zu implementieren, um meine C-Kenntnisse aufzufrischen. Hier ist die einfache Struktur, die ich zur Darstellung einer LinkedList verwende:

typedef struct List
{
   Node_t* head;
   Node_t* tail;
   uint32_t length;
   void (*add)(Node_t* head, void* data);
} List_t;

Ich schreibe das alles in eine eigene C-Datei, in der Hoffnung, dass ich sie in eine andere C-Datei einfügen und die von mir geschriebene Implementierung der verknüpften Liste verwenden kann.

Sie werden feststellen, dass ich einen Zeiger auf eine Funktion habe, die einen Knoten zu der verknüpften Liste hinzufügt. (Ich habe noch mehrere andere Funktionen als add, aber ich wollte diese Funktion zuerst herausfinden)

Wenn ich diese verknüpfte Liste jetzt verwenden würde, müsste ich sie folgendermaßen aufrufen

List_t* list = GetList(); /* this is a constructor like method I wrote*/
list->add(list->head, someData);

Ist es möglich, es in einer OO-Art und Weise zu kodieren, so dass alles, was ich tun müsste, der Aufruf ist:

list->add(someData);

Ohne den Kopf der Liste an die Funktion add() zu übergeben? Mein Instinkt sagt mir, dass es nicht möglich ist, aber ich mag die Idee, dass meine verknüpften Listen auf diese Weise funktionieren.

-Akron

Bearbeiten: Der Verweis auf add wurde korrigiert, um der Tatsache Rechnung zu tragen, dass list ein Zeiger ist.

Edit: Es sieht so aus, als ob der allgemeine Konsens nein lautet. Danke für die Tipps/Antworten

3voto

Daniel Pryden Punkte 56882

Was Sie tun es ein OO-Design.

Was Sie wollen, ist syntaktischer Zucker, damit Ihr C-Code wie der Code einer anderen Sprache aussieht.

Ich würde Ihnen raten, die Sprache, die Sie verwenden, nicht länger zu bekämpfen und sich stattdessen darauf zu konzentrieren, guten, idiomatischen Code zu schreiben.

Die idiomatische C-Methode für wäre eine Funktion wie

void List_Add(List_t *list, void *data);

Und dann würde Ihr Client-Code ihn einfach so aufrufen:

List_Add(list, someData);

2voto

AusCBloke Punkte 17674

EDITAR : Nein, ich hatte C++ im Kopf.

Wenn ich verknüpfte Listen verwende, bevorzuge ich eine Funktion wie list_add(my_list, node) anstatt zu versuchen, meinen Code ganz OO aussehen zu lassen. Man kann Dinge in gewissem Sinne in C abstrahieren, aber wenn ich meinen Code wirklich OO machen wollte, würde ich einfach C++ verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X