Instanz von einer Klasse erstellen



  • Hallo,

    ich möchte eine zweite Instanz von einer Klasse erstellen...

    Also Instanz erstellt man ja so: Klassenname namederinstanz;

    Mit einer Instanz funktioniert es einwandfrei.
    Wenn ich eine zweite erstelle bzw. benutze wird zwar alles ausgeführt jedoch bekomme nach ende des Programms ne Fehlermeldung:

    Unbehandelte Ausnahme bei 0x5dc7ad4a (msvcp100d.dll) in Poker_Texas_Holdem.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000e.

    Der Fehler kommt auch wenn ich nur eine neue instanz erstelle,ohne das ich sie benutze...

    Wo kann da der Fehler liegen?


  • Mod

    XY213 schrieb:

    Wo kann da der Fehler liegen?

    Ganz sicher in deinem Code. Aber den hast nur du.



  • XY213 schrieb:

    Wo kann da der Fehler liegen?

    Nicht an den zwei Instanzen. Lies dirmal bitte den Link in meiner Signatur durch, und dann stell die Frage nochmal so, dass wir auch eine Chance haben, sie zu beantworten 😉



  • Das hier ist die Klasse, ist alles noch in Arbeit und nicht alle Funktionen,Variablen wurden schon verwendet bzw. da ändert sich noch einiges...

    #include "STDAfx.h"
    
    class Spieler
    {
    private:
    //Spieler
    	int iEinsatzS;
    	int iGeldS;
    	int iKarte1S;
    	int iKarte2S;
    
    	bool bKarte1S;
    	bool bKarte2S;
    	bool bsmallblindS;
    	bool bbigblindS;
    
    	std::string sKarte1S;
    	std::string sKarte2S;
    //----------------------------------
    // NPC 1
    	int iEinsatzN;
    	int iGeldN;
    	int iKarte1N;
    	int iKarte2N;
    
    	bool bKarte1N;
    	bool bKarte2N;
    	bool bsmallblindN;
    	bool bbigblindN;
    
    	std::string sKarte1N;
    	std::string sKarte2N;
    //---------------------------------
    // NPC 2
    	int iEinsatzN2;
    	int iGeldN2;
    	int iKarte1N2;
    	int iKarte2N2;
    
    	bool bKarte1N2;
    	bool bKarte2N2;
    	bool bsmallblindN2;
    	bool bbigblindN2;
    
    	std::string sKarte1N2;
    	std::string sKarte2N2;
    public:
        int x;int y;
    	void Start_Game();
        void Kartenmischenos();
    	void Kartenausteilen1();
    	void Kartenausteilen2();
    	void zeigekarte();
    	void abfrage1();
    
    	void ausgabe1();
    	void Karte2geben(bool bKarte2S,bool bKarte2N,bool bKarte2N2);
    	void call();
    	void rais();
    	void check();
    
    	void dealerbutton();
    	void set_bigblind();
    	void set_smallblind();
    
    	void zählschleife();
    
    	 int AlleKarten[52];
    	 std::string SAlleKarten[52];
    	 int AlleKartendummy[2];
    	 std::string SAlleKartendummy[2];
    
    	Spieler() : AlleKarten(), SAlleKarten(), SAlleKartendummy(),AlleKartendummy()
    	{   for(int i = 0;i < 4;i++)
    	  {static int h = 0;
    		AlleKarten[h] = 2;h++; //0
    		AlleKarten[h] = 3;h++; //1
    		AlleKarten[h] = 4;h++; //2
    		AlleKarten[h] = 5;h++; //3
    		AlleKarten[h] = 6;h++; //4
    		AlleKarten[h] = 7;h++; //5
    		AlleKarten[h] = 8;h++; //6
    		AlleKarten[h] = 9;h++; //7
    		AlleKarten[h] = 10;h++;//8 //zehn
    		AlleKarten[h] = 10;h++; //9 //bube
    		AlleKarten[h] = 10;h++; //10 //dame
    		AlleKarten[h] = 10;h++; //11 //koenig
    		AlleKarten[h] = 11;h++;     //12
    	  }
    
    	 SAlleKarten[0]	= "Herzzwei";
    	 SAlleKarten[1]	= "Herzdrei"; 
    	 SAlleKarten[2]	= "Herzvier";
    	 SAlleKarten[3]	= "Herzfuenf";
    	 SAlleKarten[4]	= "Herzsechs"; 
    	 SAlleKarten[5]	= "Herzsieben";
    	 SAlleKarten[6]	= "Herzacht";
    	 SAlleKarten[7]	= "Herzneun"; 
    	 SAlleKarten[8]	= "Herzzehn";
    	 SAlleKarten[9]	= "Herzbube";
    	 SAlleKarten[10]	= "Herzdame"; 
    	 SAlleKarten[11]	= "Herzkoenig";
    	 SAlleKarten[12]	= "Herzass";
    
    	 SAlleKarten[13]	= "Kreuzzwei"; 
    	 SAlleKarten[14]	= "Kreuzdrei";
    	 SAlleKarten[15]	= "Kreuzvier";
    	 SAlleKarten[16]	= "Kreuzfuenf";
    	 SAlleKarten[17]	= "Kreuzsechs";
    	 SAlleKarten[18]	= "Kreuzsieben";
    	 SAlleKarten[19]	= "Kreuzacht";
    	 SAlleKarten[20]	= "Kreuzneun";
    	 SAlleKarten[21]	= "Kreuzzehn";
    	 SAlleKarten[22]	= "Kreuzbube";
    	 SAlleKarten[23]	= "Kreuzdame";
    	 SAlleKarten[24]	= "Kreuzkoenig";
    	 SAlleKarten[25]	= "Kreuzass";
    
    	 SAlleKarten[26]	= "Pikzwei"; 
    	 SAlleKarten[27]	= "Pikdrei";
    	 SAlleKarten[28]	= "Pikvier";
    	 SAlleKarten[29]	= "Pikfuenf";
    	 SAlleKarten[30]	= "Piksechs";
    	 SAlleKarten[31]	= "Piksieben";
    	 SAlleKarten[32]	= "Pikacht";
    	 SAlleKarten[33]	= "Pikneun";
    	 SAlleKarten[34]	= "Pikzehn";
    	 SAlleKarten[35]	= "Pikbube";
    	 SAlleKarten[36]	= "Pikdame";
    	 SAlleKarten[37]	= "Pikkoenig";
    	 SAlleKarten[38]	= "Pikass";
    
    	 SAlleKarten[39]	= "Karozwei"; 
    	 SAlleKarten[40]	= "Karodrei";
    	 SAlleKarten[41]	= "Karovier";
    	 SAlleKarten[42]	= "Karofuenf";
    	 SAlleKarten[43]	= "Karosechs";
    	 SAlleKarten[44]	= "Karosieben";
    	 SAlleKarten[45]	= "Karoacht";
    	 SAlleKarten[46]	= "Karoneun";
    	 SAlleKarten[47]	= "Karozehn";
    	 SAlleKarten[48]	= "Karobube";
    	 SAlleKarten[49]	= "Karodame";
    	 SAlleKarten[50]	= "Karokoenig";
    	 SAlleKarten[51]	= "Karoass";
    
    	}
    
    	~Spieler(){std::cout << "Destruct";}
    
    };
    

    Sorry, wenn es ein wenig unübersichtlich ist... wie gesagt noch in Arbeit



  • XY213 schrieb:

    Das hier ist die Klasse,

    Ganz ehrlich? Das ist keine Klasse, das ist ein Moloch. Und ein ziemlich hässlicher dazu. (Und das "in Arbeit" ist keine Ausrede für derart unüberschaubares und fehleranfälliges Design).

    Von dem was du gezeigt hast siehst aber nicht so aus, als ob da so ein Absturz bei rumkommen könnte, das wird daher an dem anderen Code liegen (an dem, den du uns nicht gezeigt hast).

    nochmal: Lies dir bitte den Link in meiner Signatur durch. Vor allem den Teil zum Thema Code posten. Liefere uns bitte Code, der

    - keinen unnötigen Ballast enthält, der nichts zum Fehler beiträgt (~ 100 Zeilen maximal)
    - genauso gut oder schlecht compiliert wie dein jetztiger Code
    - genau den selben Fehler bringt wie dein jetztiger Code.



  • Für die erste Instanz geht das

    {   for(int i = 0;i < 4;i++)
          {static int h = 0;
            AlleKarten[h] = 2;h++; //0
            AlleKarten[h] = 3;h++; //1
            AlleKarten[h] = 4;h++; //2
            AlleKarten[h] = 5;h++; //3
            AlleKarten[h] = 6;h++; //4
            AlleKarten[h] = 7;h++; //5
            AlleKarten[h] = 8;h++; //6
            AlleKarten[h] = 9;h++; //7
            AlleKarten[h] = 10;h++;//8 //zehn
            AlleKarten[h] = 10;h++; //9 //bube
            AlleKarten[h] = 10;h++; //10 //dame
            AlleKarten[h] = 10;h++; //11 //koenig
            AlleKarten[h] = 11;h++;     //12
          }
    

    noch gut (wenn ich richtig gerechnet habe), alle weiteren schreiben über die Arraygrenze.


  • Mod

    Wieso wusste ich schon im Voraus, dass dein Code so aussehen wurde?

    static int h = 0;
    

    Und welchen Wert hat h beim zweiten Konstruktoraufruf? Lass mich raten: Du wolltest du Erstellung einer lokalen Variablen wegoptimieren und hast sie daher static gemacht?



  • Das

    static int h = 0;
    

    ist schuld, statische Variablen werden in Funktionen nur einmal initialisiert, d.h. nach dem ersten Konstruktoraufruf ist h = irgendEinWert, und beim zweiten wird dann mit irgendEinWert weitergearbeitet, und dann kriegste halt ne Indexüberschreitung.
    Außerdem solltest du mal diese hässliche Initialisierung von SAlleKarten in eine Funktion auslagern, ist ja grottenhässlich so..
    Und um dein Design solltest du dir auch mal Gedanken machen. Wichtigste Frage hierbei: Was soll deine Klasse "Spieler" eigentlich machen? Was hat sie mit den ganzen Kartennamen zu schaffen? Richtig: Wenig. Überleg dir also erstmal kurz und bündig, was du überhaupt willst, bevor du anfängst derart loszucoden. Man sieht ja, was bei rumkommt.
    Und so weiter..



  • ja, das war der fehler jetzt klappt es...

    zum code ja... flamet mich ruhig das gut so

    die Grund Idee ist es mit dem arrays , das problem mit der wahrscheinlichkeit aus dem weg zugehen...

    das array wird durch "gemischt" und dann wird [0] als erstes gezogen dann [1]...

    ja, ich muss da nochma aufräumen, was noch von alten ideen stammt...

    Und sich über anderer Leute code so der maßen aufzuregen, ist nicht gut für das Herz;)(zu dem Sinnfrei)
    Was ich zu geben muss, das euch ins Gesicht zu klatschen war nicht in Ordnung...

    Niemand ist gezwungen zu Anworten



  • Trotzdem Danke nochma, für die schnelle Hilfe


  • Mod

    Du solltest dir aber mal ernsthaft Gedanken darüber machen, ob da nicht vielleicht ein Zusammenhang bestehen könnte, zwischen unübersichtlichem, überladenem Code und dummen Fehlern.

    Die beste Möglichkeit, solch einen Monstercode zu entwirren ist, die Kompetenzen der Klassen sauber aufzuteilen. Um mal anzufangen: Ein Spieler mag vielleicht Karten haben, dazu braucht er aber nicht alles über ein Kartenspiel zu wissen. Er hat dann eben ein paar Instanzen einer Kartenklasse.


Anmelden zum Antworten