Wie rufe ich eine bestimmte Methode auf, die in allen Klassen einer anderen Klasse (TranslationManager) vorhanden ist? Ich habe den Code stark vereinfacht. Ich möchte nur das setTranslationText
einer Klasse von TranslationManager aufrufen.
Diese sind zu berücksichtigen:
- Alle Klassen haben eine
setTranslationText
Methode Wir sollten setTranslationText einer beliebigen Klasse von TranslationManager aus aufrufen, indem wir den Zeiger auf die Klasse verwenden
class Interface { ... public: void setTranslationText(QString translatedString); } class AnyOtherInterface { ... public: void setTranslationText(QString translatedString); } ... … Translationmanager::Translationmanager(){ AnyClass = Interface; // Pointer to Interface Class AnyClass->setTranslatioNText("Text"); AnyClass = AnyOtherInterface; // Pointer to AnyOtherInterface Class AnyClass->setTranslatioNText("AnotherText"); } …
3 Antworten
Ich war nicht genau, was ich wollte. Ich habe endlich die beste Lösung für mein Problem gefunden: Rückruf .
Lösung gefunden unter: einfache Beispiele für Rückrufe von C ++ - Klassenmitgliedern
std::vector<std::function<void(std::string,std::string)>> callbacks;
template<class T> void addTranslationText(T* const object, void(T::* const mf)(std::string,std::string)){
using namespace std::placeholders;
callbacks.emplace_back(std::bind(mf, object, _1, _2));
}
...
// Call callback
callbacks.at(0)(std::string("arg1"), std::string("arg2"));
Sie könnten eine Vorlage verwenden
template <typename T>
void setTranslationText(T* t, const QString &translatedString)
{
t->setTranslationText(translatedString);
}
Auf diese Weise benötigen Sie keine Schnittstellenklasse, um diese (oder wie viele) Methoden auch immer zu erben. Dann würde die Vorlage nur kompiliert, wenn für eine bestimmte Klasseninstanziierung eine setTranslationText
-Methode definiert wäre. Die Art und Weise, wie Sie es verwenden würden, ist
Translationmanager::Translationmanager()
{
setTranslationText(Interface, "Text"); // Pointer to Interface Class
setTranslationText(AnyOtherInterface, "AnotherText"); // Pointer to AnyOtherInterface Class
}
Hinzufügen zu Corys Antwort: Wenn Sie zum Initialisieren von QString
C-Zeichenfolgen verwenden, sollten Sie sich nicht auf die implizite Konvertierung verlassen. Geben Sie stattdessen Ihren Anwendungsfall explizit an:
template <typename T>
void setTranslationText(T* t, const char *translatedString) {
t->setTranslationText(QString::fromUtf8(translatedString));
}
Neue Fragen
c++
C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] oder [C ++ 23] usw. .