Konstruktor



  • Da ich jetzt weiss das dass ArraySize =10 ist habe ich die Zusicherung ein wenig
    umgeändert .

    Ich habe auch Speicher angelegt und mit delete freigegeben .
    War mir beim Speicher anlegen nicht ganz sicher ,da in Büchern hauptsächlich erklärt wie Speicher angelegt wird wenn das *Zeichen bei z.B m_rectangles steht.

    Habe es aber trotzdem versucht :

    #include "CDrawing.h"
    #include <ostream>
    using namespace std;
    CDrawing::CDrawing(int initialSize)
    {
        if(initialSize>0 && initialSize <=10){
    
            m_initialSize = initialSize;
        }
        else{
            m_initialSize = 10;
        }
        if(0<= m_nextFree <= m_arraySize){
    
            m_nextFree= nextFree;
        }
        else{
    
            m_nextFree=0;
        }
        if(m_arraySize>0 && m_arraySize <=10){
            m_arraySize= arraySize;
        }
    
        CRectangle* m_rectangles = new CRectangle;
    }
    
    CDrawing::~CDrawing()
    {
        delete[] m_rectangles;
    }
    

    Ist der Speicher so richtig angelegt?



  • xxx6 schrieb:

    Ist der Speicher so richtig angelegt?

    Nein, du musst auch die Größe übergeben.

    Ich habe den Thread jetzt nur so überflogen, daher: muss das in diesem veralteten Stil sein? Ansonsten std::vector (wobei ich wetten würde, dass dieser Hinweis in einem dreiseitigen Anfänger-Problem-Thread schon gegeben wurde)



  • Mit Grösse wäre es ja so:

    CRectangle* m_rectangles = new CRectangle[10];
    

    Wir haben nur eine einführung in Programmierung ,daher kein Vector behandelt.

    Wieso soll man beim Speicher allokieren noch die Grösse dazu schreiben ?
    Das stand z.B in Büchern nicht drinnen .

    Woher soll ich das wissen?



  • So, warum nicht

    m_arraySize = initialSize;
    

    Wenn du new keine größe mit gibst, reservierst du Speicher für ein Element. Dass ist nicht was du willst. Steht sehr sicher in jedem c++ Buch. Sonst in der Dokumentation.

    Außerdem gehört zu new ein delete, kein delete[].
    delete[] gehört zu new []

    Was du wahrscheinlich haben wolltest ist sowas:

    m_rectangles = new CRectangle[m_arraySize] ;
    


  • Wie sieht es eigentlich mit meinem Konstruktor aus Leute ?
    Ich meine in der Aufgabe ist ja kaum gesagt worden was die überhaupt wollen ?



  • Es ist offensichtlich was gefordert ist.



  • Oder anders gesagt, dein Konstruktor entspricht nicht den Anforderungen.



  • Was fehlt genau an meinem Konstruktor ?

    Es ist nur ne Ünungsaufgabeb



  • Der ist einfach nur falsch. Sinn des Konstruktors ist es anhand der übergebenen Parameter die Klassenmember korrekt zu initialisieren.
    Also bei deinem Code aus initialSize die beiden Member m_rectangles und m_arraySize zu setzen (m_nextFree ist ja schon über die Klassendeklaration im Header auf 0 gesetzt).

    Die (erste) Lösung sieht also so aus:

    CDrawing::CDrawing(int initialSize)
    {
        m_arraySize = initialSize;
        m_rectangles = new CRectangle[initialSize];
    }
    

    Für die Initialisierung gibt es aber explizit noch die Initialisierungsliste bei den Konstruktoren, so daß die Lösung dann so lautet:

    CDrawing::CDrawing(int initialSize)
     : m_arraySize(initialSize), m_rectangles(new CRectangle[initialSize])
    {
    }
    

    In gutem (professionellen) C++ Code würde man aber dann stattdessen std::vector<> benutzen.

    Und auf die ungarische Notation ("C" am Anfang des Klassennamens) solltest du auch zukünftig verzichten.

    PS: Die Schreibweise

    CDrawing(int initialSize = 10);
    

    im Header bedeutet nur, daß 10 der Vorgabewert (default value) ist, wenn man beim Aufruf keinen Parameter angibt, also

    CDrawing drawing;
    

    So wird der Konstruktor mit 10 als initialSize aufgerufen (innerhalb des Konstruktorcodes kann dir das aber egal sein und muß nicht explizit darauf geprüft werden).





  • Kann mir jemand paar tipps geben wie ich bei der Aufgabe d) vorgehen soll?

    Ich habe nicht mal ne idee wie ich rangehen soll,aber irgendwie muss ich es ja lernen



  • Gast83 schrieb:

    http://www.informatikerboard.de/board/thread.php?postid=15665#post15665

    Ja, das passiert, wenn man auf solche schlechten Fragestellungen eingeht.



  • Ja aber in dem Board gibt es leider nur freche Antworten leider



  • void add(const CRectangle& rectangle){
    
    for(int i =0 ; i>= rectangle ;i++){
    
    m_rectangles = new CRectangle[rectangle+i]; nächste freie Position geschrieben ?
    
    }
    

    Passt so in etwa der Anfang der add Methode?



  • Was sagt denn dein Compiler dazu? Du musst deinen Code schon ausprobieren...



  • Fehler : m_rectangles not declared in this scope

    Aber wie ich es weg bekomme ,keine Ahnung.



  • Du hast add als freie Funktion implemtiert und nicht als Klassenfunktion. Klassenfunktion haben die Form
    Klassennamen::Funktionnamen(Parameter)



  • xxx6 schrieb:

    Passt so in etwa der Anfang der add Methode?

    Jaja



  • void CDrawing::add(const CRectangle& rectangle){
    
    for(int i =0 ; i>= rectangle ;i++){
    
    m_rectangles = new CRectangle[rectangle+i]; nächste freie Position geschrieben ?
    
    }
    
    if(m_rectangles <= CRectangle[rectangles+99]){
    m_rectangles = new CRectangle[rectangles+rectangles]; verdoppelt?
    }
    }
    

    Aus meiner Sicht sollte das verdoppeln dann auch passen? 😃

    Wenn manni sich nicht über mich lustig gemacht hat 😃



  • Bei Kommentaren wird ein "//" voran gestellt.

    Da passt die Frage, ob Du überhaupt versuchst Dein Code zu kompilieren?


Anmelden zum Antworten