C++: Interfaces



  • Hallo zusammen,

    ich möchte in C++ für eine größere Applikation Interfaces benutzen.
    Jetzt hab ich mich etwas eingelesen und habe jetzt das Problem, diese zu implementieren:
    Googelt man nach Interfaces in C++ dann scheint mir, als ob jedes Tutorial einen anderen Weg geht. Ich finde hier Schlüsselwörter wie:
    - interface class{}
    - public ref interface class {} // oder so ähnlich
    - __interface
    - virtual Klassen mit pure virtual member functions
    - vererbung vs "implements"
    - ...

    Da ich durch all diese verschiedenen Möglichkeiten etwas verwirrt bin und zudem kein einziges Beispiel fehlerfrei kompilieren kann (MS VS2010 Ultimate), wäre ich sehr dankbar, wenn jemand ein ganz kurzes einfaches interface beispiel posten könnte (oder auch ein gutes Tutorial).

    Vielen Dank 🙂
    lg
    moon



  • Interfaces an sich gibt es in C++ nicht. Entweder du hast du hast beim googlen C++/CLI-Ergebnisse oder andere Compiler-Spezifische Erweiterungen bekommen.

    In C++ emuliert man in der Regel Interfaces durch Klassen, die pure virtual Methoden enthalten.

    class IIrgendwas
    {
    public:
        //EDIT: virtueller Destruktor (Danke @manni, war mir bisher neu)
        virtual ~IIrgendwas() {}
    
        virtual void foo() = 0;
        //weitere Methoden 
    };
    
    class KlasseDieDasInterfaceIrgendwasImplementiert : public IIrgendwas
    {
    public:
        virtual void foo() override; //Override gibts erst seit C++11; wenn ein Fehler kommt einfach weg lassen
    };
    
    void KlasseDieDasInterfaceIrgendwasImplementiert::foo()
    {
        bar();
    }
    


  • Es gibt in C++ keine Interfaces. Man kann aber eine Klasse mit rein virtuellen Funktionen (pure virtual) und einem virtuellen Destruktor definieren. Dies entspricht dann in etwa dem Interface in Java. Wenn du irgendetwas mit "interface" findest, ist es kein Standard-C++.



  • struct Renderable
    {
        virtual void render() const = 0;
        virtual ~Printable() {}
    };
    
    struct Car : Renderable
    {
        virtual void render() const
        {
            myRender.renderCoolCar();
        }
    };
    


  • Hi und vielen Dank,
    dass hat auf jeden Fall etwas Klarheit reingebracht!

    @Jonas:
    In Zeile 17 muss es bei mir heißen:

    [u]void [/u]KlasseDieDasInterfaceIrgendwasImplementiert::foo()
    

    Sonst bekomme ich eine Fehlermeldung.

    Noch eine Frage:
    Was hat es besonderes mit der Erklärung von MSDN auf sich?
    http://msdn.microsoft.com/de-de/library/737cydt1.aspx
    Das scheint mir "normaler" C++ - Code zu sein oder lieg ich da falsch?

    lg, moon



  • moon12 schrieb:

    oder lieg ich da falsch?

    Ja.



  • moon12 schrieb:

    Noch eine Frage:
    Was hat es besonderes mit der Erklärung von MSDN auf sich?
    http://msdn.microsoft.com/de-de/library/737cydt1.aspx
    Das scheint mir "normaler" C++ - Code zu sein oder lieg ich da falsch?

    Das ist kein C++, sondern C++/CLI, einer andere Sprache, wurde von Jonas schon erwähnt.



  • Das ist C++/CLI.

    EDIT: Oh, sehr spät. Antwort gedrückt, getippt, ein paar Minuten telefoniert, auf Absenden gedrückt. 😃 🕶



  • moon12 schrieb:

    @Jonas:
    In Zeile 17 muss es bei mir heißen:

    void KlasseDieDasInterfaceIrgendwasImplementiert::foo()
    

    Ups stimmt, vergessen. Habs schnell runtergetippt. Shame on me.


Log in to reply