Friend vs getter/setter

0

Opis
Gra Makao.
Klasa GameMaster zajmuje się rozdawaniem. Ale aby móc rozdać graczom karty, musi mieć dostęp do ich prywatnych zmiennych cards.

Rozwiazania:

  1. użyć setterów w klasie Player dla cards. Ale wtedy zewsząd będzie można zmienić taką kartę, cierpi na tym hermetyczność.
  2. przyjaźń Klasy Player z Klasa GameMaster. Pod względem enkapsulacji wygląda to lepiej, ale teraz mam problem ponieważ, nawet jak dam wstępną deklarację klasy Player w Klasie GameMaster to i tak nie wystarczy aby dostać się do składników.
    include\GameMaster.h|33|error: invalid use of incomplete type 'class Player'|
    Co w takim przypadku zrobić? Czytałem aby wrzucić wszystko do jednego pliku.
    Jak mądrze radzicie sobie w takich sytuacjach?
 
#include <Card.h>
#include <Player.h>
#include <stdlib.h>

class Player; // wczesniej musimy dac znac o takiej klasie
using namespace std;
class GameMaster
{
    static const int amount = 52; // ilosc kart
    Card *deck; // talia
public:
    GameMaster(): deck (Card::deck()) {};
    
    void DealsTheCards(Player *p1, Player *p2, int poIle) // rozdaj karty
    {
        for(int i=0; i<poIle*2; i++)
        {
            p1->cards[i++]= deck[i];
            p2->cards[i]= deck[i];
        }
    }
};
#include "Card.h"
#include "GameMaster.h"
class Player
{
    Card *cards; // karty
    string imie;
    int amount; // ilosc kart
public:
    Player(){};
    friend class GameMaster;
}; 

PS: założenie, nie mogę używać tutaj C++11

3

napisze co mi sie nie podoba oraz takze w tym jest rozwiazanie Twojego problemu

  1. wskaznik na cards. To powinien byc vector<Cards>() w obu przypadkach
  2. W gamemaster jak tworzysz ta talie kart? bo dlaczego JEDNA karta (Card) posiada talie? mowie tu o
Card::deck()

To cale to jest bardzo dziwne
3) DealsTheCards jest zle napisana (ten for).
4) Player powinien miec funkcje AddCard()
5) friend jest zle jezeli uzywa sie go wlasnie tak jak Ty to robisz
6) Amount nie powinno byc static const. Mozesz miec dwa pole MaxCards i CurrentAmount.
7) albo po angielsku albo po polsku
8) magic number (czemu razy dwa w tym forze?)

0

Dziękuję Ci bardzo za odpowiedz!

  1. Prawda!? Też mi się tak wydaje byłoby o wiele prościej, wymysł prowadzącego, na podstawie jego poniższej Klasy Card trzeba zrobić resztę.
  2. Jak wyżej.
class Card
{
    static int counter;
    static int *colors;
    static char *figures;
    int value;

public:
    Card();
    char figure();
    char color();
    static Card*  deck();
};
 #include "Card.h"
//**********************************************************************************************************************
Card::Card()
{
    static int counter = 0;
    value = counter++;
    counter %= 52;
}
//**********************************************************************************************************************
char Card::figure()
{
    static char figures[] = "234567890JQKA";
    return figures[value % 13];
}
//**********************************************************************************************************************
char Card::color()
{
    static int colors[] = {3,4,5,6}; //  aby nie wyswietlalo  pierwszych liter nazw tylko symbole
    return colors[value / 13];
}

//**********************************************************************************************************************
Card* Card::deck() // zwraca talie kart
{
    return new Card[52];
}
  1. Możliwe, nie zdążyłem jej przetestować bo zamyśliłem się nad dostępem do kart Graczy.
  2. jako publiczna czy prywatna ?
  3. Zgadza się, ale nadal nie wiem jak to spójnie zrobić. Wydaje mi się że rozsądnie byłoby gdyby tylko Klasa GameMaster miała dostęp do kart graczy. Jak Twoim zdaniem powinna zostać zrealizowana prawidłowo?
  4. Wtedy MaxCards byłoby const, inicjalizowane przez konstruktor z listy ? I czemu const static to głupi pomysł?
0
  1. Ale przeciez nie zabronil Ci uzywac vectora tak? Mozesz napisac prosty wrapper na klase ktora opakowywuje to ladnie w vector
  2. No to na to nic nie poradze. Podam analogiczny przyklad dlaczego Card nie powinien zwracac Deck
    Masz klase Human, masz w nim pole SKIN. ustawiasz w tablicy ze moga byc trzy wartosci, czarna, biala, zolta. Po czym w tej samej klasie masz funkcje "Population" ktora zwraca Ci np 100 ludzi... ma to sens? Bo jak dla mnie nie ma. Powinien byc HumanGenerator czy cokolwiek innego co tworzy tych ludzi.
    Zreszta zwracanie
  3. A na co Ci prywatna? Poczytaj komentarze pod moim postem, moze bardziej Ci to zobrazuje co powinienes zrobic
  4. Czyli jak idziesz do kasyna to rozdajacy MA DOSTEP do twoich kart? No tak srednio... Takze Twoja klasa nie powinna miec dostepu do tych kart. Powinna byc zrealizowana tak jak napisalem w punkcie 4 (a raczej dalem podpowiedz)
  5. Bo jezeli rozdasz karte to przeciez juz nie masz 52 tylko 51. Dlatego nie moze byc static const. Dlatego potrzebujesz dwa pola. Jedno do przechowywania ile jest maksymalnie kart do rozdania a drugie pole ile obecnie masz do rozdania (to pierwsze nie jest potrzebne tak na prawde)

1 użytkowników online, w tym zalogowanych: 0, gości: 1