Je suis relativement nouveau à C++, et provenant d'un arrière-plan C# Je vais avoir du mal avec cette liste itération:Itère une liste des sous-classes erreur
J'ai une méthode qui fait une boucle à travers une liste d'objets et d'appels une méthode de mise à jour pour chacun, qui fonctionne très bien. La liste est de type std::list<EngineComponent>
et est appelée engineComponents
.
void Game::Update()
{
for (EngineComponent component: this->engineComponents)
{
component.Update();
}
}
J'ai aussi une sous-classe de EngineComponent
appelé DrawableEngineComponent
.
La question apparaît lorsque je tente de faire une itération similaire:
void Game::Draw()
{
for (DrawableEngineComponent component: this->engineComponents)
{
component.Draw();
}
}
Ce produit l'erreur « Aucun de conversion définie par l'utilisateur approprié de « EngineComponent » à « DrawableEngineComponent » existe ». Étant donné que cette implémentation était très bien et en diète en C#, je ne suis pas vraiment sûr de la meilleure façon de résoudre ce problème en C++.
Je peux penser à d'autres moyens qui devraient/devraient fonctionner, mais je me demande s'il existe des fonctionnalités en C++ pour faire cela d'une manière similaire à C# sans avoir à définir manuellement une conversion.
Les définitions pour les deux classes concernées sont les suivantes:
class EngineComponent
{
public:
EngineComponent(void);
~EngineComponent(void);
virtual void Update(void);
};
class DrawableEngineComponent : public EngineComponent
{
public:
DrawableEngineComponent(void);
~DrawableEngineComponent(void);
virtual void Draw(void);
};
Et oui, je copie le cadre XNA un peu;)
Cette tentative d'incantation crie un problème potentiel de tranchage. , et vous pouvez faire bien faire [lire cette question et les réponses] (http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c/274634#274634) pour en savoir plus à ce sujet – WhozCraig
Vous dites que cela fonctionne en C#, mais je ne suis pas sûr que ce soit vrai :-) En C#, que se passe-t-il si l'un des composants de la liste est * non * Drawable. Est-ce que ça plante? Ou passer cet élément dans la liste? Veuillez préciser quel comportement vous attendez/désirez à cet égard. –
@AaronMcDaid Vous avez raison, ce n'est pas le cas. J'ai été un peu confus quand j'ai écrit ça. Il est très facile à faire en C# en vérifiant simplement chaque objet lorsqu'il apparaît dans la boucle (avec une ligne de code), c'est ce que j'aurais dû écrire. Bon endroit :) –