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

Alternatywa na przeładowanie funkcji

Ostatnio zmodyfikowano 2012-09-09 14:43
Autor Wiadomość
diego997
Temat założony przez niniejszego użytkownika
Alternatywa na przeładowanie funkcji
» 2012-09-09 13:54:44
Cześć mam klasę Ball a w niej metodę move która przymuje dwa parametry:

C/C++
class Player;
class Enemy;

class Ball
{
public:
    move( Player &, Enemy & );
   
};

Chciałbym aby ta metoda jako drugi parametr przejmowała albo Enemy albo Player czyli:
C/C++
move( Player &, Enemy & );
move( Player &, Player & ); //lub

Nie zawracałbym głowy gdyby ta metoda nie byłaby dość rozbudowana, krótko mówiąc czy da się to rozwiązać w inny sposób niż poprzez przeładowanie funkcji, czyli kopiowanie definicji tej metody ?
P-64695
pekfos
» 2012-09-09 13:56:22
Dziedziczenie.
P-64696
diego997
Temat założony przez niniejszego użytkownika
» 2012-09-09 14:29:20
Pekfos dzięki za odpowiedź a co powiesz o szablonach funkcji ?
P-64702
DejaVu
» 2012-09-09 14:35:36
Moje doświadczenie mówi, że w większości przypadków pisanie własnych szablonów to strzał w stopę. No ale jeżeli w nich widzisz rozwiązanie to je zastosuj :) Sam swego czasu byłem 'zachwycony' szablonami i je wciskałem wszędzie gdzie można było uznać to za uzasadnione.
P-64704
diego997
Temat założony przez niniejszego użytkownika
» 2012-09-09 14:43:58
Wiesz szablony przyszły mi na myśl pewnie dlatego że gdzieś wyczytałem że z góry nie trzeba podawać typu zmiennej. Natomiast nigdy ich nie używałem dlatego zapytałem czy można by je zastosować. Co do dziedziczenia to kurcze za bardzo nie wiem jakbym mógł wykorzystać, może podałbyś jakiś przykład ? W między czasie poczytam o szablonach, jak faktycznie się w tym pogubię to ewentualnie popróbuję coś z dziedziczeniem ale tak jak mówię póki co nie mam pojęcia jak zastosować.

EDIT: Jak co to takie coś udało mi się zrobić puki co spełnia moje oczekiwania :D
C/C++
class A;
class B;

class C
{
public:
    int liczba;
    C( int x );
};

class B
{
public:
    int liczba;
    B( int x );
};

class A
{
public:
    template < class type >
    void move( B & B, type & C );
    A();
};



int main()
{
    A ObjA;
    B ObjB( 1 );
    C ObjC( 2 );
   
    ObjA.move( ObjB, ObjB );
   
    getch();
}

template < class type >
void A::move( B & B, type & C )
{
    cout << B.liczba + C.liczba;
}


A::A() { }



B::B( int x )
{
    liczba = x;
}

C::C( int x )
{
    liczba = x;
}


EDIT:: Kurcze jak chce to zastosować w swoim programie to wyskakuje błąd:

unresolved external symbol "public: void __thiscall _Ball::move<class _Enemy>(class _Player &,class _Enemy &)" (??$move@V_Enemy@@@_Ball@@QAEXAAV_Player@@AAV_Enemy@@@Z) referenced in function _main

a kod wygląda tak:

C/C++
//deklaracja
template < class Type >
void move( _Player &, Type & Enemy );

W definicji move korzystam tylko z publicznych metod, nazwy są takie same.

EDIT:: Okazało się iż problem tkwi w tym że klasy są w osobnych plikach, puki co jeszcze nie rozwiązałem problemu ;p
P-64705
« 1 »
  Strona 1 z 1