Struktur instanzen



  • Hi,
    bin dabei mir C++ anzueignen.
    Ich habe folgendes versucht:

    struct sSpieler
    {
    char Name[30]
    };

    sSpieler Spieler1;
    sSpieler Spieler2;

    /*...usw. Diese will ich stattdessen mit einer Schleife generieren lassen. also: */

    int Anzahl=10;

    for (int i=1; i<Anzahl; i++)
    {
    sSpieler Spieler(i);
    cout<<"\nName Spieler "<<i<<" : ";
    cin.get (Spieler(i).Name, 29); //gleiche Ding wie oben
    cin.ignore (); //um den Zeiger auf Anfang zu stellen.
    }

    /* Kann ich dem Compiler irgendwie sagen er soll an der Stelle (i) eine Variable verwenden? Das gleiche soll bei der Ausgabe geschehen */

    // Bin für alle Rat- und Vorschläge offen. Danke für deiner Zeit 🙂



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • verwalte deine Spieler in einem Container, bspw. std::vector. Dann kannst du in deiner Schleife in jedem Durchlauf einen neuen Spieler erzeugen und in den vector einfügen.

    anstelle von char[30] solltest du besser std::string nehmen.



  • elapse schrieb:

    struct sSpieler
    {
         char Name[30]
    };
    
    sSpieler Spieler1;
    sSpieler Spieler2;
    
    /*...usw. Diese will ich stattdessen mit einer Schleife generieren lassen. also: */
    
    int Anzahl=10;
    
    for (int i=1; i<Anzahl; i++)
    	{
    	   sSpieler Spieler(i);   
    	   cout<<"\nName Spieler "<<i<<" : ";
    	   cin.get (Spieler(i).Name, 29); //gleiche Ding wie oben
               cin.ignore ();  //um den Zeiger auf Anfang zu stellen. 
            }
    
    )
    

    1. Willst du zur Laufzeit beliebig viele Instanzen einer Klasse wo unterbringen, musst du ein Container nehmen. Container können beliebig viele Objekte eines Typs verwalten. Der Standard-Container ist std::vector. Schnapp ihn dir.

    2. Zeichenketten sind in C++ std::string, und nicht char[].

    3. Hier hast du dich verschrieben, ein s zu viel.

    struct Spieler
    {
        // ...
    };
    

    4. Versteh ich nicht. Was meinst du?

    cin.ignore ();  //um den Zeiger auf Anfang zu stellen.
    


  • 1. Willst du zur Laufzeit beliebig viele Instanzen einer Klasse wo unterbringen, musst du ein Container nehmen. Container können beliebig viele Objekte eines Typs verwalten. Der Standard-Container ist std::vector. Schnapp ihn dir.

    Das werd ich 🙂 Danke dir out und auch daddy_felix für eure Hinweise.

    2. Zeichenketten sind in C++ std::string, und nicht char[].

    Aha, das stellt also eine andere Möglichkeit dar. Habe das bisher über arrays + cin.get gelöst. Einziger Manko ist die begrenzte Aufnahme des Textes (hier auf 29 Zeichen (+Null-Terminierung), welche aber in dem Beispiel völlig ausreichen sollte (geht ja um einen Spieler-Namen). Ich werde mir das mit den Containern mal anschaun. Die kommen in den nächsten Kapiteln im C++-Buch, welches ich verwende. Da ich jedes Beispiel weitestgehend "zerflücke" und damit rumexperimentiere bin ich auf die Frage gestoßen, welche nun beantwortet wurde. Danke!

    3. Hier hast du dich verschrieben, ein s zu viel.

    Nein, das ist so gewollt. So kann ich gleich Anhand der Deklarierung erkennen um welchen Typ es sich handelt.zB chName für char's(hab ich hier geich ma gefailt xD), bBool, fFloat und eben sSpieler für struct's usw.

    Versteh ich nicht. Was meinst du?
    C++:

    cin.ignore ();  //um den Zeiger auf Anfang zu stellen.
    

    Hab das nicht wirklich gerafft, was da passiert. Irgendwas mit Zeigerrücksetzung, laut Autor. Das wird erst im nächsten Kapitel behandelt. Ich weiß nur das man ohne diesen Befehl dem zweiten Spieler keinen Eintrag geben kann. Nach der Eingabe des ersten Spielernamen wird die Eingabe für den zweiten Spieler übersprungen und es kommt gleich zu Ausgabe. Probiers einfach mal aus, das machts einfacher. Hier der ursprüngliche Code:

    #include <iostream>
    
    using namespace std;
    
    int main ()
    {
    	struct sSpieler
    	{
    		char Name[30];
    	};
    
    	sSpieler Spieler1;
    	sSpieler Spieler2;
    
    	//Spieler 1
    	cout<<"\nName Spieler 1: ";
    	cin.get (Spieler1.Name, 29);
    
    	cin.ignore (); //Nimms mal raus und schau was passiert
    
    	//Spieler 2
    	cout<<"\nName Spieler 2: ";
    	cin.get (Spieler2.Name, 29);
    
    	cout<<endl;
    
    	//Ausgabe Spieler 1
    	cout<<"Spieler 1:\tName:\t"<<Spieler1.Name<<endl;
    	cout<<endl;
    
    	//Ausgabe Spieler 2
    	cout<<"Spieler 2:\tName:\t"<<Spieler2.Name<<endl;
    	cout<<endl;
    
    	return 0;
    }
    


  • elapse schrieb:

    Nein, das ist so gewollt. So kann ich gleich Anhand der Deklarierung erkennen um welchen Typ es sich handelt.zB chName für char's(hab ich hier geich ma gefailt xD), bBool, fFloat und eben sSpieler für struct's usw.

    Ich weiß, dass du dich nicht verschrieben hast. Das sollte ein Denkanstoß zum nachdenken werden. 😉 Es ist nämlich keine gute Idee es so zu machen. Hier mal wieder Nexus' Beitrag.



  • Wie heißt dein Lehrbuch eigentlich?



  • So eine Schlingelei 😉

    Find die ungarische Notation leicht nachvollziehbar und es ist ein Anfang um die Typen ausm Text heraus auseinander zu halten. Das ist quasi ein Platzhalter bis ich sie weiter entwickel und meinem persönlichen Stil anpasse oder gar neu definiere. Dazu muss ich erstmal in der Materie drin stecken um nen Überblick über die einzelnen Befehle, Funktionen, Datentypen usw. zu bekommen.
    Ob der Stil veraltet ist oder nicht, ich will es in erster Linie nachvollziehen können und dafür ist die u N durchaus akzeptabel, wenn auch nicht optimal, wie ich bestimmt bald feststellen werde. Ich denke da kann man sich austoben, sei es mit "_" , Klein-/Großbuchstaben-Mix, Verben oder wie auch immer. Darüber kann ich mir nen Kopp machen, wenn ich weiß was es zu unterscheiden gilt oder es nicht mehr ausreicht oder zu unübersichtlich wird oder oder. Zur Zeit sammel ich erstmal das Wissen um C++. Ob ich ne Variable nu so oder so bezeichne, wichtiger ist wohl was ich mit ihr anfange *träum*.

    Das Buch ist übrigens von Heiko "The Wanderer" Kalista und heißt <C++ für Spieleprogrammierer>. Liefert mir ein paar Grundlagen. Hab hier noch nen "Schinken" liegen...dat wirft nen Schatten da kann ich mich reinstellen und komplett verschwinden. Hab nen heiden Respekt vor dem Teil
    <3D-Spieleprogrammierung mit DX9 und C++> und bin umso motivierter eines Tages auf seinem Gipfel zu stehen und die Wahnsinns-Aussicht genießen 🙂 Informatik speziell in der Spieleentwicklung hat für mich ein gigantisches Potential. Meine Täume auch für Dich zugänglich zu machen ist eins der höchsten Ziele die ich habe und vielleicht irgendwann durch das Fenster zu schauen um mich, dich und uns zu sehen, mit fettem Grinsen im Gesicht, in Frieden zufrieden, gemeinsam geträumt, als Weltenwanderer von einem zu Hause ins nächste reisend und noch viel weiter...

    naja wie auch immer danke für den link...^^


Anmelden zum Antworten