Problem ze zrozumieniem klas

0

No więc.. Uczę się już troszke C++ ( nie mogę pojąć co to są te "klasy") i moja prośba jest następująca:

Czy ktoś mógłby mi objaśnić co to te KLASY?!

Pytanie może wydawać się głupie, ale no cóż..

Z góry dziękuje

Pozdrawiam, Miłosz

1

Krótka odpowiedź jest taka: żeby dzielić problem na pewne "niezależne kawałki" i tym samym dzielic problem na klasy abstrakcji. Co to znaczy? Wyobraźmy sobie grę w karty. Możemy ją zaprogramować na wiele sposobów. Możemy na przykład wepchnąć cały kod w jedną wielką funkcję. Ale wtedy jak coś nie będzie działać to w życiu nie znajdziemy miejsca gdzie jest błąd. A gdyby dalo się tą gre napisać tak jak przebiega ona w prawdziwym życiu?

int main()
{
    int numberOfPlayers = 0;
    cout<<"Ilu ma byc graczy?"<<endl;
    numberOfPlayers = inputInteger();
    Deck* players = new Deck[numberOfPlayers];
    Deck Deck;
    Deck.createFull(); //generujemy cala talie
	/*
	wybranie karty z talii i danie jej do ręki i-temu graczowi to:
	players[i].add(Deck.popCard())
	policzenie ile ktoś ma w ręce to players[i].getValue()
	*/
    return 0;
}

Jaki jest plus takiego zapisu? Otóż możemy się tutaj skupić już tylko na samej logice gry (to kto komu i kiedy daje karty, kiedy ktoś wygrywa itd) a nie na mechanice gry (jak reprezentowane są karty? jak to się dzieje że karty komuś przekazujemy itd). No tak, ale żeby móc stosować taki zapis to musimy jednak tą mechanikę napisać. Klasy pozwalają nam zamykać implementacje w odseparowanych fragmentach.

#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm>
using namespace std;

class Card
{
private:
    int value;
    string name;
    string color;
public:
    Card(int v, string n, string c):value(v),name(n),color(c) {}
    int getValue()
    {
        return value;
    }
    string getName()
    {
        return name;
    }
    string getColor()
    {
        return color;
    }
    friend ostream& operator<<(ostream& strumien, Card c)
    {
        strumien<<c.getName()<<" "<<c.getColor();
        return strumien;
    }
};

class Deck
{
private:
    vector<Card> Deck;
public:
    void add(Card c)
    {
        Deck.push_back(c);
    }
    Card popCard()
    {
        int index = rand()%Deck.size();
        Card tmp = Deck[index];
        Deck[index] = Deck.back();
        Deck.pop_back();
        return tmp;
    }
    void createFull()
    {
        string kolory[4]= {"kier","karo","pik","trefl"};
        string figury[13]= {"2","3","4","5","6","7","8","9","10","Walet","Dama","Krol","As"}; //można by tu dla 2-10 użyć sstream, ale nie chce mieszać
        for (int i=0; i<4; i++)
        {
            for (int j=0; j<9; j++) //karty 2-10
            {
                Card tmp(j+2,figury[j],kolory[i]);
                Deck.push_back(tmp);
            }
            for (int j=9; j<12; j++) //walet, dama, krol
            {
                Card tmp(j-7,figury[j],kolory[i]); //generujemy karte, tutaj ustalana jest jej "wartosc"
                Deck.push_back(tmp);
            }
            Card tmp(11,figury[12],kolory[i]); //as
            Deck.push_back(tmp);
        }
    }
    int getValue() //funkcja zwraca wartosc wszystkich kart w talii
    {
        int sum = 0;
        for (unsigned int i =0; i<Deck.size(); i++)
            sum+=Deck[i].getValue();
        return sum;
    }
    bool empty() const
    {
        return Deck.empty();
    }
};

int inputInteger()
{
    int returnValue;
    while (!(cin >> returnValue))
    {
        cin.clear();
        cin.ignore();
        cout << "Nalezy podac liczbe calkowita!\n";
    }
    return returnValue;
}

