Scope-Operator



  • hiho ihrs,

    ich habe eine Verständnisfrage zum Scope-Operator.

    Folgendes Beispiel:

    #include <iostream>
    using namespace std;
    
    class A
    {
        public:
            int i;
    };
    
    class B : public A{};
    
    class C : public A{};
    
    class D : public B, public C{};
    
    int main()
    {
        D d;
    
        cout << d.B::A::i;
        cout << d.B::i;
    
        system("pause>nul");
        return 0;
    }
    

    Compilerfehler: 'A' is an ambiguous base of 'D'.

    - Wenn man ein Objekt einer Subklasse erzeugt, enthält dieses ja ein anonymes Objekt der Basisklasse.

    - Demnach hat also ein B-Objekt und ein C-Objekt jeweils ein anonymes A-Objekt.

    Frage:
    Wieso funktioniert " d.B::A::i " nicht, bzw. was sagt diese Anweisung genau aus ?

    Ich dachte, dass man mit dieser Anweisung explizit das anonyme Objekt der Klasse B anspricht,
    demnach also B::A::i <==> B::i sein sollte.... dem scheint aber nicht so 😕

    danke euch



  • Compilerfehler: 'A' is an ambiguous base of 'D'.

    - Wenn man ein Objekt einer Subklasse erzeugt, enthält dieses ja ein anonymes Objekt der Basisklasse.

    - Demnach hat also ein B-Objekt und ein C-Objekt jeweils ein anonymes A-Objekt.

    Was verstehst du unter anonym? Jedes der beiden Basisklassenobjekte hat ein A-Basisklassenobjekt. Da ist aber nichts anonym dran, die sind öffentlich geerbt, also auch öffentlich zugreifbar.

    Versuch dir möglichst keine unüblichen Bezeichnungen anzugewöhnen - es wird dich niemand verstehen...



  • Hi Dweb,

    keine Ahnung, warum der scope-Operator sich beschwert,
    jedoch geht es so ohne Probleme, falls du nur eine Lösung dafür suchst:

    D d;
    B& b = d;
    cout << b.i;
    

    oder alternativ:

    cout << static_cast<B&>(d).i;
    

    Gruß,
    CSpille

    EDIT: Hoffentlich hat es keiner gemerkt ^^



  • pumuckl schrieb:

    Was verstehst du unter anonym?

    Das implizit erzeugte Objekt der Klasse A hat ja keinen Namen, darum nenne ich es anonym 😋



  • CSpille schrieb:

    keine Ahnung, warum der scope-Operator sich beschwert,
    jedoch geht es so ohne Probleme, falls du nur eine Lösung dafür suchst:

    hihi, eine Lösung habe ich schon 🙂
    Aber wenn du es so sagst... kommt bei dir mit meinem Beispiel kein Compilerfehler CSpille ?



  • Dweb schrieb:

    CSpille schrieb:

    keine Ahnung, warum der scope-Operator sich beschwert,
    jedoch geht es so ohne Probleme, falls du nur eine Lösung dafür suchst:

    hihi, eine Lösung habe ich schon 🙂
    Aber wenn du es so sagst... kommt bei dir mit meinem Beispiel kein Compilerfehler CSpille ?

    Doch...
    Ich krieg den gleichen Compilerfehler

    EDIT: i686-apple-darwin9-g++-4.0.1



  • sou,
    habe gerade folgendes gefunden, ich zitiere:

    The compiler checks for ambiguities at compile time. Because ambiguity checking occurs before access control or type checking, ambiguities may result even if only one of several members with the same name is accessible from the derived class.

    Wenn ich das richtig verstehe, interessiert den Compiler zuerst einmal gar nicht ob da B::A::i oder C::A::i oder sonstwas mit A::i steht.

    Das heißt, sobald der Compiler A::i erkennt platzt ihm der Kragen,
    egal in welcher Relation das A::i verwendet wird.



  • Dweb schrieb:

    pumuckl schrieb:

    Was verstehst du unter anonym?

    Das implizit erzeugte Objekt der Klasse A hat ja keinen Namen, darum nenne ich es anonym 😋

    Das ist genauso implizit oder explizit erzeugt wie sämtliche Memberobjekte. Es als anonym zu bezeichnen, weil es keinen Namen hat, ist nicht üblich. Nenns einfach Basisklassenobjekt, ohne implizit und anonym, dann weiß jeder was gemeint ist 😉


Anmelden zum Antworten