Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

problem z odwołaniem się do klasy!

Ostatnio zmodyfikowano 2009-06-22 20:37
Autor Wiadomość
eBbi
Temat założony przez niniejszego użytkownika
problem z odwołaniem się do klasy!
» 2009-06-22 19:44:50
Witam. Jestem nowy na tym portalu. Większości z c++ umiem oprócz głupich klas których nienawidzę!!!. Piszę sobie ostatnią grę konsolową dla powtórzenia bo następne będą już w allegro. No i oczywiście musiały wystąpić jakieś problemy..
a mianowicie z odwołaniem się do strefy prywatnej w pewnej klasie. Prosił bym o wytłumaczenie mi tylko co powinienem zrobić w tej sytuacji. Patrzyłem na internecie próbowałem się bawić z dziedziczeniem klas ale to na nic. Już na przymus próbuje się uczyć tych klas bo widzę że co program/gra jest zbudowana z 90% klas. Próbuje się domyśleć dlaczego właśnie taka konstrukcja anie inna np z użyciem struktur które wole o wiele bardziej. 

C/C++
#include <cstdlib>
#include <iostream>
#include <string>
#include <ctime>

using namespace std;


enum oznaczenie { krzyzyk, kolko };
enum ruch { ruszaj, czekaj };

class gracz
{
private:
    oznaczenie znak;
    ruch akcja;
public:
    string imie;
   
   
};

gracz player1;
gracz player2;

class gra
{
public:
    void read();
private:
    void losowanie();
};



void read()
{
    cout << "Podaj imie Pierwszego gracza: ";
    getline( cin, player1.imie, '\n' );
   
   
    cout << "\nPodaj imie Drugiego gracza: ";
    getline( cin, player2.imie, '\n' );;
   
}
void losowanie()
{
    srand(( int ) time( NULL ) );
    player1.akcja = static_cast < ruch >( rand() % 2 );
   
   
}

moje środowisko to dec-c++. a błąd jaki wyskakuje to:
function `void losowanie() `ruch gracz::akcja' is private within this context
 
EDIT: no a inaczej się nie da?
P-7909
pekfos
» 2009-06-22 19:47:31
dane prywatne mogą być używane tylko w obrębie klasy
przerób te funkcje na klasowe publiczne i nie będzie problemu
P-7910
WunM
» 2009-06-22 20:02:14
W klasach są rózne pola dostępu:

* publiczne (public)
* prywatne (private)
* chronione (protected)

Funkcja w klasie może dowolnie dostać się do metod, zmiennych itd. niezależnie od tego gdzie się znajdują.

C/C++
class Klasa
{
public:
    int publiczne;
    int funkcja()
    {
        cout << prywatne << endl;
        cout << chronione << endl;
        cout << publiczne << endl;
    }
    Klasa() //konstruktor
    {
        prywatne = 10;
        chronione = 60;
        publiczne = 9;
    }
private:
    int prywatne;
protected:
    int chronione;
};

W obrębie klasy możesz dostać wszystko i robić co chcesz ze wszystkim. Inaczej jest z poziomu obiektu:

C/C++
Klasa obiekt;
obiekt.publiczne = 0; //dostęp do publicznych danych jest możliwy
obiekt.prywatne = 8; //do prywatnych nie..
obiekt.chronione = 3; //i do chronionych też nie

Z poziomu obiektu próbujesz dostać się do pola  prywatnego co jest niemożliwe. Możesz stworzyć metody publiczne które zwrócą ci wartość z pola prywatnego:

C/C++
class gracz
{
private:
    oznaczenie znak;
    ruch akcja;
public:
    string imie;
    ruch getAkcja();
};

ruch gracz::getAkcja()
{
    return akcja;
}

I zamiast w kodzie

C/C++
player1.akcja;

użyj:

C/C++
player1.getAkcja();
P-7913
eBbi
Temat założony przez niniejszego użytkownika
» 2009-06-22 20:12:51
Czy da się zrobić żeby funkcje w klasie wykonywały się po koleji?? tzn bez dużej ingerencji, czyli np wczytuje sobie do maina gra(); i mi robi po koleji funkcje. Gdzieś to chyba widziałem. A jak nie w klasach to gdzie to mogę zrobić?.
class gra
{ public:
void smiec();
void lalka();
....
};
P-7915
WunM
» 2009-06-22 20:16:32
Tak,tworzysz główną funkcję main() w której wywołujesz po kolei interesujące cię funkcje.
P-7916
eBbi
Temat założony przez niniejszego użytkownika
» 2009-06-22 20:17:37
nie o to mi chodziło ale okey. thx za pomoc

EDIT: próbowałem do konstruktora dać wypisy funkcji i potem w głównym pliku wywoał ten konstruktor ale wypada błąd;


class gra
{
      public:
            
             void read();
             void losowanie();
             void rysowanie();
             gra()
             {read(); losowanie();rysowanie();}
};
--------GLOWNY PLIK---------
int main()
{
gra();
return 0;
}

błąd:   [Linker error] undefined reference to `gra::rysowanie()'
       [Linker error] undefined reference to `gra::losowanie()'
       [Linker error] undefined reference to `gra::read()'
 
P-7917
DeBugger
» 2009-06-22 20:19:14
Czekaj... Ja Ci pomogę. Zrobię edita za chwilę.

//edit:
C/C++
class Foo
{
    int x;
public:
    void do_f1() { x++; }
    void do_f2() { x *= x; }
    void do_f3() { x = x -( x / 2 ); }
    void do_f4() { x += x; }
    Foo() { x = 0;
        do_f1();
        do_f2();
        do_f3();
        do_f4(); }
    ~Foo() { }
};
int main()
{
    Foo foo; //przy deklaracji wykona się konstruktor który wykona wszystkie funkcje
}

Lekcja o konstruktorach.
P-7918
DeBugger
» 2009-06-22 20:33:38
Oo... wyprzedziłeś mnie. Nie zapominaj o definicjach funkcji. Mogą być ona na zewnątrz - np:
C/C++
class Foo
{
public:
    void do_foo();
};
void Foo::do_foo()
{
}
P-7919
« 1 » 2
  Strona 1 z 2 Następna strona