Konstruktor



  • Genau, die größe des aktuellen Arrays. Das soll nur 10 entsprichen, wenn der Konstruktor ohne Parameter aufgerufen wird, oder eben mit 10 als Parameter.

    Aber verwechsel nicht größe eines Arrays und Zugriff Index, siehe Manni66s Post.



  • 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 😃


Anmelden zum Antworten