Klassen untereinander bekannt machen



  • Also ich habe zwei Klassen:

    ...
    class schueler
    {
          public:
                 string nachname;
                 string vorname;
                 string strasse;
                 int plz;
                 string ort;
    };
    class noten
    {
          public:
                 int deutsch;
                 int englisch;
                 int mathe;
                 int technik;
    };
    ...
    schueler a;
    noten a;
    ...
    

    Grundsätzlich gehört aber noten zu schueler.
    Somit möchte ich später die objekte mit a.name und a.noten.deutsch oder ähnlich ansprechen können. Ich möchte halt aus gründen der Übersicht zwei getrennte klassen aber dennoch eine zusammengehörigkeit von noten zu schueler erzwingen.
    Wie gehts das?



  • Du musst dir eine Klassenvariable von der Notenklasse in deiner Schülerklasse anlegen.

    class Noten
    {
    //...
    };
    class Schueler
    {
    //...
    Noten n;
    };
    //...
    Schueler a;
    //Zugriff:
    a.n.deutsch = 3
    

    Gruss
    Tobi



  • Alles klar, danke. Ich habe auch mal was von einen Bezeichnungsoperator gelesen (::) wozu ist der gut?



  • Der Bezeichnungsoperator

    namespaceA::Class B
    

    erlaubt es dir meines Wissens "nur", Objekte aus einem beliebigen Namespace zu referenzieren.

    Wenn du dann die

    using namespaceA
    

    Derektive benutzt, kannst du dir im Normalfall den Bezeichnungsoperator sparen. Ausser du hast den selben Klassen bzw. Methodennamen in zwei verschiedenen Namespaces.



  • Das klappt nicht nur für Namespaces, sondern auch für statische Elemente einer Klasse:

    class schueler
    {
    public:
      static int count;
      ...
    };
    
    schueler::count = 47;
    


  • Das klappt auch für nichtstatische Elemente der Klasse (und jeder Klasse die sich in der Vererbungshierarchie der Klasse befindet). Insofern war dateiname.string::c_str() syntaktisch sogar korrekt, aber überflüssig (im anderen Thread);)



  • Na ok,

    wieder mal was gelernt... 😃 👍



  • LordJaxom schrieb:

    Das klappt auch für nichtstatische Elemente der Klasse (und jeder Klasse die sich in der Vererbungshierarchie der Klasse befindet). Insofern war dateiname.string::c_str() syntaktisch sogar korrekt, aber überflüssig (im anderen Thread);)

    Noob verwirrt 😞



  • Michael E. schrieb:

    Noob verwirrt 😞

    Bitte?



  • Michael E. schrieb:

    LordJaxom schrieb:

    Das klappt auch für nichtstatische Elemente der Klasse (und jeder Klasse die sich in der Vererbungshierarchie der Klasse befindet). Insofern war dateiname.string::c_str() syntaktisch sogar korrekt, aber überflüssig (im anderen Thread);)

    Noob verwirrt 😞

    struct Base {
      int i;
      void foo() { i=7; }
    }
    
    struct Derive : public Base {
      void bar() { 
        Base::foo();   //Aufruf der Funktion aus der Basisklasse
        cout<<Base::i<<'\n';  //gleiches Spiel...
      }
    };
    

    MfG

    GPC



  • Lol, nein, ich bin nicht verwirrt. Ich hab t1m0n in dem anderen Thread verwirrt.



  • Michael E. schrieb:

    Lol, nein, ich bin nicht verwirrt. Ich hab t1m0n in dem anderen Thread verwirrt.

    hehe, dachte mir schon, dass da irgendwas nicht stimmt, aber da ich nicht sicher war... 😉


Anmelden zum Antworten