Namespace in Klassendeklaration



  • Hallo,

    ich suche seit einiger Zeit nach speziellen Erklärung zu Namespaces. Mein Problem ist, dass ich meine Klassen in einem gemeinsamen Namespace deklariere (also alles in .h files). Da ich innerhalb dieser KLassen Zeiger oder Referenzen zu Klassen dieses Namensraum habe, ist meine Frage ob ich den Namensraum noch mal explizit angeben muss.

    file a.h
    
    namespace ABC {
      class ClassA {
      ..
      .. 
      }
    }
    
    file b.h
    
    namespace ABC {
      class ClassB {
      ..
      ClassB(ClassA* a) // Frage hier ABC::ClassA* oder oben using namespace?
      ..
      }
    }
    

    Wie am Bsp. zu erkennen möchte ich halt gern wissen, ob ich automatisch im Namensraum ABC bin, wenn ich eine Klasse in diesem deklariere. Oder muss ich bei Benutzung von Elementen aus diesem, jenes explizit angeben.

    Warum frage ich dass:
    Ich wollte ein UML Digramm meines Projektes mit Umbrello erstellen. Aber da kamen nur komische Sachan raus.

    MfG
    manne



  • ClassB(ClassA* a)
    

    Vor ClassA brauchst du kein ABC mehr schreiben. Wäre dies zwingend erforderlich, würde sich der COmpiler schon melden, das er ClassA nicht kennen würde.



  • Hallo,
    die Suche nach Namen beginnt im aktuellen Namensraum und, falls ein Name dort nicht gefunden wird, läuft in darüberliegenden Namensräumen weiter. Gleichzeitig werden Namen in äußeren Namensräumen immer von gleichen Namen im aktuellen Namensraum verdeckt. Solche können dann nur noch über eine Qulifikation angesprochen werden.

    In deinem Beispiel:
    Wenn bei der Definition von ClassB ABC::ClassA bekannt ist (z.B. weil b.h a.h inkludiert), dann ist ClassA im Konstruktor von ClassB äquivalent zu ABC::ClassA.
    Gäbe es zusätzlich noch ein ClassA im globalen Namensraum und sollte ClassB diese Klasse referenzieren wollen, dann müsste der Konstruktor-Parameter den Namen ClassA qulifizieren, also ::ClassA.
    Und nochmal zur Erinnerung: weder using-Direktiven noch using-Deklarationen gehören in Header.



  • Danke,

    da wäre jetzt nur noch eine Frage zu kären.
    Verwendet man bei der Benutzung von Elementen aus dem std namespace die folgende
    Schreibweise:

    // file a.h
    namespace ABC {
      class ClassA {
      ..
      ClassA(std::string& foo, string& bar){ // Frage hier ohne std:: oder mit?
      ..
      }
    }
    

    Das using namespace macht man doch im Allgemeinen nur in .C files (also .cpp)?

    Oder? (Ich glaub, ich hab zu lange Java programmiert 😉 )

    MfG

    // Tag repariert.



  • Hallo,
    in Headern ist die einzig sinnvolle Vorgehensweise die Qualifikation mit std::


Anmelden zum Antworten