Konstruktoren und Klassenhierarchie



  • Danke für die Antworten:)
    also ich möchte mein Objekt über Parameter initialisieren, was setze ich denn ein wenn ein Zeiger erwartet wird?(10.0 wird nicht akzeptiert)
    Meldung:
    error C2664: 'Gemaelde::Gemaelde(std::string,double,double *,int,int,int)' : cannot convert parameter 3 from 'double' to 'double *'

    main:

    Kunstwerke* feld[2];
         feld[0]=new Gemaelde("See",39.9,10.0,30,40,1876);
    

    hab an den Elementinitialisiererlisten noch etwas verbessert:

    Graphiken::Graphiken(string n,double p,double* r,int l,int b,int t):FlacheObjekte(n,p,r,l,b),typ(t){}
    

    in der abstrakten BK soll das Feld rabatt dynamisch angelegt werden:

    Kunstwerke::Kunstwerke(string n,double p,double* r)
    {
    	name=n;
    	preis=p;
    	if(rabatt!=0)delete[]rabatt;
    	rabatt=new double[];
    	rabatt=r;
    }
    

    ich nehme an im Konstrukor ist was falsch...



  • Eine Anmerkung: Der Konstruktor von Graphiken ist derselbe wie von Gemaelde.


  • Administrator

    Wieso soll der Rabatt überhaupt ein Zeiger auf ein double sein? Mach doch daraus einen normalen Wert und keinen Zeiger ...

    Grüssli



  • in der Aufgabenstellung steht, dass man eine Rabattstaffel anlegen soll und zwar als dynamisches Feld ...
    ansonsten würd ich das auch sofort ändern:)


  • Administrator

    Hmmm, also zuerst mal vielleicht zu deinem Kunstwerk Konstruktor:

    Kunstwerke::Kunstwerke(string n,double p,double* r) 
    { 
        name=n; 
        preis=p; 
        if(rabatt!=0)delete[]rabatt;  // Unnötig und gefährlich. (1)
        rabatt=new double[sizeof(r)]; // Wird immer von der Grösse 4 oder 8 sein. (2)
        rabatt=r;                     // Erzeugt ein Speicherleck. (3)
    }
    

    (1) Wenn du ein Objekt konstruierst, dann zeigt rabatt ja noch auf keinen Speicher, daher muss du keinen löschen. Was aber sein kann ist, dass rabatt irgendeinen Wert hat, da er uninitializiert ist, wodurch du am Ende versuchen könntest, irgendwo Speicher freizugeben, der dir gar nicht gehört. Folge: Undefiniertes Verhalten.
    (2) r ist ein Zeiger und auf einem x86 System ist dieser 4, bzw. auf einem x64 System 8, Bytes gross. Und genau das ist es, was sizeof dir zurückgeben wird. Wenn du die Grösse des Arrays wissen willst, dann musst du die Grösse im Konstruktor mitübergeben.
    (3) Durch new double[...] hast du Speicher reserviert und den Zeiger darauf in rabatt gespeichert. Nun überschreibst du diesen Zeiger mit dem Zeiger r. Dadurch verlierst du jeglichen Zeiger auf deinen gleich davor reservierten Speicher und hast ein Speicherleck, da du den nicht mehr freigeben kannst. Wahrscheinlich wolltest du hier das Array, welches sich dahinter versteckt, kopieren. Nur weiss der Kompiler nichts davon, er sieht nur einen Zeiger auf einen einzelnen Double-Wert.

    Allgemein: Du solltest nochmals den Teil über Zeiger & Arrays durchlesen. Dringend!

    Zu deiner Rabattstaffel an sich:
    Wie soll die denn genau implementiert werden? Also wie entscheided das Objekt, wann welcher Rabatt genommen werden soll?

    In der Intialisierungsliste kann man kein Array mit Defaultwerten erstellen und übergeben. Also müsste man dies sowieso ein wenig anders lösen, als wie du es vorgehabt hast.

    Grüssli



  • Kunstwerke(string,double,double*);
    

    Ich würde zum besseren Vertändniss den Variablennamen mit angeben. Das wird ungeahnte Vorteile für den späteren Endbenutzer/Leser haben wenn er mit deinem Code arbeiten möchte.



  • danke...also zu (2)und(3): wie find ich denn die Größe von r raus?
    wenn ich die hätte könnte ich mit einer for-Schleife arbeiten
    und jedes Element von r einzeln in rabatt kopieren...



  • zu der Rabattstaffel steht in der Aufgabenstellung leider weiter nichts.
    Ich soll nur ein Objekt Gemaelde erstellen



  • Hi,

    gypsygirl schrieb:

    wie find ich denn die Größe von r raus?

    Wie bereits unter (2) gesagt wurde: Gar nicht! Musst du mit übergeben.



  • is mir jetzt auch klargeworden...:)


Anmelden zum Antworten