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

[cpp] wektor wskaźników na obiekty - polimorfizm

Ostatnio zmodyfikowano 2016-04-29 12:19
Autor Wiadomość
aaadam
Temat założony przez niniejszego użytkownika
[cpp] wektor wskaźników na obiekty - polimorfizm
» 2016-04-29 10:36:10
piszę gre i nie wiem czemu nie działa mi umieszczanie typów pochodnych w kontenerze bazowym  .... przejde do kodu od razu :
plik enemy.h
C/C++
class enemy
    : public basicBody
{
public:
    virtual void move() = 0;
    float speed;
    enemy();
    virtual ~enemy();
};
plik fastWalkingEnemy.h
C/C++
class fastWalkingEnemy
    : public enemy
{
public:
    void move() cout << "fastWalkingEnemy " << endl;
   
    fastWalkingEnemy();
    ~fastWalkingEnemy();
};
plik hevyEnemy.h
C/C++
class hevyEnemy
    : public enemy
{
public:
    void move() cout << "HevyEnemy" << endl;
    hevyEnemy();
    ~hevyEnemy();
};

resourseMenager.h
C/C++
class resourseMenager final
{
public:
   
    enum LoadState { TileSet, Map };
    std::vector < std::vector < tile > > GameMap;
    std::vector < enemy *> Enemies;
    std::vector < enemy *>::iterator It_Enemies;
    void LoadMap( char * filename );
    int mouseX, mouseY;
    resourseMenager();
    ~resourseMenager();
};

w funkcji update
C/C++
this->ResourseMenager.Enemies.push_back( fastWalkingEnemy() );
this->ResourseMenager.Enemies.push_back( walkingEnemy() );
this->ResourseMenager.Enemies.push_back( hevyEnemy() );

for( int i = 0; i < this->ResourseMenager.Enemies.size(); i++ )
     this->ResourseMenager.Enemies[ i ]->move();

może ktoś pomóc ?
P-147764
mateczek
» 2016-04-29 11:23:34
C/C++
this->ResourseMenager.Enemies.push_back( fastWalkingEnemy() ); // a nie jest tak że kontener masz na wskaźniki
//a ładujesz obiekty ??

jeśli piszę głupoty zignoruj. a poniżej mały program testowy

C/C++
#include <iostream>
#include <string>
#include<vector>
using namespace std;
class czlowiek {
public:
    string imie;
    int wiek;
    virtual void przedstawSie();
   
};

void czlowiek::przedstawSie() {
    cout << "czlowiek " << imie << " lat " << wiek << endl;
}

class pracownik
    : public czlowiek
{
public:
    void przedstawSie();
    int starzPracy;
};

void pracownik::przedstawSie() {
    cout << "pracownik " << imie << " lat " << wiek << " pracuje lat " << starzPracy << endl;
}

int main()
{
    czlowiek c;
    c.imie = "marek";
    c.wiek = 30;
   
    pracownik p;
    p.imie = "piotrek";
    p.wiek = 31;
    p.starzPracy = 3;
   
    //test pierwszy
    vector < czlowiek > tablica;
    tablica.push_back( c );
    tablica.push_back( p );
    tablica[ 0 ].przedstawSie();
    tablica[ 1 ].przedstawSie();
    cout << endl;
   
    //test2
    cout << "Test nr2 wskazniki dzialaja lepiej" << endl;
    vector < czlowiek *> tabl;
    tabl.push_back( & c );
    tabl.push_back( & p );
    tabl[ 0 ]->przedstawSie();
    tabl[ 1 ]->przedstawSie();
}
P-147765
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-29 11:40:33
"this->ResourseMenager.Enemies.push_back( fastWalkingEnemy() ); // a nie jest tak że kontener masz na wskaźniki
//a ładujesz obiekty ??"
no wlaśnie chce wskaźniki żeby działał polimorfizm, ale jak dam tak : this->ResourseMenager.Enemies.push_back(*fastWalkingEnemy()); to nie działa ...
P-147766
mateczek
» 2016-04-29 12:00:47
C/C++
//a tak??
this->ResourseMenager.Enemies.push_back( new fastWalkingEnemy );

że tak jeszcze zapytam
C/C++
this->ResourseMenager.Enemies.push_back( fastWalkingEnemy() );
//fastWalkingEnemy() to ma być funkcja, że ten nawias dajesz ?? bo nie bardzo kumam ??
P-147767
Kaikso
» 2016-04-29 12:14:56
@Up: fastWalkingEnemy() to tworzy obiekt tymczasowy z wywołaniem konstruktora domyślnego.
P-147768
aaadam
Temat założony przez niniejszego użytkownika
» 2016-04-29 12:19:40
z "new" działa dzięki :)


this->ResourseMenager.Enemies.push_back( fastWalkingEnemy() );
//fastWalkingEnemy() to ma być funkcja, że ten nawias dajesz ?? bo nie bardzo kumam ??
tak to jest konstruktor
P-147769
« 1 »
  Strona 1 z 1