2013-04-30 6 views
0

Je fais un jeu, dans le jeu a une liste qui contient le joueur, cette liste traite avec le joueur de classe. J'ai aussi une classe le est un enfant du joueur appelé HumanPlayer. J'ai ajouté un joueur humain à la liste des joueurs. mais quand je cours une fonction de rendu il ne rend pas de joueur humain il rend du joueur. La fonction de rendu est une fonction virtuelle, qui devrait être remplacée mais pas.Héritage C++ ne fonctionne pas

Voici où je définis la liste:

std::list<Player> playerList; 

ici est où ajouter une humanplayer à la liste:

playerList.push_front(HumanPlayer(512,512,&entityList)); 

Voici où la fonction Render appelle les rendre:

if(!playerList.empty()){ 
    std::list<Player>::iterator iter; 
    for (iter = playerList.begin(); iter != playerList.end(); iter++){ 
     iter -> render(canvas); 
    } 
} 
+4

Vous êtes 'slicing' http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c, le polymorphisme nécessite' pointeurs'. –

Répondre

4

Vous faites ce qu'il a appelé Slicing. Pour que le polymorphisme fonctionne, vous devez utiliser pointer s ou reference s. La solution la plus basique serait d'utiliser un pointer à la place:

std::list<Player*> playerList; 

mais maintenant vous devez gérer la mémoire et n'oubliez pas delete toutes les instances que vous créez. Donc, comme Collin vous a suggéré could utiliser une sorte de smart pointer comme std::shared_ptr. Mais en fin de compte, vous devez décider lequel a le plus de sens pour votre problème.

+0

L'utilisation de pointeurs modifie un certain nombre de choses dans son code; en particulier, il y aura juste une instance de chaque joueur, pas beaucoup. Il est hautement improbable que 'std :: unique_ptr' soit approprié ici; 'std :: shared_ptr' _might_ be, mais il y a de fortes chances que le pointeur le plus approprié soit un pointeur brut. –

+0

@ JamesKanze Merci, la réponse modifiée –

0

Vos objets sont sliced, puisque vous stockez un type de valeur Player plutôt qu'un pointeur.

Essayez ceci:

std::list<std::unique_ptr<Player>> playerList; 
playerList.push_front(std::unique_ptr<Player>(new HumanPlayer(512,512, &playerList))); 
1

Premièrement - utilisez des pointeurs, d'autre part - n'oubliez pas de rendre vos méthodes virtuelles.

+0

oui, ce ne serait pas élégant – 4pie0