int main()
{
    srand(time(0));
    int numerOfPlayers = 0;
    cout<<"Ilu ma byc graczy?"<<endl;
    numerOfPlayers = inputInteger();
    Deck* players = new Deck[numerOfPlayers]; //bo każdy trzyma w ręcę swoją mini talię
    Deck Deck;
    Deck.createFull(); //generujemy cala talie
	/*
	wybranie karty z talii i danie jej do ręki i-temu graczowi to:
	players[i].add(Deck.popCard())
	policzenie ile ktoś ma w ręce to players[i].getValue()
	*/
    return 0;
}
0

Co poniektórzy nie zrozumieli pytania. Kolega pewnie rozumie klasy, tylko nie widzi sensu żeby tego używać i zastanawia się po co to w ogóle jest.
Mam takie same rozterki z wzorcami projektowymi - niby czytam, wiem o co chodzi, rozumiem, mogę coś sam zrobić, ale po jakiego grzyba takie cuda wianki, to nie mam zielonego pojęcia. :P Nawet mam wrażenie, że to utrudnia sprawę i łudzę się, że w pracy zawodowej zmienię zdanie. :P

0

@Kaaaaaaamil bo wzorce często wcale nie są żadnym panaceum. Idea wzorców jest trochę inna - chodzi często o to żeby struktura działania czegoś była "przewidywalna". Jak masz aplikację napisaną zgodnie z MVC to każdy programista będzie wiedział gdzie czegoś szukać. Będzie wiedział ze jeśli jest jakiś problem z czymśtam to znaczy że błąd jest na przykład w kontrolerze. Gdyby aplikacja miała jakiś zupełnie autorski sposób przepływu sterowania i autorską strukturę (może nawet znacznie lepszą z punktu widzenia konkretnej aplikacji!) to programiści (którzy tego nie projektowali) mieliby ciągłe problemy z ogarnięciem tego. W przypadku stosowania wzorców koszt wdrożenia nowego programisty jest znacznie niższy.
Zresztą idea OOP i stosowania klas jest też poniekąd podobna. Zamykamy implementacje w pewnych izolowanych (w miarę możliwości :P) kawałkach i nowy programista wcale nie musi na raz ogarnąć wszystkiego, bo może zajmować się tylko pewnym fragmentem (nie wchodząc w ogóle w szczegóły implementacyjne konkretnych klas, tylko używając ich na zasadzie "czarnych skrzynek")

0

Kiedy juz zaczniesz uzywac wzorcow, stwierdzisz inaczej. Przy pracy nad wiekszymi projektami, sa one normalnie uzywane, bo ulatwiaja prace. Jakies fabryki abstrakcyjne, fasady, dekoratory wystepuja najczesciej. Kiedy juz raz sie napisze cos takiego i zobaczy, ze to rzeczywiscie dziala i zostalo po cos stworzone, wtedy zaczniesz nieswiadomie przy pisaniu uzywac pewnych wzorcow.

0

Oj wielkie podziękowania dla użytkownika Shalom, powoli rozumiem po co są i co to tak właściwie jest ;). Poczytam jeszcze dużooo, a na razie proszę o zamknięcie tematu. ;)

aaa i proszę jeszcze o zaproponowanie jakiejś ciekawej lektury :), nawet jeżeli ma 100 stron o samych klasach :>

0

Tylko 100 stron? Ja ucząc się c++ przerobiłem książkę Szkoła Programowania Język c++ w której o ile dobrze pamiętam teraz było ok 600-700stron o samych klasach, czyli jakieś 60% całej książki to nauka klas ;) Więc jakby co polecam tę wyżej wymienioną książkę. Wszystko wyjaśnione tak prosto, że po poznaniu czym w ogóle jest klasa i pierwszych przykładach od razu siadłem do przerabiania programów napisanych wcześniej proceduralnie.

0

Do C++ sa tylko 3 ksiazki: Grebosz, Eckel, Prata.

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