Я создал deque <CObject *> и добавил другой тип элемента. Как я могу изменить атрибуты этих элементов? - PullRequest
0 голосов
/ 07 мая 2018

Я создал:

class CMap:{
public
std::deque<CObject*> obiekty;
}


class CBullet{
public:
int damage;
}

и я добавил другой тип элемента (например, CTank, CBullet ...) и я хочу изменить атрибуты, используя deque

for( size_t i=0; i<game->Mapa->obiekty.size(); i++){

 if(typeid(*(game->Mapa->obiekty[i]))==typeid(CBullet)){                                       
  this->HP=this->HP - game->Mapa->obiekty[i] (?? my problem/I can't do it ?? ->damage); 

}
}

1 Ответ

0 голосов
/ 07 мая 2018

Сначала вам нужно унаследовать ваши производные классы (CBullet, CTank) от базового класса (CObject), например,

//Base clase
class CObject
{
public:
    //...
    virtual ~CObject(){}; // Don't forget about virtual desctructor
};
class CBullet: public CObject
{
public:
    //...
    ~CBullet(){};
    void DoBulletMethod(){};
};
class CTank: public CObject
{
public:
    //...
    ~CTank(){};
    void DoTankMethod(){};
};

Затем вы можете проверить все объекты по dynamic_cast, например:

for( size_t i=0; i< game->Mapa->obiekty.size(); i++)
{
    if(dynamic_cast<CBullet*>(game->Mapa->obiekty[i]) != nullptr)
    {
        CBullet * BulletObj = dynamic_cast<CBullet*>(game->Mapa->obiekty[i]);
        BulletObj->DoBulletMethod();
    }
    else if(dynamic_cast<CTank*>(game->Mapa->obiekty[i]) != nullptr)
    {
        CTank * TankObj = dynamic_cast<CTank*>(game->Mapa->obiekty[i]);
        TankObj->DoTankMethod();
    }
}

Или вы можете использовать полиморфизм и создавать виртуальные методы без дальнейшего обнаружения текущего типа объекта, например, создать один виртуальный метод в базовом классе и переопределить его в производных классах:

//Base clase
class CObject
{
public:
    //...
    virtual ~CObject(){}; // Don't forget about virtual desctructor
    virtual void DoActionInLoop()
    {
        //No action in base class
    }
};
class CBullet: public CObject
{
public:
    //...
    ~CBullet(){};
    virtual void DoActionInLoop() override
    {
        std::cout << "I am bullet I can do here my tasks" << std::endl;
    }
};
class CTank: public CObject
{
public:
    //...
    ~CTank(){};
    virtual void DoActionInLoop() override
    {
        std::cout << "I am tank and I can do here my tasks" << std::endl;
    }
};

Затем просто вызовите этот метод для каждого CObject* экземпляра и получите свой полиморфизм:

for( size_t i=0; i< game->Mapa->obiekty.size(); i++)
{
    game->Mapa->obiekty[i]->DoActionInLoop();
}
...