function-pointer vs member-function-pointer
-
teddybär schrieb:
Ich habe mein ganzes Programm in C++ geschrieben und durchweg objekt-orientiert gearbeitet. Es gibt also eine Klasse, welche das komplette Management übernimmt und dazu gehören u.a. die Funktionen init_fcn und fcn0 - diese beschrieben nicht einfach eine Funktion, welche ausgewertet werden soll, sondern stoßen weitreichende Berechnungen an (komplette FEM Simulation z.B.) ...
D.h. die Funktionen init_fcn und fcn0 sind nicht einfach "handcoded", sondern stehen für einen Anruf einer anderen software (z.B. FEM Simulation). Ich denke, dass es daher unmöglich ist diese Funktionen nicht in einer Klasse zu kapseln.Wieso? Die FEM Simulation kann doch ein lokales Objekt in Deiner CB-Funktion sein.
-
was meinst Du denn mit "CB-Funktion" ???
Vielleicht sollte ich meine Situation anders formulieren: ich habe mir eine software geschrieben, welche verschiedene Optimierungsalgorithmen bereitstellt. Diese möchte ich nun um ein OPT++ Interface erweitern, d.h. der grobe Ablauf des Programmes ist bereits fest und dazu gehört auch, dass das Interface zur Funktionsauswertung in einer eigenen Klasse liegt (diese Klasse ist selber eine Art wrapper für andere software).
-
teddybär schrieb:
was meinst Du denn mit "CB-Funktion" ???
Callback Funtion.
-
und wie soll ich die FEM-software initialisieren, wenn diese innerhalb einer "globalen" Funktion steckt? Ich muss in der main zuerst eine komplette Initialisierung der FEM-software durchführen (also eine spezielle Klasse daraus deklarieren) und kann erst dann eine spezielle member-Funktion dieser FEM-Klasse ansprechen, welche die Auswertung durchführt ...
Und OPT++ braucht nunmal einen pointer auf genau diese Funktion
-
Du könntest eine freie Funktion verwenden und der dann eine Instanz dieser Initialisierungsklasse übergeben (die für Übergabe dann binden) oder die Funktion nutzt eine globale Instanz dieser Klasse.
-
Beantworte doch mal die Frage, warum die Funktionen nicht statisch sein dürfen. Wobei die einzigen technisch gültigen Argumente hier "Zugriff auf Membervariablen" (seh ich keine) oder "Implementieren eines virtuellen Interface" (weiss ich nicht) sind. Alles andere wären Designfragen.
Kapseln kann man auch über namespaces oder statische Klassen (gibt es in C++ so nicht, aber das Pendant wäre eine Klasse mit nur statischen Funktionen).
-
@ Braunstein: Globale Instanzen einer Klasse möchte ich nicht verwenden, da mir dies nicht sehr C++ like erscheint. Was meinst Du mit "freier Funktion" ?
@ LordJaxom: Warum ich die Funktionen nicht statisch machen kann, liegt darin dass dann ja auch alle Funktionen (auch in anderen Klassen) welche von dieser statischen Funktion aufgerufen werden selber statisch sein müssten - dies würde in letzter Instanz wohl dazu führen, dass ich meine ganze FEM-software als statisch deklarieren müsste. Schließlich bedeutet ja der Aufruf dieser Funktion (welche OPT++ haben will) bei mir soviel wie: mache eine komplette FEM Simulation !
-
Warum ich die Funktionen nicht statisch machen kann, liegt darin dass dann ja auch alle Funktionen (auch in anderen Klassen) welche von dieser statischen Funktion aufgerufen werden selber statisch sein müssten
Nein. Es müssen lediglich alle Elemente, auf du zugreifst statisch sein, ausser du übergibst die natürlich an die Funktion (von einem Interface mal abgesehen). Der aufrufende muss nicht statisch sein, um eine statische Funktion aufrufen zu können.
-
@ drakon: nur zum Verständnis: wenn ich in Klasse A eine statische Funktion habe und in dieser dann eine Funktion aus Klasse B aufrufen will, muss dann die Funktion in Klasse B statisch sein? Und was ist, wenn die Funktion in Klasse B nach dem Aufruf eigene Member (aus Klasse
ändern will? Was muss dann alles statisch sein?Kann der folgende Code so richtig sein?
class A{ private: B* Bpt; ... public: static void do_sth() { Bpt->do_sth(); } ... } class B{ private: double foo; // muss dieser member static sein ??? public: void do_sth() { foo = 42.; } // muss dieser member static sein ??? }
-
Nein. Das geht so nicht.
B* Bpt;Müsste statisch sein. Aber B selber muss keine statischen Member haben, da das Objekt ja bestimmt ist.
Du könntest das Objekt ja übergeben, dann muss Bpt nicht statisch sein.
Habe jetzt nicht den ganzen Thread gelesen, weiss darum nicht, was du genau brauchst.
Ev kannst du dir ja überlegen, ob du überhaupt mehrere Instanzen von A brauchst/erlaubst.