problem z odwołaniem się do klasy!
Ostatnio zmodyfikowano 2009-06-22 20:37
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. #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? |
|
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 |
|
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ą. class Klasa { public: int publiczne; int funkcja() { cout << prywatne << endl; cout << chronione << endl; cout << publiczne << endl; } Klasa() { 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: Klasa obiekt; obiekt.publiczne = 0; obiekt.prywatne = 8; obiekt.chronione = 3;
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: class gracz { private: oznaczenie znak; ruch akcja; public: string imie; ruch getAkcja(); };
ruch gracz::getAkcja() { return akcja; }
I zamiast w kodzie użyj: |
|
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(); .... };
|
|
WunM |
» 2009-06-22 20:16:32 Tak,tworzysz główną funkcję main() w której wywołujesz po kolei interesujące cię funkcje. |
|
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()' |
|
DeBugger |
» 2009-06-22 20:19:14 Czekaj... Ja Ci pomogę. Zrobię edita za chwilę. //edit: 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; } Lekcja o konstruktorach. |
|
DeBugger |
» 2009-06-22 20:33:38 Oo... wyprzedziłeś mnie. Nie zapominaj o definicjach funkcji. Mogą być ona na zewnątrz - np: class Foo { public: void do_foo(); }; void Foo::do_foo() { } |
|
« 1 » 2 |