[C++] Nested classes

  • Hallo zusammen


    Zur Vermeidung doppelter Klassennamen im rpihddevice-Plugin bin ich auf der Suche nach einer eleganten, pragmatischen Lösung. Folgende Ausgangslage:
    - ein cAudioDecoder decodiert Audio
    - ein cAudioParser wird exklusiv von cAudioDecoder verwendet, um die Frames zu parsen.


    Nun gibt es aber im VDR bereits ein Klasse, die cAudioDecoder heisst - doof!


    Mein favorisierter Ansatz wäre folgender, vereinfacht dargestellt:


    Die Deklaration von cAudioDecoder in audio.h:


    Der AudioParser ist nun innerhalb von cAudioDecoder deklariert, um Verwechslungen vorzubeugen. Da niemand anderes den Parser benötigt, klingt das schon mal sinnvoll. Zudem ist die Klasse nur einfach deklariert, um das Header-File möglichst schlank zu halten.


    Die Implementation von cAudioDecoder in audio.c:


    Hier wird nun cAudioDecoder implementiert und - was ich nicht wusste, dass das mit verschachtelten Klassen möglich ist - cAudioDecoder::cParser deklariert und implemeniert.


    Meine Frage an die C++-Experten: Übersehe ich was? Ist das kompletter Murks? Ich persönlich finde die Variante recht elegant und der Compiler beklagt sich auch nicht.


    Vielen Dank für eure Inputs!


    Gruss
    Thomas

  • Eine Klasse ist letztlich auch ein Namespace, nur mit "mehr" Inhalt.
    Ich mache sowas fast täglich. Das ermöglicht einem, Implementierungsdetails der Öffentlichkeit vorzuenthalten und bei Bedarf durch neue Module zu ersetzen.


    Ist also eine vollkommen legitime Lösung.


    Lars.

  • Hallo Thomas,


    ich persönlich würde es mit namespace machen, es macht die Sache einfacher. Ich musste lange überlegen, was du da vor hast
    und bin immer der Meinung, wenn man nach einem halben Jahr darauf schaut und nicht sofort verstanden hat, was das steht,
    ist es zu kompliziert.


    Namespace hat natürlich hier bei dir den Nachteil, dass du über deine ganzen Klassen gehen musst, aber dann hast du dich
    schön von der anderen Welt abgetrennt und hast zukünftig einfach nur Vorteile.


    Frage, hast du dies schon einmal ausprobiert oder nur einfach einmal runter geschrieben ohne den Compiler
    angeworfen zu haben. Ich habe schon viel c++ Code gesehen, aber diesen Stil kenne ich so nicht.


    Gruß
    Guido

  • "class cParser *m_parser;" kenn ich auch nicht, aber ich arbeite beruflich auch nur mit Visual Studio, keine Ahnung, was man wie abkürzen kann, jeder Compiler hat ja auch noch seine Eigenheiten.


    Ich kenne es eher so:


    Kann ja aber evtl. das gleiche sein.


    Lars.

  • Hi Lars


    "class cParser *m_parser;" kenn ich auch nicht

    Das ist eine einfache "forward declaration" - keine Ahnung wie man das korrekt ausdeutscht. Das heisst, ich sage dem Compiler nur "hey, es gibt eine Klasse cParser, und darauf hätt ich gerne einen Pointer". Das ist so üblich, um z.B. die Abhängigkeiten zwischen den Header-Files zu reduzieren.


    Was ich eben auch nicht wusste, und was meine eigentliche Frage war, ist, dass das auch mit "nested" Klassen geht. Das heisst, ich sage in audio.h "hey, da gibts noch einen cParser innerhalb von cAudioDecoder". Da die Deklaration von cAudioDecoder nur einen Pointer auf cParser beinhaltet, und erst die Implentation von cAudioDecoder die Klasse cParser kennen muss, lässt sich so der ganze Karsumpel von cParser in audio.c verstecken.


    Kompiliert und funktioniert hier auch. Deshalb meine Frage in die Runde, ob das wieder mal Zufall ist (wie mit dem doppelten Klassennamen), oder ob ich mir da irgendwelchen Ärger mit andern Compilern einhandle. Denn ich finde obige Variante recht hübsch und würde sie gerne so übernehmen…


    Gruss
    Thomas


    Edit: Lars, habe deinen Post nicht sorgfältig zu Ende gelesen. Ja, das ist das selbe, wobei deine Variante einfacher zu formatieren ist, wenn mehrere Member untereinander stehen. ;)

  • "nested classes" sind ein von C++ erlaubter Mechanismus genau für deinen Zweck.
    Es muss dabei allerdings keine eingebettete Klasse sein, es würde mit namespace oder anderem Namen auch außerhalb deiner Klasse funktionieren.


    Also, meiner Meinung nach darfst du das so tun und handelst dir keinen Ärger ein. :)
    Ob nested oder namespace ist persönlicher Stil, im Code ist nachher kaum ein Unterschied zu sehen.


    Lars.

  • Ich bin auch nur mit dem Visual Studio unterwegs und habe mich von solchen Ausdrücken immer
    gedrückt. Sehe auch keine C++ Regelverletzung, daher mache es so und die Lösung
    mit der Nested-Klasse passt auch, da diese nur innerhalb von cAudioDecoder verwendet wird.


    Gruß
    Guido

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!