function pointers from sub-class



  • Hallo Forum

    Ich möchte eine Super-Klasse, die von einer Sub-Klasse eine Methode aufrufen kann, die danach eine Liste mit Function Pointers der Funktionen der Sub-Klasse zurück giebt.

    Leider habe ich, wie ihr euch wohl schon denkt, das Problem, dass das nicht geht. Das Problem liegt, glaube ich zumindest, bei meinem typdef.

    typedef void (myClass::*funcPointer)(void);

    Dieser sollte allgemeiner gehalten sein, da ich mehrere Sub-Klassen besitze und diese Function Pointers von mehreren Sub-Klassen stammen können. Gibt es da einen Trick, wie ich diesen typdef so erweitern kann, dass man die Methoden der Sub-Klasse in der Super-Klasse via Function Pointers ausführen kann? Oder muss man das total anders anpacken?



  • Nimm doch eine virtuelle Funktion. Dann kannst du Zeiger auf die Basisklasse speichern und die Funktion der abgeleiteten Klasse aufrufen..



  • Wow. Danke für diese schnelle Antwort.

    Ich habe ein virtuelle Funktion in meiner Super-Klasse definiert, welche ich in meiner Sub-Klasse auch implementiert habe.

    Jedoch habe ich in meiner Sub-Klasse Function Pointers vom Typ

    typedef void (SubClass::*funcPointer)(void);

    respektive für jede Sub-Klasse je einen bestimmten Pointer.

    typedef void (SubClass1::*funcPointer)(void);
    typedef void (SubClass2::*funcPointer)(void);
    ...

    Meiner Super-Klasse soll das ja egal sein. Die soll einfach die Methode aufrufen und die Pointers benutzen. Aber wie kann ich ein typedef definieren, welches das erfüllt. Ich glaube mit Templates wird das sehr kompliziert.

    Ich bin mir nun nicht ganz sicher, ob ich deine Antwort missverstanden habe...



  • Ich verstehe nicht ganz, was du willst. Die Basisklasse sollte nicht wissen müssen, wie die abgeleiteten Klassen aussehen. Wenn du ein Typedef in der Basisklasse haben willst, dann kann das so aussehen:

    typedef void (BaseClass::*funcPointer)(void);
    

    Zeig ansonsten doch mal, was du genau machen willst. (typedefs sind ja "nur" ein Hilfsmittel für bessere Lesbarkeit.)



  • Also konkret möchte ich von meiner TestCase Klasse aus, alle Tests meiner verschiedenen Sub-Klassen ausführen und bewerten. Bis jetzt habe ich das:

    --- TestCase.h ---

    #include <iostream>
    #include <fstream>

    #include "ArrayList.h"
    #include "AssertException.h"

    // Declaration of a pointer pointing on a function.
    class TestCase;
    typedef void (TestCase::*funcPointer)(void);

    /*
    * The class TestCase represents a test class. It provides basic methods to run and check a test case.
    /
    class TestCase {
    public:
    /

    * Runs a test case.
    */
    void test(string name);

    /*
    * Returns a list containing all test methods implemented in a particular test case.
    *
    * @return A list containing all test methods.
    /
    virtual ArrayList<funcPointer>
    methods(void) = 0;

    /*
    * Compares two parameters and returns true, if they are identical.
    */
    template <class X, class Y> bool assertTrue(X x, Y y);
    };

    template <class X, class Y> bool TestCase::assertTrue(X x, Y y) throw (AssertException) {
    if (x != y) {
    throw AssertException("x and y are not identical.");
    }
    return true;
    }

    --- TestCase.cpp ---
    #include "TestCase.h"

    void TestCase::test(string name) {
    ofstream log;
    log.open("testCase.log");

    log << name << endl;

    ArrayList<funcPointer>* methods = this->methods();

    for (int i = 0;i < methods->count();i++) {
    try {
    log << "- method(void)." << endl;
    (*methods->get(i))();
    log << " > no error occured." << endl;
    }
    catch(AssertException& e) {
    log << " > " << e.getMessage() << endl << endl;
    }
    }
    log.close();
    }

    --- TestArrayList.h ---

    #include "TestCase.h"

    /*
    * The class TestArrayList is a test class. It tests all implemented methods from the ArrayList and checks if they properly work.
    /
    class TestArrayList : public TestCase {
    public:
    /

    * Returns a list containing all test methods implemented in a particular test case.
    *
    * @return A list containing all test methods.
    /
    ArrayList<funcPointer>
    methods(void);

    /*
    * some test
    */
    void test...(void);
    }

    --- TestArrayList.cpp ---

    #include "TestArrayList.h"

    #include "ArrayList.h"

    ArrayList<funcPointer>* TestArrayList::methods(void) {
    ArrayList<funcPointer>* methods = new ArrayList<funcPointer>();

    //return all test methods!!!

    return methods;
    }

    void TestArrayList::test...(void) {
    ...
    }



  • oder gibt es sonst eine Möglichkeit eine Instanz nach den vorhandenen Methoden abzufragen?



  • Bitte benutze [cpp]-Tags, das ist die erste weisse Schaltfläche unter dem Textfeld.

    merlo schrieb:

    oder gibt es sonst eine Möglichkeit eine Instanz nach den vorhandenen Methoden abzufragen?

    Wieso sollte man das wollen? Ich hab das Gefühl, hier wäre ein anderer Ansatz besser geeignet. Was willst du genau erreichen?



  • Kennst du JUnit von java? Ich möchte mir ein Framework bauen, um die einzelnen Klassen einfach testen zu können...



  • merlo schrieb:

    Kennst du JUnit von java? Ich möchte mir ein Framework bauen, um die einzelnen Klassen einfach testen zu können...

    hier zwei Test Frameowrks für C++:
    http://apps.sourceforge.net/mediawiki/cppunit/index.php?title=Main_Page
    http://unitpp.sourceforge.net/

    Simon


Log in to reply