return instanz



  • hallo liebe mitcoder

    ich habe folgendes problem. ich möchte eine instanz per return zurükgeben was soweit auch funktioniert, jedoch sind es mehrere instanzen und so wie ich das gemacht hab kann ich dann nur auf die erste instaz zugreifen

    hier mal der code:
    CSpieler SpielerNamenAbfrage(int AnzahlSpieler)
    {
    //void SpielerAbfragen();
    CSpieler *pSpielerListe = NULL;
    //instanzen erzeugen
    pSpielerListe = new CSpieler[AnzahlSpieler];
    //namen der spieler abfragen
    for (int i=0; i<AnzahlSpieler; i++)
    {
    cout << "Spieler " << i+1 << ": ";
    pSpielerListe[i].EingabeDerSpielerNamen ();
    cout << endl;
    }
    return *pSpielerListe;
    }

    danke schon mal im voraus für die komments 👍



  • Du gibst ja auch nur das erste Element zurück, es wird übrigens für die Rückgabe kopiert; ich hoffe, das macht nichts.

    Mehrere Elemente kannst Du zurückgeben, indem du ein Spieler* als Rückgabetyp nimmst. Noch besser wäre ein std::vector, der ist dynamisch erweiterbar, einfach zu bedienen, genau so schnell (so gut wie), typsicher und unterstützt move-Semantik. Das muss Dich doch begeistern!



  • Ich denke das was du erreichen möchtest, ist es einen Pointer auf die Spielerliste zurückzugeben. Momentan gibst du nur den ersten Spieler zurück. Dazu musst du den Rückgabewert der Funktion in CSpieler* ändern und die Dereferenzierung vorm Return entfernen.

    PS:
    1. Wir haben hier CPP Tags!
    2. Auf manuelle Speicherverwaltung sollte man verzichten, wo es geht. Ein std::vector<CSpieler> würde sich hier z.B. aufdrängen.



  • wenn ich den rückgabewert auf CSpieler ändere will er es nicht starten und spuckt fehlermeldung aus



  • Poste mal deinen Code. (Mit [cpp]-Tags!)



  • #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <string>
    
    using namespace std;
    
    class CSpieler
    {
        private:
        char NameDesSpielers[30];
        string sKartenDesSpielers;
    
        public:
        void AusgabeDerSpielerNamen();
        void EingabeDerSpielerNamen();
        void KartenDemSpielerGeben();
    };
    void CSpieler::AusgabeDerSpielerNamen()
    {
        cout << "Es gibt" << 4 <<" Spieler" << endl;
        for(int i=0; i<4; i++)
        {
            cout << "Spieler" << 4 << ": " << NameDesSpielers << endl;
        }
    }
    void CSpieler::EingabeDerSpielerNamen()
    {
            cin.ignore();
            cin.get(NameDesSpielers, 29);
    }
    
    void CSpieler::KartenDemSpielerGeben()
    {
        cout << "Hallo" << endl;
    }
    
    bool DauerSchleife();
    void Spielen(int SpielerAnzahl, int KartenStand, CSpieler a);
    CSpieler SpielerNamenAbfrage(int AnzahlSpieler);
    int SpielerAnzahlAbfrage();
    int Karten();
    
    int main ()
    {
        int KartenStand = 0;
        int SpielerAnzahl = SpielerAnzahlAbfrage();
        CSpieler a = SpielerNamenAbfrage(SpielerAnzahl);
        while (true)
        {
            Spielen(SpielerAnzahl, KartenStand, a);
            KartenStand++;
            if(KartenStand >= 10) exit(1);
        }
    }
    
    bool DauerSchleife()
    {
        cout << "Weiter spielen? (j)a (n)ein?: ";
        char Auswahl;
        cin >> Auswahl;
        switch(Auswahl)
        {
            case('j'):
            case('J'):
            {
                cout << "Weiter Spielen" << endl << endl << endl;
                return true;
            }break;
            case('n'):
            case('N'):
            {
                cout << "Programm Beenden" << endl;
                exit(1);
                return false;
            }break;
            default:
            {
                cout << "Falsche Eingabe!" << endl;
                DauerSchleife();
            }
        }
    }
    
    void Spielen(int SpielerAnzahl, int KartenStand, CSpieler a)
    {
        cout << "Spieler: " << KartenStand%SpielerAnzahl+1 << endl;
        Karten();
        a.KartenDemSpielerGeben();
    }
    
    CSpieler SpielerNamenAbfrage(int AnzahlSpieler)
    {
        //void SpielerAbfragen();
        CSpieler *pSpielerListe = NULL;
        //instanzen erzeugen
        pSpielerListe = new CSpieler[AnzahlSpieler];
        //namen der spieler abfragen
        for (int i=0; i<AnzahlSpieler; i++)
        {
            cout << "Spieler " << i+1 << ": ";
            pSpielerListe[i].EingabeDerSpielerNamen ();
            cout << endl;
        }
        return CSpieler;
    }
    
    int Karten()
    {
        //1 aus 8 karten auswählen
        //und aufdecken
        char Karte = (rand()%7);
        switch (Karte)
        {
            case(1):
            {
                cout << "7: Du darfst zwei trinken" << endl;
            }break;
            case(2):
            {
                cout << "8: Pisskarte" << endl;
            }break;
            case(3):
            {
                cout << "9: Zwei Spieler deiner Wahl duerfen trinken" << endl;
            }break;
            case(4):
            {
                cout << "10: Fange mit einer Kategorie an" << endl;
            }break;
            case(5):
            {
                cout << "Bube: Stell eine Regel auf" << endl;
            }break;
            case(6):
            {
                cout << "Dame: Alle Maedchen duerfen trinken" << endl;
            }break;
            case(7):
            {
                cout << "Koenig: Alle Jungs duerfen trinken" << endl;
            }break;
            case(0):
            {
                cout << "Ass: Fange einen Reim an" << endl;
            }break;
            default:
            {
                cout << "Ein Fehler ist aufgetreten!" << endl;
            }
        }
        return Karte;
    }
    
    int SpielerAnzahlAbfrage()
    {
        int AnzahlSpieler = 0;
        //anzahl der spieler abfragen
        cout << "Wie viele Spieler?: ";
        cin >> AnzahlSpieler;
        if(!cin)
        {
            cout << "Falsche Eingabe!" << endl;
            cin.clear();
            cin.ignore();
            DauerSchleife();
            SpielerAnzahlAbfrage();
        }
        else if(AnzahlSpieler == 0)
        {
            cout << "Keine Spieler?" << endl;
            cin.clear();
            cin.ignore();
            DauerSchleife();
            SpielerAnzahlAbfrage();
        }
        return AnzahlSpieler;
    }
    


  • Bitte lies meinen ganzen Beitrag, da steht auch, dass du den Rückgabewert der Funktion ändern musst.
    Zu dem Rest des Codes sag ich erst mal nichts.



  • ok danke habs hinbekommen jetzt läufts einwandfrei


Log in to reply