2015-04-25 4 views
-2

Хорошо, поэтому я пытаюсь создать систему компонентов/сущностей для своего игрового движка, и у меня есть база class component, которая имеет виртуальный метод update(), а затем все различные типы компонентов выводятся из этого базового класса. Я сохраняю указатели на эти компоненты в массиве, а затем перебираю массив, вызывающий метод обновления. Когда у меня есть только один тип производного класса, это отлично работает, он вызывает производный виртуальный метод, но как только я добавляю другой тип производного класса, он начинает использовать базовый метод обновления. Вот и пример:Вызов виртуальных методов разных производных классов в одном массиве указателей

//Hold the pointers to the Components 
Component** components; 

//in the system constructor I initialize the array of components 
void System::System() 
{ 
    components = new Component*[MAX_COMPONENTS](); 
} 

//Inputlistener is a derived component 
InputListener* inputListener; 
inputListener= new InputListener; 

//Playercontroller is also derived component 
PlayerController* playerController; 
playerController = new PlayerController; 

//Adds the pointer to the components array 
system->add(inputListener); 
system->add(playerController); 

//loops over the array the update method is a virtual method 
system->update(); //calls the base classes update method not the derived 

Из того, что я прочитал в Интернете, что шов, как это должно быть возможным, так как массив просто держит указатель а не сам объект, поэтому они должны быть нарезаны в базовый класс. Если я действительно ошибаюсь в отношении этого предположения, что было бы решением?

+0

Вы пробовали? Это сработало? На стороне примечания, почему бы не использовать 'vector ' по крайней мере - предпочтительно какую-нибудь конструкцию умных указателей. –

+0

Слишком плохо, что вы не указали какой-либо код, который имеет значение. В любом случае, ответ заключается в том, что у вас есть ошибка в некотором коде, который вы не показывали. – juanchopanza

+0

Это не выглядит неправильно. Отправьте минимальный и полный пример, который показывает проблему. – molbdnilo

ответ

0
//Hold the pointers to the Components 
std::vector<Component*> components; 

//Inputlistener is a derived component 
InputListener* inputListener; 
inputListener= new InputListener; 

//Playercontroller is also derived component 
PlayerController* playerController; 
playerController = new PlayerController; 

components.push_back(inputListener); 
components.push_back(playerController); 

for(size_t i = 0; i < components.size(); ++i){ 
    Component* cmp = components.at(i); 
    if(cmp) cmp->update(); 
} 
+0

Действительно ли это отвечает на любой из вопросов OP (я согласен с вектором tho ') –

+0

@MatsPetersson На самом деле я хотел просто дать подсказку, показывая некоторый код. – CreativeMind

0
#include <iostream> 

using namespace std; 

class Base { 
    public: 
    virtual void update(){ 
     cout << "Base" << endl; 
    } 
}; 

class Derived1 : public Base { 
    public: 
    void update() override{ 
     cout << "Dervied1" << endl; 
    } 
}; 

class Derived2 : public Base { 
    public: 
    void update() override{ 
     cout << "Dervied2" << endl; 
    } 
}; 

int main() 
{ 
    Base* sample[3]; 
    sample[0] = new Base(); 
    sample[1] = new Derived1(); 
    sample[2] = new Derived2(); 

    for(int i=0; i < 3; ++i){ 
     sample[i]->update(); 
    } 
    return 0; 
} 

Я создал ссылку здесь http://codepad.org/IfnBdYIk. Можете ли вы проверить свой код с этим и сказать, делаете ли вы что-то по-другому? Потому что из описания того, что вы пробовали, вы не должны были видеть неправильное поведение, и я тоже.