Konvertierungskonstruktor und Vererbung



  • Hallo!

    Muss euch nochmal nerven. Hab folgendes Problem, will eine Konversion von einer abgeleiteten Klasse zu einer Basisklasse über den Konversionskonstruktor ermöglichen, der Compiler meckert aber.
    Der Quellcode sieht prinzipiell so aus:

    class ob
    {
    protected:
        int i;
    
    public:
        ob(int j=0) : i(j) {};
    };
    
    class wa : public ob
    { 
    public:
       int n;
        wa() : n(0) {};
    
        //Konvertierungskonstruktor
        wa(const ob a)
        {
        n = a.i;  // kann nicht auf i zugreifen
        }
    };          
    
    int main()
    {
    ob to(3);
    wa tw;
    tw=to;
    printf("%d",tw.n);
    
    return 0;
    }
    

    (Hab alles nur aus Bequemlichkeitsgründen so untereinander in eine Datei geschrieben, also dass das nicht so gut ist weiß ich auch 😉 )

    Aber warum kann der Konversions-c'tor trotz protected nicht auf i zugreifen? Und wie kann ich das Problem am geschicktesten lösen?

    Ich danke euch allen! 🙂



  • Aber warum kann der Konversions-c'tor trotz protected nicht auf i zugreifen?

    Du kannst selbstverständlich auf i zugreifen. Aber natürlich nur auf this->i.
    Das Objekt a ist aber ein völlig eigenständiges Objekt, dass in keiner Beziehung zu deinem wa-Objekt steht. Und eigenständige Objekte schützen ihre Innereien. Du hast von *außen* nur Zugriff auf die public-Elemente.

    Und wie kann ich das Problem am geschicktesten lösen

    Durch eine öffentliche Schnittstelle.

    Allerdings sieht das ganze Beispiel sehr unfein aus. Ich hoffe du hast gute Gründe dafür a) von einer konkreten Klasse abzuleiten und b) dann auch noch Zuweisungen zwischen den unterschiedlichen Typen zuzulassen.



  • hmmm, okay. Ich werd mal gucken, ob ich damit weiter komme. Dank dir!



  • Hi,

    falls es unklar war, was Hume meinte 😉

    Mit oeffentlichen Schnittstellen meint Hume Methoden.
    Beispiel:

    class ob
    {
      private:
          int m_i;
      public:
          void SetI ( int i )
              { m_i = i; }
          int GetI () const
              { return m_i; }
    };
    

    Nun kannst du mittels diesen beiden Methoden mit 'm_i' arbeiten.

    mfg
    v R



  • Nun kannst du mittels diesen beiden Methoden mit 'm_i' arbeiten.

    Jetzt noch, solange es noch nicht soviele geshen haben, schnell m_i private machen und wir sind aus dem Schneider 🙂



  • Was? Weiss gar nicht wovon du redest 😃 lol

    mfg
    v R


Anmelden zum Antworten