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:

  1. Alle Klassen haben eine setTranslationText Methode
  2. 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");
    }
    
    
    …
    
0
Dardan Iljazi 19 Apr. 2018 im 18:20

3 Antworten

Beste Antwort

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"));
0
Dardanboy 22 Apr. 2018 im 18:19

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
}
5
Reinstate Monica 19 Apr. 2018 im 23:47

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));
}
1
Reinstate Monica 19 Apr. 2018 im 23:50