Je vais essayer d'être clair.
J'ai créé un exemple bidon pour reproduire mon problème, avec une classe mère "Methode", deux filles "Simple" et "Complexe", une classe "MethodeUser" qui utilise les méthodes et une classe "User".
Je répète que les fonctions et calculs n'ont pas de sens, et servent juste pour illustrer.
Classe Methode:
Classe Simple:Code:
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 #ifndef METHODE_H_ #define METHODE_H_ #include <vector> class Methode { public: /******************************** CONSTRUCTOR *********************************/ /** * @brief Default constructor. */ Methode(); /********************************* DESTRUCTOR *********************************/ /** * @brief Default destructor. */ virtual ~Methode(); /*********************************** METHODS **********************************/ virtual double calculation(double& a, double& b) const=0; virtual function1(double& a) = 0; void printInputsValues() const; void printSolutionValue() const; protected: double m_solution; std::vector<double> m_inputs; }; #endif /* METHODE_H_ */
Code:
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 #ifndef SIMPLE_H_ #define SIMPLE_H_ #include "Methode.h" class Simple: public Methode { public: /******************************** CONSTRUCTOR *********************************/ /** * @brief Default constructor. */ Simple(); /********************************* DESTRUCTOR *********************************/ /** * @brief Default destructor. */ virtual ~Simple(); /*********************************** METHODS **********************************/ virtual double calculation(double& a, double& b); virtual void function1(double& a); /*********************************** GETTERS **********************************/ private: double m_coeff; }; #endif /* SIMPLE_H_ */
Classe ComplexeCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include "Simple.h" double Simple::calculation(double a, double b) { double res = 0.0; function1(a); res = a + m_inputs[b]; return (res); } void Simple::function1(double& a) { int i=0; for(i=0;i<m_inputs.size();++i) { m_inputs[i] = m_coeff*a; } }
Code:
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 #ifndef COMPLEXE_H_ #define COMPLEXE_H_ #include "Methode.h" class Complexe: public Methode { public: /******************************** CONSTRUCTOR *********************************/ /** * @brief Default constructor. */ Complexe(); /********************************* DESTRUCTOR *********************************/ /** * @brief Default destructor. */ virtual ~Complexe(); /*********************************** METHODS **********************************/ virtual double calculation(double& a, double& b); virtual void function1(double& a); void function2(double& a); /*********************************** GETTERS **********************************/ private: double m_alpha; double m_epsilon; double m_sigma; std::vector<double> m_angle; }; #endif /* COMPLEXE_H_ */
Classe MethodeUserCode:
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 #include "Comlexe.h" double Comlexe::calculation(double a, double b) { double res = 0.0; function1(a); function2(a); res = a + m_inputs[b]; return (res); } void Comlexe::function1(double& a) { int i=0; for(i=0;i<m_inputs.size();++i) { m_inputs[i] = m_sigma*a + m_epsilon; } } void Comlexe::function2(double& a) { int i = 0; for(i=0;i<m_inputs.size();++i) { a += m_alpha[i] + m_inputs[i]; } }
Code:
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 #ifndef METHODEUSER_H_ #define METHODEUSER_H_ #include "Methode.h" class MethodeUser { public: /******************************** CONSTRUCTOR *********************************/ /** * @brief Default constructor. */ MethodeUser(); /********************************* DESTRUCTOR *********************************/ /** * @brief Default destructor. */ virtual ~MethodeUser(); /*********************************** METHODS **********************************/ double useMethode(Methode& m, double& a, double& b); /*********************************** GETTERS **********************************/ private: }; #endif /* METHODEUSER_H_ */
Classe UserCode:
1
2
3
4
5
6
7 #include "MethodeUser.h" double MethodeUser::useMethode(Methode& m, double& a, double& b) { return m.calculation(double a, double b); }
Code:
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 #ifndef USER_H_ #define USER_H_ #include "Simple.h" #include "Complexe.h" #include "MethodeUser.h" class User { public: /******************************** CONSTRUCTOR *********************************/ /** * @brief Default constructor. */ User(); User(MethodeMode mode); /********************************* DESTRUCTOR *********************************/ /** * @brief Default destructor. */ virtual ~User(); /*********************************** METHODS **********************************/ void solve(); /*********************************** GETTERS **********************************/ private: ModelUser m_modelUser; Simple m_methodeSimple; Complexe m_methodeComplexe; MethodeMode m_mode; }; #endif /* USER_H_ */
Voilà le décor est posé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include "User.h" void User::solve() { double a = 3.14; double b = 1.51; if(m_mode==SIMPLE) { m_modelUser.useMethode(m_methodeSimple, a, b); } else if(m_mode==COMPLEXE) { m_modelUser.useMethode(m_methodeComplexe, a, b); } else {// errror: unknown mode } }
Je voudrais pouvoir faire :
1. dans User.h, remplacer les attributs de méthodes par un seul attribut générique
Je pourrais le faire dans ce petit exemple, mais je pourrai plus appeler de méthodes propres aux classe filles.Code:
1
2
3
4 private: //Simple m_methodeSimple; //Complexe m_methodeComplexe; Methode methode;
2. pouvoir appler des méthodes propres aux classe filles dans MethodeUser:
pour eviter d'avoir deux fonctions qui font presque la même chose:Code:
1
2
3
4
5
6
7
8 double MethodeUser::useMethode(Methode& m, double& a, double& b) { // par exemple initialiser m_angle qui appartient à Complexe std::vector<double> angle = std::vector<double>(SIZE, 13); m.initializeAngle(angle); return m.calculation(double a, double b); }
Même je n'ai aucunes excues, je précise qu'à ma décharge, on m'avait dis que les (vraies) classes "Simple" et "Complexe" auraient exactement les mêmes caractéristiques, donc quand j'ai fais le design j'ai naturellement pensé à l'héritage.Code:
1
2 double MethodeUser::useMethode(Simple& m, double& a, double& b); double MethodeUser::useMethode(Complexe& m, double& a, double& b);
C'est par la suite que j'ai commencé à "bricoler" pour que tout ce tienne.