Auf dem Heap erzeugte Klasse in Funktion aufrufen



  • Hallo,

    Ich bin gerade dabei von einem Basic-Dialekt umzusteigen auf C++. Hierbei stehe ich vor einem Problem. Ich versuche jetzt schon länger hinter die Lösung zu kommen, ich schaffe es aber nicht.

    Folgendes Problem:

    // Header
    
    // Ich erzeuge meine Klasse
    class CKlasse
    {
    private:
    	int MeineVariable;
    
    public:	
    	float Memberfunktion ();
    };
    
    // Funktionsprototyp
    void MeineFunktion (int Zahl, CKlasse *pInstanz);
    

    Hier erstelle ich den Header mit einer Klasse.

    // main Funktion
    
    int main()
    {
    	// Variablen
    	int Zahl = 3;
    
    	// Klasse wird auf dem Heap erzeugt
    	CKlasse *pInstanz = NULL;
    	pInstanz = new CKlasse[Zahl]; // <-- nämlich in dem Fall 3x
    
    	MeineFunktion (Zahl, pInstanz); // damit rufe ich meine Funktion auf...
    }
    

    3 Instanzen der Klasse werden auf dem Heap erzeugt, Funktion wird aufgerufen.

    void MeineFunktion (int Zahl, CKlasse *pInstanz)
    {
    	for (int i = 0; i < Zahl; i++)
    	{
    		pInstanz->Memberfunktion (); // ... die dann auf die Memberfunktion zugreifen soll
    		// mit dieser Funktion greife ich aber nur auf die erste Instanz zu - wie komme ich zu Instanz 2 & 3?
    		// pInstanz[i]-> Memberfunktion (); wäre mein Vorschlag gewesen - klappt nicht
    	}
    }
    
    float CKlasse::Memberfunktion ()
    {
    	// Aktionen
    	return 0;
    }
    

    ... in meiner Funktion soll die Memberfunktion mit allen Instanzen aufgerufen werden - klappt aber nicht. Ich komme hier einfach nicht weiter.

    Ich hoffe ihr versteht was ich von euch möchte 🙂
    Danke jedenfalls,

    mlg
    toetoe



  • pInstanz[i].Memberfunktion();
    

    Außerdem: Nicht vergessen, den Speicher wieder freizugeben! Zu jedem new[] gehört ein delete[]. In der Praxis benutzt man dafür natürlich std::vector.



  • pInstanz ist nun nichtmehr nur ein Zeiger auf eine Instanz sondern ein Zeiger auf das erste Objekt in einem Array. Was du willst ist also:

    pInstanz[i].Memberfunktion();
    


  • pass auf: die hast ein array von deiner klasse, dieses möchtest du an ein funktion geben, stimmt auch so, aber da greifst du nur auf das erste element zu wie du richtig gesagt hast.

    void MeineFunktion (int Zahl, CKlasse *pInstanz)
    {
        for (int i = 0; i < Zahl; i++)
        {
            // pInstanz->Memberfunktion ();  <--- greift nur auf das erste zu
            // pInstanz[i]-> Memberfunktion (); richtig dass es nicht klappt
            // weil du hier quasi ein array von zeigern nutzt
            pInstanz[i].Memberfunktion(); // wäre richtig
        }
    }
    

    die zweite möglichkeit wäre richtig wenn der 2. parameter lauten würde: CKlasse[] *pInstanz (Array von zeigern auf deine Klasse)

    Edit: zu spät -.-



  • Vermeide new[]/delete[] zugunsten von std::vector



  • Wow, habe nicht mit so vielen schnellen Antworten gerechnet.
    Tja, wenn ihr mir fast unisono zu Vektoren ratet, werde ich das wohl in Zukunft anders machen.

    Aber so klappt es ja perfekt 🙂

    Doch noch zum Thema Vektoren. Das Problem mit einem Array oder Vektor wäre gewesen, dass ich in der Klasse unterschiedliche Membervariablen verwende (int, float & bool). Das könnte ich mit einem Array nicht lösen oder?
    Und Vektoren wären ja überhaupt nur eindimensional soweit ich weiß.

    //Edit: Höchsten, dass ich mehrere Felder erzeuge...

    Danke jedenfalls für die schnelle Hilfe 🙂

    mlg


Log in to reply