Array variabler länge von Objekten.



  • Hi,
    ich bin neu hier und auf verzweifelter Suche nach Hilfe. Ich bin Game Engineering Student im 2. Semester und versuche sei ein Paar Tagen folgendes Problem zu lösen:

    Ich versuche ein Spiel zu schreiben, in dem sich der Spieler am Anfang aussuchen kann, ob er ein Hase oder Igel sein möchte. Die Auswahl ändert im Prinzip die Regeln nach denen er sich auf dem Spielfeld bewegen darf. Das ganze funktioniert auch schon mit einem Hasen und einem Igel, jetzt soll ich das Programm so erweitern, dass sich beliebig viele Spieler aussuchen können ob sie Hase oder Igel sein möchten. Hase und Igel sind jeweils eine Klasse, die sich von der Basisklasse Spielfigur ableiten.
    Das Spiel verläuft in der Klasse Spiel (Die Klassen waren vorgegeben). Beim Start des Spiels, lese ich ein wie viele Spieler es geben soll. Mein Plan war es nun, über den Konstruktor des Spiels die Spielfiguren anzulegen. Gedacht hatte ich mir das ganze wie folgt:

    #include "Hase.h"
    #include "Igel.h"
    #include <iostream>
    using namespace std;
    
    class CSpiel
    {
    public:
    	CSpiel(int iSpieler)
            {
               CSpielfigur *pSpielfigur = new CSpielfigur[iSpieler];
               // An dieser Stelle wollte ich nun per for-Schleife einen nach dem anderen Spieler fragen, ob er Hase oder Igel sein möchte
    for (int i = 0; i < (iSpieler); i++)
    	{
    		cout << "\nSpieler " << i + 1 << ": Hase oder Igel? [h/i] ";
    		char cEingabe;
    		cin >> cEingabe;
    
    		if (cEingabe == 'h')
    		{
    			CHase Hase;
    			pSpielfigur[i] = Hase;
    		}
    		else
    		{
    			CIgel Igel;
    			pSpielfigur[i] = Igel;
    		}
    	}
            }
    	~CSpiel();
    private:
    	int m_iZiel;
    	CSpielfigur *pSpielfiguren;
    };
    

    Leider funktioniert das ganze nicht so wie ich mir das gedacht hatte 😕 Hatte es auch schon einmal mit pSpielfigur[i] = new CHase Hase; probiert allerdings stimmt da wohl der Syntax nicht. Wäre nett, wenn mir jemand sagen könnte, wie man das ganze bewerkstelligen könnte. Achtung!: Ich bin wirklich noch Anfänger ^^



  • "Funktioniert nicht" ist keine Fehlerbeschreibung.

    new []? Verwende std::vector.

    Du wirst wohl Zeiger auf die Spielfiguren verwenden müssen.

    Wer bringt die diese unsägliche ungarische Notation bei? Was ist wohl sinnvoller: iSpieler oder anzahlSpieler?




  • Zudem finde ich die polnische Datentypnotation für den Anfang doch sehr übersichtlich und verständlich.



  • So wirst Du nicht weit kommen. Du erzeugst ja jetzt schon

    CSpielfigur *pSpielfigur = new CSpielfigur[iSpieler];
    

    eine Anzahl von Variablen des Typs CSpielfigur.

    Was Du aber wahrscheinlich willst, ist eine Anzahl von Variablen, die letztendlich Igel oder Hase sein können.

    Das funktioniert nur über Zeiger (oder Referenzen):
    Du brauchst eine Anzahl von Zeigern auf den Datentyp Spielfigur, die letztendlich auf alle Typen zeigen können, die von Spielfigur abgeleitet sind, also auf Hase oder Igel.

    Etwa so (ungetestet):

    #include "Hase.h"
    #include "Igel.h"
    #include <iostream>
    #include <vector>
    using namespace std;
    
    class CSpiel
    {
    public:
        CSpiel(int iSpieler)
            {
    
               // An dieser Stelle wollte ich nun per for-Schleife einen nach dem anderen Spieler fragen, ob er Hase oder Igel sein möchte
    for (int i = 0; i < (iSpieler); i++)
        {
            cout << "\nSpieler " << i + 1 << ": Hase oder Igel? [h/i] ";
            char cEingabe;
            cin >> cEingabe;
    
            if (cEingabe == 'h')
            {
                CSpielfigur *tmp = new CHase();
                pSpielfiguren.push_back(tmp);
            }
            else
            {
                CSpielfigur *tmp = new CIgel();
                pSpielfiguren.push_back(tmp);
            }
        }
            }
        ~CSpiel()
        {
           for(int i = 0; i < pSpielfiguren.size(); ++i)
              delete pSpielfiguren[i];
        }
    private:
        int m_iZiel;
        vector<CSpielfigur *> pSpielfiguren;
    };
    

    Nun ist aber wichtig, dass die Spielfiguren im Destruktor wieder aufgeräumt werden, siehe oben - besser wäre es, Smart-Pointer zu verwenden, aber vllt. guckst Du Dir erst mal den Vektor an.

    Ansonsten:
    Wenn Deine Klassen schon CIgel und CHase statt Igel und Hase heißen, sollten auch die Headerdateien CIgel.h und CHase.h heißen ...

    Zu dem Rest des Designs sag ich mal nix.



  • Ok danke werde mal schauen was ich damit so zusammen bekomme und mich mal mit Vektor befassen. Die Header Datei benennt Visual Studio selber um (Erstelle die Klassen mit dem Assistenten).



  • Ok cool,

    CSpielfigur *tmp = new CHase();
    pSpielfiguren.push_back(*tmp);
    

    hat funktioniert. Hab mir mal ein paar Sachen zu Vektor besorgt und werde mir das ganze jetzt mal genauer anschauen. Danke nochmal! 👍



  • TheCoCe schrieb:

    Ok cool,

    CSpielfigur *tmp = new CHase();
    pSpielfiguren.push_back(*tmp);
    

    hat funktioniert. Hab mir mal ein paar Sachen zu Vektor besorgt und werde mir das ganze jetzt mal genauer anschauen. Danke nochmal! 👍

    Nein, so nicht. Der Vector muss Pointer aufnehmen!



  • Mhh.. hab es jetzt so geändert:

    CSpielfigur *pTmp = new CHase();
    pSpielfigur[i].push_back(pTmp);
    

    ok so funktioniert das ganze aber jetzt nicht mehr 😕

    error C2664: 'void std::vector<CSpielfigur,std::allocator<_Ty>>::push_back(const CSpielfigur &)' : Konvertierung von Argument 1 von 'CSpielfigur *' in 'CSpielfigur &&' nicht möglich



  • Du musst doch nur noch bei Belli richtig abschreiben.



  • Ah ok ups ^^ Hatte den Vektor falsch interpretiert (Deshalb das [i]). So ist das wenn man was benutzt, dass man noch nicht versteht



  • Und am Ende delete nicht vergessen oder gleich auf schlaue Zeiger wie unique_ptr setzen.



  • roflo schrieb:

    Und am Ende delete nicht vergessen

    Steht oben im Destruktor, oder meinst Du noch was anderes?


Log in to reply