In-class definierte Klasse vorab deklarieren



  • Warum sollte man ueberhaupt Klassen in Klassen deklarieren. Sehe jetzt keine Vorteile darin.



  • knivil schrieb:

    Warum sollte man ueberhaupt Klassen in Klassen deklarieren. Sehe jetzt keine Vorteile darin.

    Beispielsweise wenn eine Klasse sehr speziell ist, und sie nur mit einer anderen Klasse zu tun hat. So braucht jemand der eine Liste verwendet ja auch nicht unbedingt eine Ahnung davon, wie die Elemente intern gehalten werden - Dies kann beispielsweise durch eine Inner-Class ausgedrückt werden (Die dann möglichst auch private ist)...

    cu André
    P.S: Ich verwende Inner-Classes beispielsweise beim Handle/Body-Idiom



  • Damit es zu keinen Namenskonflikten im globalen Gültigkeitsbreich kommt, wenn man andere Klassen erstellt, die den selben Namen hat wie deine neue Klasse, man aber selbst von der anderen Klasse nichts weiß. Meistens sind die verschachtelten Klassen friends der "Vater"-Klasse (nicht jetzt als Vererbung missverstehen), um diese zu beeinflussen, somit stört sie den Endanwender nicht, der evtl. gar nichts von seiner Existenz weiß.



  • Ad aCTa schrieb:

    Damit es zu keinen Namenskonflikten im globalen Gültigkeitsbreich kommt

    Das Problem sollte mit Namensräumen relativ schnell beseitigt sein.

    Man kann auch lokale detail -Namensräume für implementierungsspezifische Konstrukte schaffen, die werden wohl nicht aus Versehen ausgeleert.



  • Nexus schrieb:

    Man kann auch lokale detail -Namensräume für implementierungsspezifische Konstrukte schaffen, die werden wohl nicht aus Versehen ausgeleert.

    Was sind denn detail -Namensräume? Konnte das Stichwort im Stroustrup nicht finden.



  • ingobulla schrieb:

    Was sind denn detail -Namensräume? Konnte das Stichwort im Stroustrup nicht finden.

    "namespace detail", und darauf hoffen das kein Anwender sich daran vergreift...



  • Nexus schrieb:

    Man kann auch lokale detail -Namensräume für implementierungsspezifische Konstrukte schaffen, die werden wohl nicht aus Versehen ausgeleert.

    Das wird aber eher bei Templateprogrammierung benutzt, wo man in C++ zum Teil keine andere Möglichkeit hat, Implementierungsdeteils zu "verstecken".

    ingobulla schrieb:

    Was sind denn detail -Namensräume? Konnte das Stichwort im Stroustrup nicht finden.

    Solltest Du irgendwann mal Boost benutzen, guck es Dir mal genauer an. Da wird detail oft als Namensraum benutzt. Erfahrungsgemäß vergreift man sich aber auch recht oft daran. :p



  • Nexus schrieb:

    ...
    Man kann auch lokale detail -Namensräume für implementierungsspezifische Konstrukte schaffen, die werden wohl nicht aus Versehen ausgeleert.

    Da frage ich auchnochmal nach:
    - "detail" ist aber kein keyword sondern eher eine Konvetion, oder?
    - wie "leert man Namensräume aus" (oder Konstrukte?) ?

    Gruß,

    Simon2.



  • - "detail" ist aber kein keyword sondern eher eine Konvetion, oder?

    Ja, eher eine Konvention.

    Simon



  • - wie "leert man Namensräume aus" (oder Konstrukte?) ?

    using namespace xxx;
    

    Das hast du aber gewusst, oder? 😉



  • Das hast du aber gewusst, oder?

    Nein, habe nicht geuwsst das man dem so (ausleeren) sagt.
    Simon



  • theta schrieb:

    Das hast du aber gewusst, oder?

    Nein, habe nicht geuwsst das man dem so (ausleeren) sagt.

    War wohl eher der zweite Simon gemeint. 😉
    Ich hab dem einfach Ausleeren gesagt, weil man die Bezeichner im Namespace nicht mehr kategorisiert hat, sondern auf einen globalen Haufen wirft. So schubladen-mässig. 🙂

    Ja, detail ist ja nur eine von vielen Möglichkeiten, vielleicht nicht immer die ideale. Oft kann man auch verschachtelte Klassen oder nur Vorwärtsdeklarationen für PIMPL einsetzen...

    Zu dem Missbrauch von detail -Namensräumen: Sorry, aber das kann man dem Bibliotheks-Entwickler nicht vorwerfen. Genauso wenig, wie man ihm #define private public auf Seiten des Anwenders anlasten kann.



  • ingobulla schrieb:

    pumuckl schrieb:

    Wozu bräuchtest du das?

    Ich habe in der Header-Datei eine Funktion, die einen Parameter vom Typ "Zeiger auf B" hat.

    Dann includiere doch einfach in die Headerdatei die den Pointer benutzen soll den Header der A::B definiert.
    (Ja, ich weiß dass das eventuell nicht geht. Aber wenn hier nicht das vollständige Problem gezeigt wird, kann es auch keiner lösen. Am Besten mit dem üblichen: minimaler Code, der das Problem noch beinhaltet.)


Anmelden zum Antworten