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

Dziedziczenie klas

Ostatnio zmodyfikowano 2013-05-18 10:59
Autor Wiadomość
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
C/C++
#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 // GAME_H_INCLUDED
Klasa player
C/C++
#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 // PLAYER_H_INCLUDED
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.
P-83200
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?
P-83202
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.
P-83205
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.
P-83206
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 :)
P-83207
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):
C/C++
class Game
{
public:
    //pola itp
};
class Player
{
public:
    //wlasne pola
    Game * ptr; //wskaźnik na obiekt Game
};
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ś.
P-83219
« 1 »
  Strona 1 z 1