class-Array an Funktion



  • Hallo !

    Ich habe ein Array vom Typ einer Klasse gebildet.

    Wie kann ich nun einer Funktion (z.b. einer Eingabefunktion) ein Element dieses Arrays übergeben, und dann eine Memberfunktion dieser Klasse benutzen ?

    Hier einige Codeschnipsel:

    class xyz
    {
        int a,b;
    
        ....
    
        m_DatenFuellen (int x, int y)
        {
            a = x;
            b = y;
        }
    };
    
    eingabe (...)
    {
        ...
    }
    
    int main ()
    {
        xyz classarray[20];
    
        // hier soll die Funktion hin, die mir die Variabeln a,b
        // der Instanz der Klasse in Feld 0 des Arrays
        // mit Daten füllt (mit Hilfe der Memberfunktion m_DatenFuellen
        eingabe(...)
    }
    

    Mein Hirngrütze reicht leider nicht aus das hinzubekommen. Oder geht es vielleicht gar nicht ?!?

    Vielen Dank schon mal
    Maik



  • Ich denke m_DatenFuellen soll eine Funktin sein, oder? Dann brauch sie enn Rückgabetyp oder void. Und ich glaube Member-Fkts bezeichnet man nciht mit m_...

    Aber zum Thema:
    Das ist gar nciht so schwer.

    Ein Arrayname ist ncihts anderes, als ein Zeiger auf das erste Element des Arrays. Daher kannst du der Funktin einfach den Arraynamen übergeben.

    [cpp]
    void eingabe(xyz* ZuFuellen)
    {
    // Einfach über den Zeiger die Funktion der Klasse aufrufen, sofern sie
    // nciht private oder protected ist
    ZuFuellen->DatenFuellen(3, 5);

    }

    int main(...)
    {
    xyz Array[20];

    eingabe(Array); // so übergibts du das erste Element, gleichwertig ist:
    // &Array[0], also die Adresse des ersten Array-Elements
    eingabe(&Array[13]) // so übergibts du das 13.Element, also Adresse(&) des 13 Elements von Array
    }
    [cpp]

    verstanden?



  • Maxi2 schrieb:

    Ein Arrayname ist ncihts anderes, als ein Zeiger auf das erste Element des Arrays. Daher kannst du der Funktin einfach den Arraynamen übergeben.

    Nicht ganz, ein Array ist schon ein eigener Typ.

    Um *ein* Element eines Arrays anzusprechen, brauchst du keine Zeiger. Die Funktion muss so geschrieben sein, wie sie es auch wäre, wenn du ohne Arrays ein Objekt an sie übergeben würdest - also eingabe(xyz& argument), wenn die Funktion ein vorhandenes Objekt bearbeiten soll. eingabe kannst du dann mit eingabe(xyzArray[n]) aufrufen.
    Wenn du eine beliebig lange Reihe von Elementen übergeben willst, geht es ungefähr so wie Maxi2 es geschrieben hat, nur, dass du noch eine Länge mit übergeben solltest:

    void eingabe(xyz* xyzs, unsigned anzahl)
    {
        for (unsigned i = 0; i < anzahl; ++i)
            xyzs[i].fooBar();
    }
    


  • Genau so, wie du -"operator void"- es geschrieben hast, habe ich es auch programmiert. Doch leider kommt dann diese Fehlermeldung beim erstellen:

    error C2664: '__thiscall xyz::xyz(const class xyz &)' : Konvertierung des Parameters 1 von 'class xyz *const ' in 'const class xyz &' nicht moeglich
    Ursache: Konvertierung von 'class xyz *const ' in 'const class xyz' nicht moeglich
    Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Ueberladungsaufloesung des Konstruktors ist mehrdeutig

    Wie unschwer zu erkennen ist benutze ich MS VC++ 6 (falls das damit was zu tun hat)



  • schau mal, ob dir folgende zwei lösungswege zusagen:

    #include <algorithm>
    #include <iostream>
    using namespace std;
    
    struct xyz 
    { 
        int a,b; 
    
        void m_DatenFuellen (int x, int y) 
        { 
            a = x; 
            b = y; 
        } 
    }; 
    
    void 
    eingabe (xyz *array, int how_many) 
    { 
    	for (int i = 0; i < how_many; ++i) {
    		int x, y;
    		cout << "Zwei Zahlen: ";
    		cin >> x >> y;
    		array[i].m_DatenFuellen (x,y);
    	}
    } 
    
    void
    eingabe2 (xyz &arr) {
    	cout << "Zwei Zahlen: ";
    	int x,y;
    	cin >> x >> y;
    	arr.m_DatenFuellen(x,y);
    }
    
    int main () 
    { 
        xyz classarray[5];   
        eingabe(classarray,5); //so
        for_each(classarray,classarray+5,eingabe2); //oder so
    }
    


  • Hallo ihr Drei !!

    Ich hatte von Anfang an einen ganz anderen Fehler. Die Funktion hatte ich ja schon genauso geschrieben, wie ihr drei sie mir hier noch mal gezeigt habt. Deshalb wurde ich ja so stutzig.
    Jetzt habe ich herausgefunden, dass es an meinem Destruktor in meiner Klasse lag. Ich bin halt Klassenneuling, und hatte den Destruktor einfach erst mal nur so hingeschrieben : xyz::~xyz();
    Das hat auch immer funktioniert, bis ich die Klasse in einem Array an eine Funktion übergeben wollte. Jetzt, wo ich den Destruktor gelöscht habe funktioniert es.
    Leider habe ich keine Ahnung, was der Destruktor mit meinem Problem gemeinsam hat. Vielleicht weiss ja von euch jemand Rat.

    Hier noch einmal die Fehlermeldung die mit Destruktor auftrat:
    error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall xyz::~xyz(void)" (??1xyz@@QAE@XZ)
    Debug/xyz.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

    Vielen Dank erst mal so weit

    Maik



  • Das hätte man dir auch früher sagen können, wenn du die Fehlermeldung einfach gepostet hättest... 😑
    Dann ist der Fehler auch klar, du hast am Anfang nur beschrieben, was du glaubst weswegen es nicht klappt, Fehlermeldungen sind klar.

    MfG MAV



  • du musst den destruktor noch irgendwo definieren:

    class xyz {
    public:
    ~xyz(); //stattdessen entweder hier:
    /* xyz () {} */
    };
    
    //oder so:
    xyz::~xyz() {}
    

    der destruktor muss definiert sein, er wird ja garantiert aufgerufen.
    merke: destruktoren muss man immer definieren.


Anmelden zum Antworten