Bonjour,
J'ai deux classes, dont l'une gère l'autre (code source ci-après). Il se trouve que lors de la destruction de la première classe, j'ai un appel à une fonction virtuelle pure. Je tiens à préciser que j'ai cherché sur internet un solution éventuelle à mon problème, mais je n'ai rien trouvé qui corresponde vraiment à mon problème.
Donc voici le code:
action_manager.h:
action_manager.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 #ifndef _ACTIONS_LIST_INCLUDED_ #define _ACTIONS_LIST_INCLUDED_ #include <list> #include "systemLists.h" #include "..\devicesStruct.h" class Entity; class Action; class ActionsList { public: //! Constructeur et destructeur ActionsList(SDevices* devs, Entity* owner); ~ActionsList(); //! Gestion des actions void addAction(ENUM_ACTION_INDEXES_LIST action); void popAction(); void clear(); //! Mise à jour void execute(float deltaT); //! Informations int getActionCount(); SDevices* getDevices(); private: void activateFirstAction(); std::list<Action*> actList; Entity* actionsOwner; int totalActions; SDevices* devices; }; #endif // _ACTIONS_LIST_INCLUDED_
L'appel à la fonction OnActionActivation plante uniquement lorsque l'actionlist est détruite. J'ai fait le test, en cours d'exécution + de 5000 appels de cette fonction ne font absolument aucune erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 #include "ActionsBase.h" #include "ActionsList.h" #include "..\Entity\Entity.h" //! Actions de base void Action::setEntityAnimation(unsigned int start, unsigned int end) { float num = object->getSceneNode()->getFrameNr(); object->setAnimationRange(start,end); if(num>=start && num<=end) object->getSceneNode()->setCurrentFrame(num); } //! Constructeur et destructeur ActionsList::ActionsList(SDevices* devs, Entity* owner) :actionsOwner(owner),totalActions(0),devices(devs) { } ActionsList::~ActionsList() { printf("Clearing...\n"); clear(); printf("Cleared !\n"); } //! Gestion des actions void ActionsList::addAction(ENUM_ACTION_INDEXES_LIST action) { if(baseActions[(int)action]) { Action* act = baseActions[(int)action]->cloneType(); act->manager = this; act->object = actionsOwner; actList.push_back(act); totalActions++; act->OnActionCreation(); if(totalActions==1) activateFirstAction(); } } void ActionsList::popAction() { if(actList.begin() != actList.end()) { Action* act = *actList.begin(); act->OnActionDeletion(); delete act; actList.erase(actList.begin()); totalActions--; activateFirstAction(); } } void ActionsList::clear() { while(actList.begin() != actList.end()) popAction(); } //! Mise à jour void ActionsList::execute(float deltaT) { if(actList.begin() != actList.end()) (*(actList.begin()))->exec(deltaT); else addAction(EAIL_IDLE); } //! Informations int ActionsList::getActionCount() { return totalActions; } SDevices* ActionsList::getDevices() { return devices; } //! Privé void ActionsList::activateFirstAction() { if(actList.begin() != actList.end()) { Action* act = *actList.begin(); // Voici la fonction qui plante : act->OnActionActivation(); } }
Par contre, quand on l'appelle depuis le destructeur d'ActionList (via clear() -> popAction() ), ca plante dès la première exécution...
Toutes les fonctions sont bien réimplémentées dans les classes filles...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #include "..\devicesStruct.h" #include "systemLists.h" #include "ActionsList.h" #include "..\type.h" #include <vector> class Entity; struct Action { //! La classe dont dépendent les actions ActionsList* manager; Entity* object; //! Les données de l'action std::vector<VoidValue> data; //! Destructeur virtuel virtual ~Action() {} //! Slots virtual void OnActionCreation() =0; virtual void OnActionActivation() =0; virtual void OnActionDeletion() =0; //! Fonctions principales virtual void exec(float deltaT) =0; virtual Action* cloneType() =0; virtual void escapeIfOtherActionsInList() { if(manager->getActionCount()>1) manager->popAction(); } virtual void finish() { manager->popAction(); } virtual void setEntityAnimation(unsigned int start, unsigned int end); //! RTTI virtual ENUM_ACTION_INDEXES_LIST getType() =0; };
Et j'obtient l'erreur meme si je met
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual void OnActionActivation() {printf("Act!\n");}
dans la classe de base...
Code : Sélectionner tout - Visualiser dans une fenêtre à part virtual void OnActionActivation() =0;
Quelqu'un aurait il une idée ?
Merci d'avance.
Partager