simples Vererbungsproblem



  • Hey,
    ich komme grade aus dem Java-Lager und versuche meine ersten Gehversuche in C++. Leider begrüßt mich der C++-Compiler nicht ganz so herzlich. Mein Problem:
    Ich stelle eine einfache Vererbungshierarchie, wie in Java üblich, in C++ nach. Ein Klasse Objekt, nur bestehend aus einem Konstruktor und Destruktor, wird von einer Klasse Zahl geerbt. Zahl hat ne private Klassenvariable und ne get-Methode. Jetzt habe ich eine Vektor-Klasse geschrieben, die sich nicht kümmert ob es ein Zahlobjekt oder ein Stringobjekt. Also hat die Vektor-Klasse einen Objectarray und get und set-Methoden, die mit Objekt arbeiten.Leider verweigert sich das Testprogramm ein Zahlobjekt in den Vektor einzufügen, mit der lustigen Fehlermeldung(Visual C++):
    **error C2243: 'type cast' : Konvertierung von 'class Zahl ' zu 'class MyObject ' existiert bereits, aber es ist kein Zugriff darauf moeglich
    Der GCC für Linux sagt dazu:
    fields of `MyObject' are inaccessible in `Zahl' due to private inheritance

    Ich hoffe, jemand kann mir das erklären.

    Gruß, Hogo



  • Zeig mal bitte den Quellcode dazu. So müsste man zu sehr raten.



  • Wie hast du vererbt?

    class Zahl: Objekt { ... }; // private-Vererbung, oder
    class Zahl: public Objekt { ... }; // public-Vererbung?
    

    Normalerweise will man bis auf Sonderfälle public-Vererbung. Deine Fehlermeldung deutet daraufhin, dass du private vererbt hast.



  • Klar, kein Problem.
    Object.h
    class MyObject {
    public:
    MyObject();
    virtual ~MyObject();
    };

    Object.cpp
    #include "Object.h"
    MyObject::MyObject() {}
    MyObject::~MyObject() {}

    Zahl.h
    #include "Object.h"
    class Zahl : MyObject {
    private:
    int value;
    public:
    Zahl(int arg);
    virtual ~Zahl();
    int intValue();
    };

    Zahl.cpp
    #include "Zahl.h"
    Zahl::Zahl(int arg) : value(arg) {}
    Zahl::~Zahl() {}
    int Zahl::intValue() {
    return value;
    }

    Vector.h
    #include "Object.h"
    class MyVector : public MyObject {
    private:
    MyObject* list[];
    public:
    MyVector();
    virtual ~MyVector();
    MyObject get(int arg);
    void add(MyObject* arg);
    };

    Vector.cpp
    MyVector::MyVector() {
    list[100] = new MyObject();
    }
    MyVector::~MyVector() {
    // delete list;
    }
    void MyVector::add(MyObject* arg) {
    //list[1] = arg;
    }

    Test.cpp
    #include "Vector.h"
    #include "Zahl.h"
    #include <stdio.h>

    int main(int argc, char* argv[]) {
    MyVector* vec = new MyVector();
    Zahl* zahl = new Zahl(5);
    // In der Zeile hier drunter meckert er. zahl sei wohl schon mal
    // nach Object gecastet worden und jetzt geht das nicht mehr.

    vec->add(zahl);

    delete vec;
    return 0;
    }

    Wäre echt hammer, wenn du da den Fehler könntest.

    Hogo



  • Danke Bashar. Das hat geholfen. Ich wusste gar nicht das man von private ableiten kann und hab demzufolge wenig beachtung darauf gelegt.

    Danke nochmal

    Hogo



  • Du hast noch viel mehr Fehler drin. Bevor ich den Quellcode jetzt auseinandernehme, zwei Tipps:

    a) versuche nicht, Java-Konstrukte unreflektiert auf C++ zu übertragen. Das sind zwei verschiedene Sprachen mit verschiedenen Konzepten.

    b) versuche nicht, Programme zu schreiben, indem du solange daran rumfrickelst, bis der Compiler nicht mehr meckert. Du mußt verstehen was du machst.



  • 🙄



  • a) versuche nicht, Java-Konstrukte unreflektiert auf C++ zu übertragen. Das sind zwei verschiedene Sprachen mit verschiedenen Konzepten.

    b) versuche nicht, Programme zu schreiben, indem du solange daran rumfrickelst, bis der Compiler nicht mehr meckert. Du mußt verstehen was du machst.

    c) mach dich mit std::vector im Speziellen und mit Templates im Allgemeinen vertraut.


Anmelden zum Antworten