Array von Klassenelementen



  • moin

    für eine Hausarbeit (für die ich die STL nicht verwenden darf), möchte ich eine Liste selber schreiben. in die Liste soll soetwas wie eine valarrayklasse kommen.

    Was muss ich sonst noch beachten ? ich muss nen eigenen Copy-constructor für die liste schreiben, muss immer hübsch arrays umallokieren, wenn ich nen Punkt oben drauf setzen will usw....

    Muss die Klasse Punkt irgendeinen weiteren Konstruktor besitzen, damit ich Instanzen von ihr mittels new anlegen kann ?

    Jetzt hab ich aber ein kleines Problem: Das Programm hängt sich auf, wenn

    point* temp = new point[  this->size  ] ;
    

    versucht wird.

    point ist mein "valarray" ersatz.

    class point{
        public:
            // constructor
            point(); // STD -Konstructor
            point( const double& X,const  double& Y);
            point(const point& P);
    
            // operator
            point& operator +=(const point& V);
            point& operator -=(const point& V);
            point& operator *=(const double& s);
    
             // blabla friend operatoren und access funktionen
    
        private:
            double X;
            double Y;
    };
    


  • Hmm. Für mich sieht die point Klasse ganz einfach aus, wie eine Punktklasse. 😉
    Von einem Container sehe ich da nichts..
    Das sieht eher aus, wie etwas, was in einen solchen Container gespeichert werden soll.

    Und in der geposteten Zeile sehe ich auch nichts grundlegend falsches. Aber this->size könnte nicht initialisiert sein und so etwas, wie -982345 enthalten. Dann wirst du einen Laufzeitfehler bekommen.

    Für eine Implementierung einer Liste kannst du dir ja mal die std::list Klasse anschauen, wie die so aufgebaut ist. Da siehst du dann die gängigen Operationen, wie das hinzufügen, löschen usw. von Elementen. Dann kannst du dir ja mal überlegen, wie du das selbst umsetzen könntest.



  • ja, tatsächlich - ich idiot. Es gab nen constructor, bei dem ich das vergaß -.-

    So, jetzt kommen gaaanz viele Allocation errors.

    ok, ich versuche das darzustellen:
    Ich möchte also meine Containerklasse als Referenz in eine rekursive Funktion schreiben - erstmal vorweg, was brauche ich dafür ?
    Nen Copy-Constructor nehme ich an, damit ich jedes Element kopieren kann.
    Wie muss so zum Beispiel eine Stack-artige add-Funktion aussehen ?
    So: sachen, wie ich sie mir für ne Containerklasse vorstelle.

    void liste::addPoint(point P){
        // erzeuge neues array mit size++
       this->copy(  );
        this->list[this->size-1] = P ; // list ist das private-array 
    }
    void  liste::copy(){
        this->size++;
        point* temp = new point[  this->size  ] ;
        for(int i= 0; i< this->size-1; i++){
            temp[i] = this->fig[ i ];
        }
        delete[] this->list; // gib altes frei
        this->list = temp;
    }
    


  • Du solltest dir erst mal klar darüber werden, was du genau möchtest. Eine Liste, ein Stack oder doch was anderes?

    Das was du das hast im so so ziemlich keine Liste. 😉 (eine Liste hat üblicherweise verknüpfte Elemente, wie z.B Bahnwagons, die aneinenander hängen).

    Die üblichen Operationen auf einen Stack sind ja push, pop und top. Was auch intuitiv beschreibt, was ein Stack sein soll. (haben Heute gerade mathematisch definiert, was ein Stack ist. :p)
    Aber intuitiv und für eine naive Implementierung reicht wohl die Vorstelltung eines Stapels im Sinne eines Tellerstapels, wie es oft in der Literatur vor kommt.

    Dein copy verstehe ich nicht ganz. Woher kommt da fig? Für mich ist das eh keine copy Operation, sondern hat eher was mit einer Zuweisung zu tun.

    Die Datenstrukturen sind meist recht gut im Internet dokumentiert und können einiges wahrscheinlich besser eklären, als ich eben mal so hier. Z.b mal hier:
    http://de.wikipedia.org/wiki/Stapelspeicher

    Da findest du sehr viel dazu:
    http://www.google.ch/search?hl=de&client=firefox-a&rlz=1R1GGGL_de___CH343&hs=iPe&q=stack+c%2B%2B&btnG=Suche&meta=&aq=f&oq=



  • Ok - also. Ich brauche eine Liste, aber sie muss nicht verknüpft sein. Es reicht ein Array. Ich will nen push und ein insert, bei dem alles nach oben rutscht. Das beides meine ich schon zu haben. Was ich gerade einfach nicht weiß ist, beispielsweise, was ich brauche, damit ich diese Liste dann als Referenz in eine rekursive Funktion packen kann (Copy-Constructor, Zuweisung?).


  • Mod

    Floyd schrieb:

    Ok - also. Ich brauche eine Liste, aber sie muss nicht verknüpft sein. Es reicht ein Array. Ich will nen push und ein insert, bei dem alles nach oben rutscht. Das beides meine ich schon zu haben.

    Das hört sich abenteuerlich an...

    Was ich gerade einfach nicht weiß ist, beispielsweise, was ich brauche, damit ich diese Liste dann als Referenz in eine rekursive Funktion packen kann (Copy-Constructor, Zuweisung?).

    Na, die Sachen die du auch benutzt. Wie sollen wir denn wissen, was du brauchst?

    Als Faustregel gibt es die Regel von den großen Drei: Wenn du überhaupt eines der folgenden selber definieren musst, dann musst du das auch für die anderen beiden machen: Destruktor, Copy-Konstruktor, Zuweisungsoperator.

    Sehr nützliche Regel, sollte man sich merken.

    edit: Und noch ein Lemma, das ich mir gerade selbst ausgedacht habe, daher hat es keinen besonderen Namen: Enthält deine Klasse Zeiger auf Datenelemente die von deiner Klasse mittels new angelegt werden, dann wirst du fast immer Destruktor, Copy-Konstruktor und Zuweisungsoperator selber schreiben müssen.



  • SeppJ schrieb:

    Floyd schrieb:

    Ok - also. Ich brauche eine Liste, aber sie muss nicht verknüpft sein. Es reicht ein Array. Ich will nen push und ein insert, bei dem alles nach oben rutscht. Das beides meine ich schon zu haben.

    Das hört sich abenteuerlich an...

    Das hört sich nach einem Arrlistack an. 😛

    @Floyd:
    Kommt auf die rekursive Funktion an. Du kannst ja wie du sagst lediglich eine Referenz übergeben.



  • Ok - also jetzt muss ich eine insert Funktion für ein array schreiben - ohne STL und irgendwie bin ich fertig und sehe den fehler net mehr -.-
    Die folgende Funktion sollte bei dem (0 gezählten) Punkt das entsprechende Element einfügen und den rest hochschieben - sie macht aber alles mögliche gleich 0 - ich sollte eine Pause einlegen.

    void list::insertAt(point P, int pos ){
        this->size++;
        point* temp =new point[ this->size ] ;
    
        for(int i= this->size-1; i>pos ; i--){
            temp[i] = this->fig[i-1] ;
        }
        temp[pos] = P;
        delete[] this->fig;
        this->fig = new point[ this->size ] ;
        for(int i = 0; i< this->size; i++){
            this->fig[i] = temp[i] ;
        }
        delete[] temp;
    }
    


  • ok ich habs - ich sagte ja, ich bin fertig -.- man sieht, es nicht wahr, sofort sieht man das -.-


Anmelden zum Antworten