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

Problem z dziedziczeniem

Ostatnio zmodyfikowano 2011-07-29 20:20
Autor Wiadomość
Thud
» 2011-07-28 23:41:25
Zależy jak to zaimplementujesz.
Możesz dziedziczyć np. z jednej klasy rodzica dwie klasy potomka.
P-37480
diego997
Temat założony przez niniejszego użytkownika
» 2011-07-28 23:47:10
Chciałbym żeby wszystko było jasne napiszę o co mi chodzi a ty jeżeli możesz podasz mi najlepszy sposób:

Mam dwie klasy:

C/C++
class Enemy
{
public:
    sf::Shape Obiekt;
   
    //Klasa odpowiedzialana za tworzenie
};




class Akcje
{
public:
   
    void action(); //Poruszanie sie przeciwnika funkcja ma korzystać z obiektu Obiekt klasy Enemy
   
   
};


i na końcu chciałbym aby to wyświetło się w następujący sposób

Enemy Alien;

Alien.action();

Da rade?
P-37481
kamillo121
» 2011-07-28 23:54:07
Wynajdujesz problemy na siłę :)

Jak widać tak po prostu się nie da bo obydwie klasy nie mają ze sobą żadnego powiązania w takiej postaci.
Możesz to zrobić w inny sposób, jaki ?
Np.

C/C++
class Action
{
public:
    void action();
};


class Foo
{
public:
    Action act;
};

I odwoływać się:

C/C++
Foo f;

f.act.action();
Możesz też skorzystać z uroków wskaźników na metody ale do tego trzeba nieco większej wiedzy.

A teraz doczytałem(coś mi przedtem umknęło), że action ma mieć dostęp do Enemy, to nic innego jak dziedziczenie(najbardziej czytelny sposób).
Klasa Enemy może dziedziczyć Action i wydaje się to logiczne.

P-37482
diego997
Temat założony przez niniejszego użytkownika
» 2011-07-29 00:01:21
OK klasa Enemy dziedziczy Action ale również funkcja(); w jakiś sposób musiałą by mieć dostęp do Obiekt, jak to zrobić wcześniej wywalało mi błąd jak wpisałęm Wrog_A &wrog
P-37483
kamillo121
» 2011-07-29 00:11:40
Albo lepiej daj sobie spokój z dziedziczeniem, jest późno, mogą komuś nerwy puścić :)
Jak chcesz to szybko zrobić to zrób to tak:

C/C++
class Enemy;

class Action
{
    Enemy * en;
   
public:
    Action( Enemy * en )
    {
        Action::en = en;
    }
   
    void action()
    {
        //tutaj się bawisz obiektem Enemy
    }
};


class Enemy
{
public:
    Action * act;
   
    Enemy()
    {
        act = new Action( this );
    }
};
// możesz obejść się wyżej bez wskaźników ale przedstawiłem prosty i szybki sposób

A użycie to:
C/C++
Enemy a;

a.act->action();
//Jakbyś przeciążył jeszcze operatory wyłuskania to możesz to sprowadzić do krótszej formy wywołania


:)
P-37484
diego997
Temat założony przez niniejszego użytkownika
» 2011-07-29 00:15:30
Ok dzięki zaraz to przeanalizuje ja tak czy siak dzisiaj nie zasnę dopuki nie rozgryzę tego o co wczesniej pytałem także jeżeli mają ci nerwy puścić to najwyżej jutro odpiszesz :)


Enemy Alien

Alien.action();

//Powyższą operację mogę zrobić dzięki dziedziczeniu



action() //Definicja action
{

//Ale tutaj w definicji potrzebuje obiektu Obiekt z klasy Enemy o to mi chodzi jak miec do niego dostęp?

}

P-37485
kamillo121
» 2011-07-29 00:19:14
Jeżeli by ci to nie przeszkadzało to możesz po prostu dodać "wcześniej" klasę abstrakcyjną typu "data" która przechowywałaby wszystkie potrzebne dane:
C/C++
struct Data
{
    //wszystkie dane
};


class Action
    : Data
{
   
};

class Enemy
    : Action
{
   
};

Tak jak to wyżej opisałeś to nie jest to możliwe bo jak klasa główna może korzystać z czegoś o czym nie ma pojęcia że to istnieje ? :)
P-37486
Thud
» 2011-07-29 00:19:17
Prosty i mało ograniczony zasięg będziesz miał przez przyjaźń klas.
P-37487
1 « 2 » 3 4 5 6 7
Poprzednia strona Strona 2 z 7 Następna strona