OOP Übung Blackjack - Fehler

  • C++

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    OOP Übung Blackjack - Fehler

    Hey Leute,

    bin gerade dabei als Übung für OOP Blackjack zu Programmieren. Hoffe meine Vorstellung ist richtig vom Aufbau her. Compiler zeigt keine Fehler an, allerdings stürtzt mein Programm einfach ab.
    Finde leider keine Fehler. Bitte nicht wundern, bin noch relativ am Anfang, also erstmal nur der Aufbau etc.

    Vllt. findet jmd. den Fehler.


    Spoiler anzeigen

    main.cpp

    C-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using std::cout;
    4. using std::cin;
    5. using std::endl;
    6. #include "Deck.h"
    7. //#include "Card.h"
    8. int main()
    9. {
    10. Deck MyCardDeck;
    11. //MyCardDeck.Shuffle();
    12. //MyCardDeck.PrintAllCards();
    13. Card tmp = MyCardDeck.DealACard();
    14. cout << tmp.getName();
    15. return 0;
    16. }


    Card.h + Card.cpp

    C-Quellcode

    1. //CARD.H
    2. #include <string>
    3. #include <cstdlib>
    4. using namespace std;
    5. class Card
    6. {
    7. public:
    8. Card(int, int);
    9. string getName();
    10. string getFace();
    11. string getSuit();
    12. private:
    13. int face;
    14. int suit;
    15. string faces[13] = {"Ass", "Zwei", "Drei", "Vier", "Fünf", "Sechs",
    16. "Sieben", "Acht", "Neun", "Zehn", "Bube", "Dame", "König"};
    17. string suits[4] = {"Kreuz", "Pik", "Herz", "Karo"};
    18. };
    19. //CARD.CPP
    20. #include "Card.h"
    21. Card::Card(int s = 0, int f = 0)
    22. {
    23. suit = s;
    24. face = f;
    25. }
    26. string Card::getName()
    27. {
    28. return suits[suit] + " " + faces[face];
    29. }
    30. string Card::getFace()
    31. {
    32. return faces[face];
    33. }
    34. string Card::getSuit()
    35. {
    36. return suits[suit];
    37. }


    Deck.h + Deck.cpp

    C-Quellcode

    1. //DECK.H
    2. #include <iostream>
    3. #include <string>
    4. #include <cstdlib>
    5. #include <time.h>
    6. #include "Card.h"
    7. using std::cout;
    8. using std::cin;
    9. using std::endl;
    10. class Deck
    11. {
    12. public:
    13. Deck();
    14. Card DealACard();
    15. void Shuffle();
    16. void PrintAllCards();
    17. private:
    18. int size;
    19. int dealedCards;
    20. Card Cards[];
    21. time_t t;
    22. };
    23. //DECK.CPP
    24. #include "Deck.h"
    25. Deck::Deck()
    26. {
    27. size = 52;
    28. dealedCards = 0;
    29. time(&t);
    30. srand((unsigned int)t);
    31. //Deck füllen
    32. int k,m,n = 0;
    33. for(m = 0; m < 4; m++)
    34. {
    35. for(n = 0; n < 13; n++)
    36. {
    37. Card tmpC = Card(m,n);
    38. Cards[k] = tmpC; //Glaube hier ist der Fehler, weiß es aber nicht besser ...
    39. k++;
    40. }
    41. }
    42. }
    43. Card Deck::DealACard()
    44. {
    45. //Prüfen ob Size erreicht
    46. dealedCards++;
    47. Card tmpcard = Cards[(rand() % size + 1)];
    48. return tmpcard;
    49. }
    50. void Deck::PrintAllCards()
    51. {
    52. int i;
    53. for(i = 0; i < size; i++)
    54. {
    55. cout << Cards[i].getName() << endl;
    56. }
    57. }
    58. void Deck::Shuffle()
    59. {
    60. int x,i;
    61. for(x = 0; x < 6; x++)
    62. {
    63. for(i = 0; i < 52; i++)
    64. {
    65. int j = (rand()%52)+1;
    66. Card temp = Cards[i];
    67. Cards[i] = Cards[j];
    68. Cards[j] = temp;
    69. }
    70. }
    71. }






    Gruß

    MB
    Zunächst schau dir mal Zeile 55 und 75 an.
    Zeile 44/45 sieht zum Scheitern verurteilt aus, wenn du keinen Kopierkonstruktor hast... (Edit: Ähnliches gilt natürlich auch für Zeile 55/56 und 76-78) Ich hätte entsprechend Cards[k] = new Card(m,n); verwendet, mit delete im Destruktor etc. (Bin aber kein C++-Guru und es könnte auch vollkommen anders sein :D)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „3daycliff“ ()

    Kann man denn Objekte nicht einfach so Kopieren? Mit dem "new" funktioniert es auch nicht. Dann spuckt er nur Fehler aus.

    Gruß
    Wie gesagt, zum Kopieren eines Objektes brauchst Du einen entsprechenden Kopierkonstruktor. ((const class&) als Parameter)
    Das & ist eine Referenz. Das normale Instanziieren, wie Du es versucht hast, gibt Dir nur über den Standardkonstruktor eine neue Instanz auf dem Stack.
    Zwar kopiert die Zuweisung auch, aber gleich alles aus dem Stack im Speicher. Von daher würde ich es so machen.

    Edit: Ich würde die Parameter auch als konstante Referenz (in C als Zeiger) übergeben, denn das reduziert den Speicherverbrauch (Wird nicht aus dem Speicher kopiert) und ist auch schneller.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Trade“ ()

    Okay. Hast du dafür mal ein kleines Beispiel? (Also für den Kopierkonstruktor). Zeiger kenne ich bisher nur in C mit * und &.

    Gruß
    Bevor ich lange schreibe, da steht es: cplusplus.com/articles/y8hv0pDG/ :P

    Wie gesagt, die Signatur habe ich Dir ja erklärt/gezeigt. Dort stehen btw auch gleich Sachen zu entsprechenden Assignment Operators.

    Ich habe mir nicht den ganzen Thread komplett durchgelesen, aber eingehend auf Deine Frage mit dem Kopieren von Instanzen.

    In dem Fall geht das btw über die Referenz. Zeiger brauchst Du mehr in C und in C++ eig nur bei Iteratoren und Polymorphiesachen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    nafets schrieb:

    Müsstest du denn nicht erst das Deck initialisieren? :D


    Inwiefern? Habe doch einen Konstruktor dafür? Oder was meinst du?
    Also irgendwie bin ich da noch nicht ganz durchgestiegen. Meine Idee war eine Klasse Card, welche eine Karte mit Wert repräsentiert. Weiterhin die Klasse Deck, welche dann 52 Objekte von Karte enthält. Der Zufriff etc ist mir noch nicht ganz klar. Kann ja theoretisch auch für die Kartenklasse ein enum machen und dann ganz normal auf ein Array ausweichen. Nur irgendwie klappt das ja nicht so mit diesen Objekten...

    Vielleicht hat da jmd nochmal ein paar Tipps / Beispiele. Wo würden sich Pointer anbieten? Bin immer unsicher wann ich diese wirklich verwenden soll...
    @MB-Tech Mach das ganze mal in C#, und wenn das läuft, übersetze es nach C++.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    C# kann ich nicht, nur normales C. Problem ist ja, das ich das mit der OOP Sache lernen will. In C ist das alles so umständlich...

    MB-Tech schrieb:

    OOP Sache lernen
    bist Du schneller mit C# weil logistisch einfacher.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja, brauch ich aber aktuell fürs Studium, daher will ich nicht noch C# machen...

    MB-Tech schrieb:

    aktuell fürs Studium
    Üblicherweise geht man davon aus, dass es 1 Jahr dauert, bis man mit C++ die ganzen Erbschaften, Morphologen und solch durchstiegen hat.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!