Funktionspointer der Basisklasse an boost::bind übergeben

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Funktionspointer der Basisklasse an boost::bind übergeben

Beitrag von Matthias Gubisch »

Code: Alles auswählen

class FOO
{
protected:
    virtual void foo();
};

class BAR : publich FOO
{
void doSomething();
protected:
     virtual void foo();
}

void BAR::doSomething()
{
   //somecode
   function(boost::bind(&FOO::foo, this _1));  //compiler error das foo protected ist
   function(boost::bind(&BAR::foo, this _1));  //funktioniert ruf aber die implementierung der abgeleiteten Klasse auf was ich nicht möchte
}

Soweit der Code. Ich möchte an der Stelle allerdings explizit die Implementierung der Basisklasse an boost::bind übergeben. Aber ich komme nicht drauf wie ich das machen muss.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
dawit
Beiträge: 42
Registriert: 05.02.2011, 17:06

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von dawit »

Könntest du nicht einfach this nach FOO* casten?
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von Matthias Gubisch »

Nein das funktioniert leider nicht :(
Die Compilermeldung bleibt die gleiche

Sonst keiner der ganzen C++ Spezialisten hier eine Idee?
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von Schrompf »

Wüsste nicht, dass das überhaupt geht. Aber ich bin auch nicht so der Standard-Auskenner.

Ich würde es spontan in einen Lambda verpacken. Da müsste man dann die Funktion konkret benennen können, die man aufrufen will.

Code: Alles auswählen

// direkter Aufruf
BAR bar;
bar.FOO::foo();
Das müsste so gehen, wenn ich mich recht erinnere. Du kriegst natürlich trotzdem den Compilerfehler, dass FOO::foo() protected ist, weil das nunmal gar nix mit Ableitungen und nur was mit Zugriffsrechten zu tun hat.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von B.G.Michi »

Wenn ich das hier richtig interpretiere ist das so direkt nicht möglich -> Wrapperfunktion

Code: Alles auswählen

class BAR : public FOO
{
protected:
    virtual void foo();
    void baseFoo()
    {
        FOO::foo();
    }
    void doSomething()
    {
       function(boost::bind(&BAR::baseFoo, this));
    }
};
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von Matthias Gubisch »

Lambdas kann ich leider nicht benutzten, unterstützt der Compiler hier noch nicht :(

Mit dem Workaround über die Wrapperfunktion habe ich das ganze mittlerweile gelöst. Ist zwar nicht besonders schön aber funktioniert zumindest.

Nachdem es offenbar keine elegantere Möglichkeit gibt werde ich es jezt mal dabei belassen.
Vielen Danke für euere Hilfe
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Jonathan
Establishment
Beiträge: 2353
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von Jonathan »

Matthias Gubisch hat geschrieben: Nachdem es offenbar keine elegantere Möglichkeit gibt werde ich es jezt mal dabei belassen.
Ich meine, ist nicht die Problemstellung ansich schon unelegant? Soweit ich das sehe, ist das Hauptproblem, dass die Methode protected ist. Du willst aber ein Funktionsobjekt erstellen, das diese Methode aufruft und an irgendeine Funktion weitergeben, die dadurch dann irgendwie die Methode aufruft, obwohl sie protected ist.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Matthias Gubisch
Establishment
Beiträge: 470
Registriert: 01.03.2009, 19:09

Re: Funktionspointer der Basisklasse an boost::bind übergebe

Beitrag von Matthias Gubisch »

Jonathan da hast du nicht ganz unrecht, leider kann ich hier nicht die ganze Architektur nach meinen Vorstellungen umgraben. Ist halt historisch gewachsen...

Meine Hoffnung war dass ich das Funktionsobjet erstellen kann da ich beim erstellen ja Zugriff auf die protected Methode habe (ich befinde mich ja in der abgeleiteten Klasse).
Leider gibt es für die unelegante Problemstellung keine elegantere Lösung als die Wrapperfunktion, zumindest nicht ohne C++11 oder neuer.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten