Bonjour,
Je suis entrain de décelopper une calculatrice en langage interpreté (qui permetra plus tard de génerer, pour cela je fonctionne avec une arboressance de noeuds.
Ceux ci peuvent être:
- Des nombres simples, ou une formule de dés (1d6, 2d4): ce sont les feuilles de mon arbre).
- Des Opérations (je me limites aux opérations basiques: +, -, * et /).
Pour les opérations, j'ai décidé, plutot que d'implémenter quattres classes filles), d'utiliser la généricité avec les diférents foncteurs de la stl.
Voici la classe mère abstraite (noeud de base), décrite dans le fichier aDiceNode.h:
Voici la classe dérivée décrite et implémentée dans le fichier cDiceOperationNode.inl:
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 #ifndef NODE_H #define NODE_H #include <string> #include "../Exceptions/Exceptions.h" #include "aDiceNode.h" namespace DiceEngine { namespace Calcul { /** * Classe abstraite de laquelle dérivent vous * les types de noeuds. Elle permet d'effectuer les * calculs demandés, par la classe * <code>cDiceCalculator</code>. */ class aDiceNode { public: /** * Simple constructeur définissant une expression. * @param expression une expression à calculer. */ aDiceNode(const std::string& expression = ""); aDiceNode(const aDiceNode& source); /** * Destructeur. */ virtual ~aDiceNode(); /** * Obtient l'expression à calculer * @return une chaîne de caractère de l'expression. */ std::string getExpression() const; /** * Effectue le calcul et retourne la valeur obtenue sous * forme de chaîne. * @return Le résultat des opperaion de tous les noeuds * effectués de manière récurcive. */ std::string execute() throw (Exceptions::eDiceNodeException); protected: std::string _expression, _name; int _value; /** * Dans son impléentation, cette fonction doit appeler * <code>process()</code>. En cas d'échec cas contraire, elle * renvoyer une exception. En cas de reussite <code>_value</code> * doit être renseigné. */ virtual void process() throw(Exceptions::eDiceNodeException) =0; private: }; } } #endif // NODE_H
Lorsque je terste cela, j'obtiens ces erreurs de compilation:
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 #ifndef OPERATIONNODE_H #define OPERATIONNODE_H #include "aDiceNode.h" #include <vector> #include <string> namespace DiceEngine { namespace Calcul { template <class Operation> class cDiceOperationNode : public aDiceNode { public: inline cDiceOperationNode(const std::string& expression = "") : aDiceNode::aDiceNode(expression), _children() {}; inline cDiceOperationNode(const cDiceCalculator& source) aDiceNode::aDiceNode(source), _children(source._children) {}; inline virtual ~cDiceOperationNode() {}; inline void addChildren(aDiceNode* node) { _children.push_back(node) }; protected: template <class Operation> inline void process() throw (Exceptions::eDiceNodeException) { _value = 0; for (std::vector<aDiceNode*>::iterator i = _cildren.begin(); i < _children.end(); i++) { _value = Operation(_value, *i->_value); }; } std::vector<aDiceNode*> _children; private: }; } } #endif // OPERATIONNODE_H
Voila mon programe principal:Compiling: main.cpp
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:19: erreur: expected «;" before «aDiceNode"
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:31: erreur: declaration of «class Operation"
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:11: erreur: shadows template parm «class Operation"
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl: In member function «void DiceEngine::Calcul::cDiceOperationNode<Operation>::addChildren(DiceEngine::Calcul::aDiceNode*)":
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:28: erreur: expected `;' before «}" token
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl: In member function «void DiceEngine::Calcul::cDiceOperationNode<Operation>::process()":
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:35: erreur: «_cildren" was not declared in this scope
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:37: erreur: request for member «_value" in «i->", which is of non-class type «DiceEngine::Calcul::aDiceNode*"
/home/floreal/dev/DiceCaster/main.cpp: In function «int main()":
/home/floreal/dev/DiceCaster/main.cpp:34: erreur: cannot declare variable «node" to be of abstract type «DiceEngine::Calcul::cDiceOperationNode<std::plus<int> >"
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/cDiceOperationNode.inl:13: note: because the following virtual functions are pure within «DiceEngine::Calcul::cDiceOperationNode<std::plus<int> >":
/home/floreal/dev/DiceCaster/DiceEngine/Calcul/aDiceNode.h:55: note: virtual void DiceEngine::Calcul::aDiceNode::process()
Process terminated with status 1 (0 minutes, 0 seconds)
9 errors, 0 warnings
Je suppose que j'ai des lacunes concernant la généricité en C++, mais que puis-je faire pour règler ces problèmes?
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 #include <iostream> #include "DiceEngine/DiceEngine.h" #include "DiceEngine/Calcul/cDiceOperationNode.inl" #include <functional> using namespace std; using namespace DiceEngine::Util; using namespace DiceEngine::Exceptions; using namespace DiceEngine::Calcul; int main() { //Autres tests peu interessants cDiceOperationNode<plus<int> > node("53+21"); return 0; }
Partager