Dynamische Klasse| Methode verlngt Zeiger



  • myClass objekt[50]; 
    
    //for jedes objekt 
    objekt[i] = new myClass;
    

    Kann doch auch schon nicht funktionieren, da objekt[i] vom Typ myClass und das Ergebnis des new-Ausdrucks vom Typ myClass* ist...



  • Hallo,

    Kann doch auch schon nicht funktionieren, da objekt[i] vom Typ myClass und das Ergebnis des new-Ausdrucks vom Typ myClass* ist...

    Sorry habe das * vergessen, so ist es richtig:

    myClass objekt[50];
    
    //for jedes objekt
    objekt[i] = new myClass;
    

    Grüsse



  • Oh man so ist es richtig:

    [cpp]
    myClass *****objekt[50];

    //for jedes objekt
    objekt[i] = new myClass;
    [/cpp]



  • Bitmap *bitmap = new Bitmap("lolzeriffic.bmp");
    

    ?



  • Ne das ist es nicht, BITMAP ist struct. Ich habe aber eine Klasse, die als Array initialisiert wird.

    In der Methode rufe ich die Funktion Blit() auf, welche einen Zeiger auf eine Bitmap Struktur verlangt, muss ich dabei auf etwas achten, wenn die Objekte der Klasse "myClass" so, wie oben, initialisiert werden?

    Grüsse.



  • MuuuhKuh schrieb:

    In der Methode rufe ich die Funktion Blit() auf, welche einen Zeiger auf eine Bitmap Struktur verlangt, muss ich dabei auf etwas achten, wenn die Objekte der Klasse "myClass" so, wie oben, initialisiert werden?

    Du musst vor allem darauf achten dass der Zeiger den Du übergibst auf etwas gültiges zeigt. Solltest Du nicht wenigstens ein Bild laden? 😉



  • Ihr überseht da gerade etwas, hier mal der echte Code(Ausschnitt):

    BITMAP * doublebuffer;
    
        CIcon icon1("icon.bmp");
        CIcon *icon_array[50];
    
        for(int i = 0; i < 50; i++)
        {
            pos = i*2;
            icon_array[i] = new CIcon;
            icon_array[i]->setpos(pos,pos);  
        }
    
        icon_array[0]->getY(); // Da ist kein Absturz!!!!
    
        //Weiter unten im Programm
        for(int i = 0; i < 50; i++)
        {
            icon_array[i]->paint(doubleBuffer, 0, 0); //ABSTURZ!!!!
        }
    
       //paint() benutzt blit...doubelbuffer ist oben als GLOBALE Deklariert:
       //Hier nochmal die funktion blit:
       void blit(BITMAP *source, BITMAP *dest, int source_x, int source_y, int dest_x, int dest_y, int width, int height);
    

    Hoffe das sagt mehr aus 🙂

    Grüsse



  • Auch in diesem Codebeispiel ist das Bitmap "doubleBuffer" ein uninitialisierter Zeiger. Das ist normal, dass das abstürzt.



  • Ahhh ich habe es hinbekommen, hier mal meine Lösung:

    //doubleBuffer etc...
    
        CIcon *Icon_array[10];
    
        for(int i=0;i < 10; i++)
        {
          Icon_array[i]= new CIcon;  
          Icon_array[i]->setimage("icon.bmp");   //FEHLER WAR HIER!!!!  
          Icon_array[i]->setpos(i*2,i*2);
        }
        //Weiter unten im Code
        for(int i=0;i < 10; i++)
        {   
          Icon_array[i]->paint(doubleBuffer,0,0);
        }
    

    Danke, das habe ich total vergessen, dass man BITMAP* auch füllen muss -.-
    Soviel dazu, im nachhinein scheint es auch logisch, dass der Fehler darin bestand 😕

    Jetzt habe ich noch eine kleine Programmiertechnische Frage:
    Ihr lest z.B. alle Datein eines Ordners aus. Und wollt diese wie oben mit Bildern darstellen (Die Klasse drum herum bietet noch tolle funktionen etc..).
    Wieviel Platz würdet ihr für die Objektzeiger verenden?

    CIcon *Icon_array[10];
    

    Oder gibt es da eine komplett dynamische Lösung bzgl. Klasseninstanzen...mal ausgegangen die pseudo Funktion "int count_dirs(char *path)" gibt die Anzahl der Dateien wieder.

    Danke nochmal für die Denkanstöße 🙂

    Grüsse



  • Wie wäre es mit std::list oder std::vector?



  • Hallo, ich habe es mit list oder vector noch nicht probiert, aber ich denke, diese Lösung hier ist auch ganz ok, oder?

    KLASSE

    class Array
    {
        private:
          int size;
          int* array;
    
        public:
          Array(int size)
          : size(size), array(new int[size])
          {}
    
          ~Array()
          {
            delete [] array;
          }
    
          int& set(int index)
          {
            return array[index];
          }
    
          int get(int index)
          {
            return array[index];
          }
    };
    

    MAIN

    int main(int argc, char *argv[])
    {
        int i;
        cin >> i;
        Array a(i);
    
        for(int j = 0;j < i;j++)
        {
            a.set(j) = j;    
        }
        for(int j = 0;j < i;j++)
        {
            cout << a.get(j) << endl;    
        }    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich habe ein Beispiel aus dem Internet abgeändert, was genau macht denn:

    Array(int size) : size(size), array(new int[size])
    

    ?!

    Grüsse



  • MuuuhKuh schrieb:

    Ich habe ein Beispiel aus dem Internet abgeändert, was genau macht denn:

    Array(int size) : size(size), array(new int[size])
    

    ?!

    Das initialisiert die Klassen-Variablen size und array. Es sind also praktisch Zuweisungen wie "this->size=size; this->array=new int[size];". Im Grunde ist es aber keine Zuweisung, sondern der Konstruktor dieser Variablen wird aufgerufen mit den Parametern in den Klammern.


Anmelden zum Antworten