4 Une première approche

Je dis une première approche car, comme souvent en programmation, il existe plusieurs façons de faire la même chose.

Nous allons commencer par tout mettre dans un fichier main.cpp, et nous ferons le tri après.

1
2
3
#include <iostream>

#define SIZE_PVECTOR_TAB 50

Dans ce qui suis, nous allons écrire des expressions templates pour permettre de faire des calculs avec la structure PVector

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
struct PVector{
	// Définition des types itérateurs
	typedef double* Iterator;
	typedef const double* ConstIterator;

	// Fonctions de récupération des itérateurs de début et de fin
	Iterator begin(){return p_elements;}
	Iterator end(){return p_elements + SIZE_PVECTOR_TAB;}
	ConstIterator begin()const{return p_elements;}
	ConstIterator end()const{return p_elements + SIZE_PVECTOR_TAB;}
	
	void setValue(double val){
		for(Iterator it = begin(); it != end(); ++it){
			*it = val;
		}
	}
	
	template<class T>
	const PVector& operator = (T expr);
	
	// Et enfin les données
	double p_elements[SIZE_PVECTOR_TAB];
};

//Surcharge de l'opérateur d'affectation =
template <class T>
const PVector& PVector::operator = (T expr){
	for(Iterator i = begin(); i != end(); ++i, ++expr){
		*i = *expr;
	}
	return *this;
}

Notez que l'opérateur = prend un type abstrait, que nous allons définir dans ce qui suit.

Nous allons d'abord définir les différents opérateurs dans un type énuméré :

1
2
3
4
5
6
7
8
9
10
//Nos opérateurs
enum Operators{
	Add,   // addition
	Sub,   // soustraction
	Mult,  // multiplication
	Div,   // division
	Plus,  // + unaire
	Minus, // - unaire
	Const  // Constante
};