Nachstehend ist ein funktionierender Code dargestellt. Aber ich möchte "dieses" Schlüsselwort verwenden, um meine Funktionszeiger innerhalb meiner Implementierung (z. B. innerhalb der Konstruktorimplementierung) aufzurufen. Bitte helfen Sie mir, eine Lösung zu finden.Mit diesem Schlüsselwort auf Funktionszeiger in C++ zugreifen
Mein System ist g ++ (GCC) 4.1.2 20.080.704 (Red Hat 4.1.2-55)
Arbeits-Code
#include <iostream>
#include <string>
#include <map>
using namespace std;
class TestClass{
public:
typedef int (TestClass::*FunctionPtr)(int);
map <string, FunctionPtr> mFnPtrMap;
int Function1(int nAdd) { return nAdd + 1; }
int Function2(int nAdd) { return nAdd + 2; }
TestClass() {
mFnPtrMap.insert(make_pair("Function1", &TestClass::Function1));
mFnPtrMap.insert(make_pair("Function2", &TestClass::Function2));
}
int CallFunction(const string & s, int n) {
FunctionPtr fp = mFnPtrMap[s];
return (this->*fp)(n);
}
};
int main() {
TestClass ts;
cout << ts.CallFunction("Function1", 0) << endl;
cout << ts.CallFunction("Function2", 0) << endl;
}
Was ich tun möchte, ist:
Meine Erwartung ist, es in so etwas zu ändern (verwenden Sie 'this ->' anstelle von 'TestClass ::')
mFnPtrMap.insert(make_pair("Function1", &this->Function1));
Es gibt mir einen Compilerfehler. Es schlägt mir sogar vor, TestClass :: name resolution zu verwenden.
„ISO C++ verbietet das Ermitteln der Adresse eines gebundenen Elementfunktion Elementfunktion einen Zeiger zu bilden. Sprich & Testclass :: Function1“
Heißt das es bedeutet nicht möglich ist? Wenn mir jemand auch eine Erklärung geben könnte, würde es mir helfen, die darunter liegende Theorie zu verstehen. Vielen Dank.
Warum wollen würden Sie diesen Namen anstelle der Klasse benutzen?Welchen Vorteil sehen Sie daraus? – HeroicKatora
Wenn es nur darum geht, die explizite Verwendung des Klassennamens zu vermeiden, empfehle ich, 'decltype' und' std :: remove_pointer' zu verwenden, um sie aus 'this' zu rekonstruieren. Wie in C++ 11 können Sie den folgenden Code verwenden: 'std :: remove_pointer :: type' als Drop-In-Ersatz für den expliziten Klassennamen –
HeroicKatora
Es soll keinen Vorteil bringen. Ich möchte es in meinem Code nicht statisch aussehen lassen, nur um es an lokale Codierungsstandards anzupassen, denen wir folgen. – SajithP