Funktionen blockieren ?
-
Hallo,
man stelle sich eine Klasse vor merhmals an verschiedenen Stellen ein und dieselbe Funktion einer anderen Klasse aufruft.
Nun sollen die Aurufe dieser Funktion aber nur stattfinden wenn ein bestimmtes Flag gesetzt ist.Nun kann ich natürlich vor jedem Funktionsaufruf per IF das Flag prüfen, das ist mir klar. Da sich das Flag innerhalb der Klasse aber nicht mehr ändert (das ist sicher) wäre es ja sinnvoll das Flag am Anfang der Klasse zu prüfen und dann diese Funktionsaufrufe zu sperren. Gibt es da eine Möglichkeit ? Oder bleibt mir nur die Abfrage vor jedem Funktionsaufruf.
Grüße
-
Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x, bzw. C++11) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du könntest einen Fuktionszeiger benutzen, der auf eine Dummyfunktion die nichts tut zeigt, wenn das Flag nicht gesetzt ist. Aber ich würde das Flag trotzdem eher mit if prüfen. Was gefällt Dir denn am if nicht?
-
scrabbl schrieb:
Hallo,
man stelle sich eine Klasse vor merhmals an verschiedenen Stellen ein und dieselbe Funktion einer anderen Klasse aufruft.
Nun sollen die Aurufe dieser Funktion aber nur stattfinden wenn ein bestimmtes Flag gesetzt ist.Wozu braucht man das? Beispiel?
-
Eine sehr ungenaue Fragestellung die alles mögliche heißen kann. Insbesondere der inflationäre Gebrauch des Wortes Klasse und der fehlende Gebrauch von Grammatik macht dich schwer zu lesen. Aus meinem Kaffeesatz habe ich dies herausgelesen:
#include <iostream> template<bool> struct Variante1 { void bar() { std::cout << "Hallo Welt!\n"; } }; template<> void Variante1<false>::bar() { // nix } template<bool> struct Variante2 { void bar() { std::cout << "Hallo Welt!\n"; } }; template<> void Variante2<false>::bar(); int main() { { Variante1<true> darf_funktion_aufrufen; Variante1<false> darf_funktion_nicht_aufrufen; darf_funktion_aufrufen.bar(); // Hallo Welt darf_funktion_nicht_aufrufen.bar(); // Nix } { Variante2<true> darf_funktion_aufrufen; Variante2<false> darf_funktion_nicht_aufrufen; darf_funktion_aufrufen.bar(); // Hallo Welt darf_funktion_nicht_aufrufen.bar(); // Linkerfehler } }
-
"Nicht gefallen" ist vlt der falsche Ausdruck. Aber bei einer großen Klasse kann es schonmal sein das dieser Funktionsaufruf der anderen Klasse 70mal vorkommt und ich müsste dann vor jeden diese IF-Abfrage setzen.
Das kam mir irgendwie unschön vor. Aussrdem wäre es laufzeittechnisch ja geschickter man könnte sich die ständigen Abfragen sparen und die diese Funktion am Anfang der Klasse einfach auf "ignore" stellen oder so. Aber eine solche Möglichkeit scheint es (leider) nicht zu geben.
-
scrabbl schrieb:
"Nicht gefallen" ist vlt der falsche Ausdruck. Aber bei einer großen Klasse kann es schonmal sein das dieser Funktionsaufruf der anderen Klasse 70mal vorkommt und ich müsste dann vor jeden diese IF-Abfrage setzen.
Wie wärs damit?
class klasse_die_funktion_anderer_klasse_aufruft { public: klasse_die_funktion_anderer_klasse_aufruft(bool f):flag(f){} void erste_funktion_von_der_es_noch_70_andere_gibt() { //... checked_call(); //... } void zweite_funktion_von_der_es_noch_70_andere_gibt() { //... checked_call(); //... } private: andere_klasse anderes_objekt; bool flag; void checked_call() { if(flag) { anderes_objekt.funktion(); } } //... };
-
Soviel Antworten...ich komme gar nicht nach, einer nach dem anderen

kasseusse schrieb:
Wozu braucht man das? Beispiel?
Es im Detail zu beschreiben würde den Rahmen sprengen. Grob gesagt, es werden zwei CPUs synchronisiert. Und dieser Funktionsaufruf dient dem Start der Synchronisation.
Nun gibt es aber Situationen in denen eine Synchronisation einfach nicht nötig ist, dort wäre es ja unnötig diese Funktion aufzurufen, kostet ja nur Zeit.
Ob beim Ausführen eine Synchronisation nötig ist oder nicht, sagt mir das genannte Flag. D.h. ist es gesetzt ist eine Synchronisation nötig und der Funktionsaufruf muss ausgeführt werden. Ist es 0 kann man ihn eigtl überspringen.
Da sich dies aber erst zur Laufzeit entscheidet, such ich eben nach einer einfachen Lösung wie ich diese Aufrufe ausser Gefecht setzen kann. Wie gesagt, das letzte Mittel ist das If vor jedem, hatte nur gehofft es gibt leichtere Möglichkeiten.
-
Tachyon schrieb:
Wie wärs damit?
Danke, das wäre eine Idee, einfach eine extra Methode dafür zu erstellen die die Abfrage macht und die Funktion aufruft und alle Funktionsaufrufe durch den Methodenaufruf zu ersetzen.