GOOGLE ADS

Freitag, 29. April 2022

Methode des Objekts als Methodenargument einer anderen Klasse in c++ [duplizieren]

Diese Frage hat hier bereits Antworten:


Lösung des Problems

Sie können einen Member-Funktionszeiger übergeben, aber dann benötigen Sie eine AInstanz, um ihn aufzurufen, und eine Mytype*, die als Parameter übergeben werden soll:

struct Mytype {};
struct A {
bool DoOperation_one(Mytype* pSomeValue) { return true;}
bool DoOperation_two(Mytype* pSomeValue) { return true;}
bool DoOperation_th(Mytype* pSomeValue) { return true; }
};
struct B {
A a;
template <typename F>
bool BMethod(F f,Mytype* mt) {
bool bfun=false;
bool breturn = false;

while (!bfun) {
if ((a.*f)(mt))
{
bfun=true;
breturn = true;//some_other_operation();
}
}

return breturn;
}
};
int main() {
Mytype mt;
B b;
b.BMethod(&A::DoOperation_one,&mt);
}

Anstatt BMethodeine Vorlage zu erstellen, hätte ich den Typ explizit buchstabieren können, es ist bool (A::*)(Mytype*). Die Syntax zum Aufrufen eines Member-Funktionszeigers ist etwas klobig. Wenn aein Zeiger auf A(wie in Ihrem Code) ist, dann ist es (a.->f)(mt).

Beachten Sie, dass dies nur sinnvoll ist, wenn sich der von zurückgegebene Wert A::DoOperation_xyzwährend B::BMethodder Ausführung ändert. Zum Beispiel, wenn mehrere Threads beteiligt sind. Wenn dies der Fall ist, müssen Sie beim Synchronisieren des Zugriffs auf gemeinsam genutzte Daten vorsichtig sein, um Datenrennen zu vermeiden. Wenn dies nicht multithreaded ist, sehe ich keinen Grund, es kompliziert zu machen, und BMethodkann einfach sein bool BMethod(bool x).

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...