Dziedziczenie klas
Ostatnio zmodyfikowano 2013-05-18 10:59
polkom21 Temat założony przez niniejszego użytkownika |
Dziedziczenie klas » 2013-05-17 22:36:17 Witajcie. Dość dawno tu nie zaglądałem. Mam taki problem bo potrzebuje korzystać z jednej tablicy w dwóch klasach a dziedziczenie mi tu nie wychodzi coś. Klasa Game #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED
#include <SFML/Graphics.hpp> #include <iostream> #include <fstream> #include <string> #include "player.h"
class Game { private: sf::Texture texture[ 2 ]; int startx, starty; float camx; public: int level, sizemapx, sizemapy, mapa[ 200 ][ 20 ]; bool endGame; std::string levelList[ 10 ]; void Play( sf::RenderWindow & window, sf::Event & event ); void loadFiles(); void loadMap( const char * namemap ); void drawMap( sf::RenderWindow & window ); void loadListMap(); void cameraControll( float playerPositionX ); };
#endif
Klasa player #ifndef PLAYER_H_INCLUDED #define PLAYER_H_INCLUDED #include <SFML/Graphics.hpp> #include <iostream> #include "game.h"
class Player : public Game { private: float speed; bool jump, resetTime; public: sf::Sprite Splayer; sf::Vector2f position; void controllPlayer( float camPositionX ); void drawPlayer( sf::RenderWindow & window ); };
#endif
i tu w klasie plaer mam dziedziczenie klasy Game i takie coś nie działa (wywala: error: expected class-name before '{' token|) a chodzi mi o tablice mapa. Będę wdzięczny za pomoc. |
|
akwes |
» 2013-05-17 22:43:21 Ty chcesz dziedziczyć wszystkie funkcje i zmienne klasy Game w klasie Player? Jeżeli tak, to będzie to naprawdę przedziwne i wygląda na zły pomysł lub brak projektu. Jeżeli chcesz dziedziczyć tylko tablicę to masz dwie możliwości: a) albo wymyślić jakiś porządny model abstrakcji klasy bazowej, która będzie sensownie uargumentowana i po niej będą dziedziczyć Player i Game. Jeżeli chcesz korzystać z tej tablicy w funkcjach klas, które dziedziczą (chociaż będzie to trochę walczyć z hermetyzacją i wprowadzać niepotrzebną szczegółowość) to musisz mieć tą zmienną jako "protected" w klasie bazowej. b) nie dziedziczyć, tylko dać tę tablicę bezpośrednio w Player i to wygląda na najlepsze wyjście. Jeżeli nie potrzebujesz korzystać z polimorfizmu to nie korzystaj z dziedziczenia. Dziedziczenie wprowadza dodatkową złożoność oraz jest drugą relacją co do siły wiązania zależności między obiektami co się odbija negatywnie na jakości kodu. // Edit, A może w ogóle chodzi Ci o to, że chcesz z jednej tablicy w dwóch klasach |
mieć dokładnie tę samą tablicę z tymi samymi danymi? |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-05-17 23:16:41 no własnie w obu klasach potrzebuje tą samą tablice z tymi samymi danymi. Potrzebuję tą tablice do napisania kolizji ale rozważam też takie wyjście, żeby przekazać tylko nazwę poziomu i wczytać plik z miejscami gdzie ma następować kolizja tylko też pytanie czy jest mi to tak bardzo potrzebne. |
|
akwes |
» 2013-05-17 23:26:29 To nie osiągniesz tego za pomocą dziedziczenia. Wygląda na to, że też nie za bardzo orientujesz się o co chodzi z dziedziczeniem.
W każdym razie.
Aby móc korzystać z tej tablicy w obu klasach masz kilka możliwości. Oto dwie, które mi przychodzą na szybko do głowy:
a) Klasa A udostępnia interfejs dający dostęp klasie B dostęp do tablicy (za pomocą funkcji składowych, a nie bezpośrednio), b) Do klasy A oraz klasy B jest przekazywany wskaźnik na tablicę, która jest tworzona gdzieś wcześniej.
|
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-05-18 00:03:17 Zanim mi odpisałeś to zacząłem poprawiać wszystko tak jak napisałeś w drugiej możliwości :) |
|
RazzorFlame |
» 2013-05-18 10:59:22 W tych klasach jest troche namieszane. Dziedziczysz pola które na chłopski rozum (nawet po nazwach widać) nie powinny się znaleść w klasie Player. Wg. mnie te dwie klasy nie mają ze sobą nic wspólnego :P. Ja bym to zrobił tak (pisałeś że potrzebujesz do kolizji): class Game { public: }; class Player { public: Game * ptr; };
O ile sie domyślam z tą kolizją chodzi Ci o to że masz mape w klasie Game. Używając wskaźnika najlepiej (możliwe że jest jakiś lepszy sposób) zrealizujesz to co zamierzałeś. |
|
« 1 » |