Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Argument funkcji jako adres metody innej klasy

Ostatnio zmodyfikowano 2016-12-04 00:00
Autor Wiadomość
Temat założony przez niniejszego użytkownika
Argument funkcji jako adres metody innej klasy
» 2016-12-03 21:16:50
Witam,
Mam dane 2 klasy. Klasa A zawiera funkcję, która jako argument pobiera adres do funkcji i wygląda tak:
C/C++
class A
{
private:
    A() // Obiekt klasy to Singleton
    {
        //...
    }
    ~A()
    {
        //...
    }
public:
    void MetodaKlasyA( void( * Draw )() )
    {
        //...
        while( 1 ) {
            //...
            Draw();
           
            //...
        }
    }
};

Klasa B zawiera metodę Draw(), której adres chcę przesłać do MetodaKlasyA():
C/C++
class B
{
private:
    B() { } // Obiekt klasy też jest Singleton'em
public:
    void Draw()
    {
        //...
    }
};

Wywołanie MetodaKlasyA():
C/C++
void main()
{
    //...
    A::Singleton().MetodaKlasyA( & B::Singleton().Draw );
    //...
}
Obiekty klas A i B to Singleton'y.
W wyniku kompilacji otrzymuję błąd:
'&': illegal operation on bound member function expression
Jakieś rady?
P-154456
» 2016-12-03 21:24:38
std::bind
std::function
P-154458
» 2016-12-03 21:29:50
Adres metody to &Klasa::metoda, nie jakieś &cokolwiek().metoda.
P-154460
» 2016-12-03 21:59:38
C/C++
#include <iostream>

using namespace std;

// Ja Singleton robię tak...

template < class T >
class Singleton
{
private:
    Singleton( const Singleton & );
    Singleton & operator =( const Singleton & );
protected:
    Singleton()
    {
    }
    virtual ~Singleton()
    {
    }
public:
    static T & getInstance()
    {
        static T _instance;
        return _instance;
    }
};

class B
    : public Singleton < B >
{
protected:
    friend class Singleton < B >;
private:
    B() { } // Obiekt klasy też jest Singleton'em
public:
    void Draw()
    {
        cout << "Wywołanie metody Draw() z klasy B." << endl;
    }
};

class A
    : public Singleton < A >
{
protected:
    friend class Singleton < A >;
private:
    A() // Obiekt klasy to Singleton
    {
        //...
    }
    ~A()
    {
        //...
    }
public:
    // W typie arg. przekazywanego _powinna_ być klasa w której jest metoda.
    // Dopiero to tworzy kompletny typ.
    void MetodaKlasyA( void( B::* draw )() )
    {
        //...
        while( 1 ) {
            //...
            // Zapewne chodziło Ci o tę składnię :-)
            ( B::getInstance().* draw )();
            // Tu aby nie wykonywało w nieskończoność..
            exit( 0 );
           
            //...
        }
    }
};


// Funkcja main _zawsze_ zwraca int!
int main()
{
    //...
    A::getInstance().MetodaKlasyA( & B::Draw );
    //...
}
P-154461
Temat założony przez niniejszego użytkownika
» 2016-12-04 00:00:52
Wyjaśnione, dzięki.
P-154464
« 1 »
  Strona 1 z 1