Как сохранить дочерние классы в векторе и переопределить родительскую функцию - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь закодировать суперсериал js из великолепного канала YouTube «Метамфетамин» на c ++ и SDL2.

Теперь я застрял в Эпизоде ​​04 - https://www.youtube.com/watch?v=1rBOUyRGQuU

Я пытаюсь создать класс Entity с вектором класса Trait. Я хочу создать много разных классов, которые наследуются от Trait и хранить их в векторе. Я хочу вызвать функцию обновления подклассов, а не исходную функцию обновления черты.

// -- Entity.h -----------------------------------

class Entity {
private:
    Vec2 vel;
    std::vector<Trait*> traits;

public:
    Vec2 pos;
    // Constructor & Destructor
    Entity(void);   
    ~Entity(void);

    void addTrait(Trait* nTrait);

    void update();
};

// -- Entity.cpp -----------------------------------

void Entity::addTrait(Trait* newTrait) { 
    this->traits.push_back( newTrait );
}

void Entity::update() {

    for ( Trait* trait : this->traits ) {
        trait->update(  );
    }    
}

// -- Trait.h -----------------------------------
class Trait {
private:
    std::string name;
public:
    // Constructor & Destructor
    Trait(std::string aname );
    ~Trait(void);

    void update( void );
};
// -- Trait.cpp -----------------------------------
void Trait::update(  ) {
    printf("Trait update\n");
}

И подкласс Velocity.h от Черты

// -- Velocity.h -----------------------------------
class Velocity : public Trait {
private:
public:
    // Constructor & Destructor
    Velocity(std::string aname);
    ~Velocity(void);

    void update(Entity *entity);
};
// -- Velocity.cpp -----------------------------------
void Velocity::update(Entity *entity ) {
    printf("Velocity update\n");
    entity->setPos(0, 0);
}

Я перепробовал много разных версий и получил разные ошибки. Теперь у меня все работает, когда я добавляю признак скорости к сущности и вызываю метод обновления сущности (который просматривает все черты), только функция обновления вызывается из родительского класса черты (который печатает «Обновление черты» и не «Обновление скорости»).

main.cpp

    Entity *mario = new Entity();

    mario->setPos( 64, 180 );
    mario->setVel(  2, -2 );

    Velocity* velTrait = new Velocity("velocity");
    mario->addTrait(velTrait);

    mario->update();

И второй вопрос заключается в том, что я хочу дать функции обновления скорости указатель на сущность, чтобы я мог изменить положение сущностей и т. Д. *

1 Ответ

3 голосов
/ 08 мая 2019

Я хочу создать много разных классов, которые наследуются от Trait, и сохранить их в векторе.Я хочу вызвать функцию обновления подклассов, а не исходную Trait функцию обновления.

Чтобы получить то, что вы хотите, используйте метод virtual:

virtual void update( void );

ДляБолее подробно, я предлагаю вам изучить полиморфизм и виртуальные функции.

...