this struct in function
-
Hallo liebe Gemeinde.
Als Beruflicher Entwickler stehe ich vor einem Problem das
ich gerne gelöst hätte, obwohl zu wissen glaube, dass es nicht möglich ist.Ich habe ein struct, mit einem pointer auf einer Funktion.
In dieser Funktion, hätte ich gern zugriff auf das struct, ohne Übergabeparameter.Dadurch, dass ich das Programm rein privat verwende, wäre
ich für alle schmutzigen Tricks zu haben.Wäre dankbar für Anregungen und auch Kritik zu dieser Umsetzung.
Danke und liebe Grüße
Hier der Code als Beispiel.
struct fStruct; // forward decleration of fStruct #ifdef WOULD_WORK typedef void(*myFunc)(); struct fStruct { int num; myFunc func; }; void toCall() { this->num = 5; } #else typedef void(*myFunc)(fStruct*); struct fStruct { int num; myFunc func; }; void toCall(fStruct* str) { str->num = 5; } #endif int main() { fStruct str; str.func = toCall; #ifdef WOULD_WORK str.func(); // would be nice, to call it this way #else str.func(&str); #endif return 0; }
-
Hab mal dein Problem angesehen.
Frage: Was spricht dagegen, wenn du die 2 Methoden
void toCall(fStruct* str)
void toCall()als überladene Strukturmethoden deklarierst ?
Ist flexibel und du hast von beiden Funktionen aus Zugriff
-
joni1157 schrieb:
Frage: Was spricht dagegen, wenn du die 2 Methoden
void toCall(fStruct* str)
void toCall()als überladene Strukturmethoden deklarierst ?
Vermutlich die Wahl der Sprache C
. C kennt keine Überladungen und in C++ würde sich das Problem gar nicht erst stellen.
Außerdem verstehe ich gerade nicht, wie du damit überhaupt das beschriebene Problem lösen willst.
Mein Senf zum Thema: Alle Lösungen wären derart umständlich, dass sie den Aufwand nicht lohnen. Mögliche Lösungsansätze, die mir einfielen:
a) eigenen Präprozessor schreiben, der alles korrekt umschreibt. Extremer Aufwand für kleinen Effekt.
b) C++ lernen und benutzen. Hat zwar durchaus viel positives, aber wenn es nur um diese eine Syntaxverbesserung geht, ist das doch etwas Overkill.
-
Melli schrieb:
str.func(); // would be nice, to call it this way
Willkommen zu C++!
struct fStruct { int num; void func() { num = 5; } };
Und schon ists legal.
ACHTUNG: Aber jetzt nicht einfach anfangen, das so zu schreiben! C++ hat ganz andere Idiome als C! Erst C++ lernen!
-
Danke für die schnellen Antworten.
SeppJ schrieb:
in C++ würde sich das Problem gar nicht erst stellen.
ich weiß.
Darum frage ich auch nach einer Lösung für C.Ich würde gerne aus Langeweile, Container für C machen.
Und da macht es sich besser wenn man schreibt...myList list = createList(); list.pushBack("Test");
statt
myList list = createList(); list.pushBack(&list, "Test");
-
Tja, aber ist eben einfach so, dass die C-Syntax hier umständlicher ist. Ist einer der Gründe, warum C++ erfunden wurde
Tatsächlich waren die ersten C++-Compiler nur so etwas wie der von mir vorgeschlagene Präprozessor, mit denen das C++ in das äquivalente C übersetzt wurde.
-
Melli schrieb:
Danke für die schnellen Antworten.
myList list = createList(); list.pushBack("Test");
statt
myList list = createList(); list.pushBack(&list, "Test");
wieso? Wieso soll das erste besser sein als das zweite? Die Objektorientierung ist dennoch da, was du da machst ist nur syntax-Zucker.
-
Ich würde immer das hier verwenden:
pushBack(&list, "Test");
Es gibt keinen Grund function pointer zu speichern, wenn du nciht virtuelle Funktionen simulieren musst.