Vollständiges Objekt



  • Hallo,

    ich habe hier ein Programmbeispiel, bei dem von der abstrakten Basisklasse GraphObj auf zwei weitere Klassen virtual public vererbt wird: einmal auf BeschriftetesObjekt, ebenfalls abstrakt, und einmal auf die konkrete Klasse Rechteck. Von diesen beiden Klassen findet wiederum eine public-Mehrfachvererbung auf BeschriftetesRechteck statt. Den Konstruktor dieser Klasse zitiere ich grad mal:

    BeschriftetesRechteck(const Ort& ort, int h, int b, const std::string& b) : GraphObj(ort), BeschriftetesObjekt(ort, b), Rechteck(ort, h, b) {}
    

    Die Initialisierungen der Subobjekte mit dem Ort-Parameter (, der aus einer anderen Klasse bekannt ist, hier aber für das eigentliche Problem unwichtig ist,) findet direkt durch Aufruf des Basisklassen-Konstruktors statt. Die Ort-Parameter in den Konstruktoren der Klassen BeschriftetesObjekt und Rechteck werden schlichtweg ignoriert, da die Basisklasse GraphObj virtuell ist und somit in BeschriftetesRechteck nur ein Subobjekt der Klasse GraphObj vorhanden ist.

    So jetzt zu meiner eigentlichen Frage: (Ich hoffe, das Ganze war soweit verständlich.)
    In meinem Buch wird behauptet, ein vollständiges Objekt wäre ein Objekt, das nicht als Subobjekt in einem anderen Objekt auftaucht. Außerdem soll ein Objekt der Klasse Rechteck ein vollständiges Objekt sein. Dabei gibt's doch in BeschriftetesRechteck ein Rechteck-Subobjekt durch die public-Vererbung.

    Denkfehler meinerseits oder Fehler im Buch?

    Danke für eure Antworten. 🙂

    PS.: Kann mir jemand bitte den Unterschied zwischen Aggregation und der "benutzt-Beziehung" erklären?



  • naja bin mir nich sicher, aber vll. verwechselst du subobjekt und subklasse!
    Ein subobjekt ist meiner meinung nach eine objekt welches als Member in einem anderen Objekt existiert. Eine subklasse ist eine abgeleitet klasse..

    Zur zweiten Frage:

    Aggregation bedeutet das Objekt Y der Klasse X nur existiert , solange das Objekt A der Klasse B lebt. Objekt Y ist demnach ein Member der Klasse B, und weird erzeugt sobald Objekt A erzeugt wird.

    Benutz-Beziehugn bedeudet, das Objekt Y bzw. dessen klasse ander Objekte beinhalt bzw. benutzt... wobei die existens dieser Objekt nich abhängig von der existenz der Y Objektes ist.

    Hoffe ich habe die fragen richtig beantwortet


  • Mod

    Ein Subobjekt ist jedes Objekt, das Teil eines anderen Objektes ist: Elemente eines Arrays, nichtstatische Memberobjekte einer Klasse und Basisklassenobjekte einer Klasse. Ein Objekt, dass kein Subobjekt ist, ist ein vollständiges Objekt.

    Ein Objekt eine abstrakten Klasse kann nur als Basisklassensubobjekt auftreten (außer während der Konstruktion bzw. Zerstörung des Objekts der abgeleiteten Klasse [des abgeleiteten Objektes - was in meinen Augen aber eine unglückliche Begriffsbildung ist, denn Objekte werden ja gar nicht abgleitet, sondern Klassen]).

    Außerdem soll ein Objekt der Klasse Rechteck ein vollständiges Objekt sein. Dabei gibt's doch in BeschriftetesRechteck ein Rechteck-Subobjekt durch die public-Vererbung.

    Die Subobjekteigenschaft ist, wie der Begriff impliziert, die Eigenschaft eines bestimmten Objektes, nicht einer Klasse. In deinem Beispiel hast du also Recht; hier tritt Rechteck als Basisklasse auf, das zugehöre Objekt demzufolge ein Basisklassensubobjekt. Gemeint ist in dem Buch wohl, da Rechteck keine abstrakte Klasse ist, dass auch vollständige Objekte vom Typ Rechteck erstellt werden können.



  • @camper: Danke für die Erklärung. Ich dachte mir schon, dass damit die Möglichkeit der Erstellung von Rechteck-Objekten gemeint ist, wollte mich aber nochmal vergewissern. 😉

    @BorisDieKlinge:

    Objekt Y bzw. dessen klasse ander Objekte beinhalt

    wobei die existens dieser Objekt nich abhängig von der existenz der Y Objektes ist

    Ist das nicht widersprüchlich? Die benutzten Objekte werden doch erst erstellt, wenn ein Objekt Y initialisiert wird, da dessen Klasse die benutzten Objekte einschließt.



  • Ich meine damit, das Objekt Y referenzen auf X Objekte haben kann. D.h. die existens der X Objekte ist nich abhängig von der Lebensdauer des Y Objekts.

    class X{
      .....
    };
    
    // (A)
    class Y{
    
    X *m_pObj;
    
      Y(){
        m_pObj= new X();
      }
      ~Y(){
        delete m_pObj;
      }
    
    };
    
    //(B)
    
    //Erzeugen des Objekt irgendwo im Program
    X *pGlobObj= new X();
    
    class Y{
    
    X *m_pObj;
    
      Y(X *p): m_pObj(p){}
      ~Y(){}
    
    };
    
    // Löschen des X Objekts irgendwo im Programm
    delete pGlobObj;
    

    (A): X Existiert nur wenn Y existiert (Aggregation)

    (B): X Beinhalt Y (Referenz) aber Y lebe auch ohne X



  • Danke für dein Codebeispiel. Hab den Unterschied jetzt kapiert und dass man sich evtl. nicht allzu fest an gewisse Begriffe klammern sollte...



  • eben:) Im programmieraltag wird weniger mit solchen Begriffen umsich geworfen:)


Anmelden zum Antworten