Abstrakte Klasse und connect()



  • Hallo zusammen,

    ich knoble seit 2h an einem Problem und stehe irgendwie auf dem Schlauch.

    Folgender Fall:
    Ich habe eine abstrakte Klasse aTest. Diese wird in den Klassen test0, test1, ..., testn implementiert.

    Eine QList enthält eine Instanz zu jeder Klasse:

    QList<aTest*> liste;
    
    liste.append(new test0());
    liste.append(new test1());
    ...
    liste.append(new testn());
    

    Soweit funktioniert das ganze auch und kann wunderbar verwendte werden. Das Ergebnis der Testklassen erhalte ich (bisher) per Callback.
    Jetzt bin ich aber auf die (dumme?) Idee gekommen von den test-Klassen aus ein Signal zu schicken das ich natürlich connecten muss. (Soll die Callbacks ersetzen)

    Die erste Idee war natürlich eine Schleife durch die Liste rattern zu lassen und so alles zu connecten:

    connect(liste.at(i), SIGNAL(storyInfos()), this, SLOT(meinTestSlot()));
    

    Das wirft mir jedoch die Fehlermeldung
    no matching function for call to 'controll::connect(aTest* const&, const char*, controll* const, const char*)'

    Ich bin mir sicher dass ich was elementares übersehe, ich komme nur nicht drauf was es ist.

    Kann mich jemand mit einem kräftigen Tritt in die richtige Richtung befördern?

    Andrea



  • connect ist eine (auch statische) Methode von QObject. Also musst du QObject::connect aufrufen.
    Ja, das war etwas sehr elementares und sehr anstrengend zu lesen. Versuch dich bitte nächstes mal kürzer zu fassen. Schon die Zeile und die Fehlermeldung hätten gereicht, ohne einen Roman darüber zu schreiben.



  • Hi Mechanics,

    sry, ich wollte nur alle Infos mitliefern damit keine Nachfragen nötig sind.
    Leider funktioniert dein Tipp nicht.

    Folgendes Funktioniert (ohne QObject::):

    test0* t0 = new test0();
    liste.append(t0);
    connect(t0, SIGNAL(storyInfos()), this, SLOT(meinTestSlot()));
    

    Aber das Funktioniert nicht:

    test0* t0 = new test0();
    liste.append(t0);
    connect(liste.at(0), SIGNAL(storyInfos()), this, SLOT(meinTestSlot()));
    


  • Andrea78 schrieb:

    no matching function for call to 'controll::connect(aTest* const&, const char*, controll* const, const char*)'

    Siehe QObject::connect und QList::at. Die Liste gibt den Eintrag als konstanten Zeiger auf ein nicht konstantes Objekt zurück, connect allerdings erwartet einen nicht konstanten Zeiger auf ein konstantes Objekt. Probier es mit casten.



  • Au Mist, das wars.

    Vielen Dank



  • Andrea78 schrieb:

    sry, ich wollte nur alle Infos mitliefern damit keine Nachfragen nötig sind.

    Ja, das ist in der Tat schwierig zu entscheiden. In dem Fall hab ich mich erst auf die ganzen anderen Details konzentriert, und dann erst am Ende gesehen, dass es mit dem Problem nichts zu tun hat.
    Ja, Youka hat natürlich Recht. Da die Fehlermeldung no matching function war, hab ich als erstes vermutet, dass control nicht von QObject abgeleitet ist (ist es aber anscheinend). Als zweites hätt ich mir dann die Signatur angeschaut, da merkt man dann auch, dass sie nicht passt.



  • Mechanics schrieb:

    Da die Fehlermeldung no matching function war, hab ich als erstes vermutet, dass control nicht von QObject abgeleitet ist (ist es aber anscheinend).

    Wobei ich da schon einen Denkfehler hatte. Wenn es eine Methode mit dem Namen gar nicht geben würde, wäre die Fehlermeldung method is not a member of class.



  • Ich würde aber nicht casten (const_cast oder was?) sondern operator[] verwenden. Der ist auch für non-const return value type überladen.

    Edit:
    Wobei, eigentlich auch Käse. Organisier Deine Schleife einfach vernünftig.

    for(auto it = liste.begin(); it != liste.end(); ++it) // oder range-for C++1x
    {
        connect(*it, /* ... */);
    }
    

    Auch operator* von iterator liefert non-const T&.


Anmelden zum Antworten