Addresse einer Funktion eines Objektes





  • Hallo!

    Ich sehe bisher immer nur dass überall alle möglichen Beispiele mit den Namespaces laufen, also Beispiel Addr::MemberFunction

    Und das so etwas als Argument übergeben wird. Ist es nicht möglich das von Objekt zu Objekt unterschiedlich zu machen?

    Ich möchte nämlich etwas in dem Objekt speichern und je nachdem was drinsteht, die Objekte einzeln ansprechen und extern die Member aufrufen, aber wie gesagt, je nachdem was die Objekte drinhaben. So wie es mir scheint, bezieht sich aber die Beispielpalette nur auf die ganzen Klassen selbst, und nicht auf Objekte, oder seh ich das falsch?

    Danke für die tipps und Links.



  • DonnerCobra schrieb:

    Ich sehe bisher immer nur dass überall alle möglichen Beispiele mit den Namespaces laufen, also Beispiel Addr::MemberFunction

    Und das so etwas als Argument übergeben wird. Ist es nicht möglich das von Objekt zu Objekt unterschiedlich zu machen?

    Nein. Wenn du 1000 Objekte einer Klasse erstellst, hast du ja schließlich nicht tausendmal die Methode im Speicher. Die Adresse der Methode ist für alle Objekte dieselbe. Du brauchst zum Aufruf immer das Objekt.



  • Äh...was? Suchst du Infos zu Polymorphie? (Stichwort!)
    Übrigens sind das nicht direkt "Namespaces" (mit Keyword 'namespace'), sondern Klassen...und so werden nun einmal "pointer to non-static member-functions" deklariert.

    suchst du eher eine Lösung mit Polymorphie?

    #include <iostream>
    #include <string>
    
    // pure virtual class
    class BasePrinter {
    public:
        virtual ~BasePrinter() {}
        virtual void print(const std::string& str) = 0;
    };
    
    class StandardPrinter: public BasePrinter {
    public:
        void print(const std::string& str) {
            // mit std::cout schreiben wir auf STDOUT
            std::cout << str << std::endl;
        }
    };
    
    class ErrorPrinter: public BasePrinter {
    public:
        void print(const std::string& str) {
            // mit std::cerr schreiben wir auf STDERR
            std::cerr << str << std::endl;
        }
    };
    
    // test
    void func(BasePrinter* p)
    {
        if(!p) return;
        p->print("meine ausgabe");
    }
    
    int main()
    {
        BasePrinter* _out = new StandardPrinter();
        BasePrinter* _err = new ErrorPrinter();
    
        func(_out); // gibt "meine ausgabe" auf STDOUT aus
        func(_err); // gibt "meine ausgabe" auf STDERR aus
    
        delete _out;
        delete _err;
    }
    

    meinst du so etwas?



  • Hi!

    Ich danke dir, das ist echt ein super Codeschnippsel zum verstehen.

    Ich suche nur noch die Möglichkeit direkt die Adresse von der Methode printf zu übergeben. Geht das irgendwie?



  • DonnerCobra schrieb:

    Ich suche nur noch die Möglichkeit direkt die Adresse von der Methode printf zu übergeben. Geht das irgendwie?

    int (*f) (const char* , ...);
    f = &std::printf;
    

    Macht aber nicht viel Sinn, wenn du ja die Funktion schon kennst, die du aufrufen willst.



  • Hi!

    In dem Falle bräuchte ich aber die Methode des Objektes

    Und da meckert der Compiler rum wenn ich schreibe &myclass->mymethod
    und das übergeben möchte 😕 hm...



  • DonnerCobra schrieb:

    Hi!

    In dem Falle bräuchte ich aber die Methode des Objektes

    Und da meckert der Compiler rum wenn ich schreibe &myclass->mymethod
    und das übergeben möchte 😕 hm...

    lies die links.

    &myclass::mymethod



  • Dazu hatte ich bereits was geschrieben!

    DonnerCobra schrieb:

    Hallo!

    Ich sehe bisher immer nur dass überall alle möglichen Beispiele mit den Namespaces laufen, also Beispiel Addr::MemberFunction

    Und das so etwas als Argument übergeben wird. Ist es nicht möglich das von Objekt zu Objekt unterschiedlich zu machen?

    Ich möchte nämlich etwas in dem Objekt speichern und je nachdem was drinsteht, die Objekte einzeln ansprechen und extern die Member aufrufen, aber wie gesagt, je nachdem was die Objekte drinhaben. So wie es mir scheint, bezieht sich aber die Beispielpalette nur auf die ganzen Klassen selbst, und nicht auf Objekte, oder seh ich das falsch?

    Danke für die tipps und Links.

    MFK hatte aber einen sehr guten Hinweis. Danke dir.. gut zu wissen.



  • wenn du das Klassenunabhängig machen willst, kannst du ja Templates verwenden:

    #include <iostream>
    
    class Standard
    {
    public:
        void print(const char* str) {
            std::cout << str << std::endl;
        }
    };
    
    class Error
    {
    public:
        void print(const char* str) {
            std::cerr << str << std::endl;
        }
    };
    
    template<typename T>
    void funct(void (T::*member)(const char*))
    {
        T obj; // objekt erzeugen
        (obj.*member)("hallo welt");
    }
    
    int main()
    {
        funct(&Standard::print);
        funct(&Error::print);
    }
    


  • ich schätze er hätte gern einen "bound member function pointer" gehabt der dann kompatibel mit einem "free function pointer" ist.
    nen automatisch generierten "thunk" quasi.

    das was in C# oder C++/CLI delegates machen.



  • hrm...da fällt mir noch boost::function ( http://www.boost.org/doc/libs/1_36_0/doc/html/function.html ) ein, sowie
    http://www.codeproject.com/KB/cpp/FastDelegate.aspx und
    http://www.codeproject.com/KB/cpp/fd.aspx

    vielleicht ist ja was brauchbares dabei 😉



  • Hi! Ich danke für die Hilfe.. 🙂


Anmelden zum Antworten