Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 16/02/2013, 15h48   #1
guidono
Invité de passage
 
Inscription : octobre 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 31
Points : 2
Points : 2
Par défaut Surcharge de l'opérateur [] ("must be a nonstatic member function")

Bonjour,

J'ai plusieurs fois été confronté à ce problème que je n'arrive pas à résoudre..
Je tente de surcharger un opérateur mais j'ai l'erreur suivante :

erreur: ‘int operator[](LIST, int)’ must be a nonstatic member function

J'ai fait quelque recherches sur internet mais je ne comprend toujours pas cette erreur !

Voici mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
#ifndef DEF_LISTE
#define DEF_LISTE
 
struct element {
	int val;
	element *nxt;
};
typedef element * LIST;
 
void push_t(LIST &lst, const int val);
void push_b(LIST &lst, const int val);
 
void pop_t(LIST &lst);
void pop_b(LIST &lst);
 
int get_element(LIST lst, int indice);
int operator[](LIST lst, int indice);
 
void print_list(const LIST lst);
 
#endif
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
 
int get_element(LIST lst, int indice) {
 
	if(lst != NULL) {
 
		if(indice == 0) {
 
			return lst->val;
 
		} else {
 
			return get_element(lst->nxt, indice - 1);
 
		}
 
	} else {
 
		return -1;
 
	}
 
}
 
int operator[](LIST lst, int indice) {
	return get_element(lst, indice);
}
Merci d'avance et bonne journée !
guidono est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 16h05   #2
Ehonn
Membre expérimenté
 
Étudiant
Inscription : février 2012
Messages : 247
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2012
Messages : 247
Points : 503
Points : 503
Bonjour

Voici un exemple de la surcharge de l'opérateur [] dans la FAQ C++
http://cpp.developpez.com/faq/cpp/?p...HARGE_interdit

Un tel opérateur (ou une fonction telle que get_element) peut être critiquable pour une liste chaînée.
Si on utilise une liste chaînée, on veut les opérations suivantes :
- accès au premier élément
- accès au dernier élément
- insertion
- suppression
- parcours
Tout ça pour dire que, si tu veux pouvoir accéder directement à n'importe quel élément (souvent) il serait peut-être plus judicieux d'avoir un containeur comme std::vector

Pour ton problème en soit, il faut que l'opérateur [] soit déclaré dans la classe.
Je te conseille de lire le chapitre de la FAQ sur les classes en C++
http://cpp.developpez.com/faq/cpp/?page=classes
Selon ton niveau, un cours sur la programmation orientée objet serait peut être plus adpaté (?)

Sinon, en C++
Il suffit d'utiliser std::list
http://www.cplusplus.com/reference/list/list/
http://en.cppreference.com/w/cpp/container/list
Ehonn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 16h33   #3
guidono
Invité de passage
 
Inscription : octobre 2009
Messages : 31
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 31
Points : 2
Points : 2
Merci pour ta réponse !

Je pourrais en effet utiliser des classes, mais étant donné que c'est un projet pour l'iut et que nous n'avons pas commencer cette partie je vais attendre.

Ensuite je pourrais aussi utiliser des objets déjà fait mais.. j'aime faire les choses moi-même^^ (surtout que dans l'exercice demandé je pense que c'est préférable^^).

Je vais me renseigner un peu plus sur les surcharges,

merci encore et bonne journée !
guidono est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/02/2013, 17h08   #4
Ehonn
Membre expérimenté
 
Étudiant
Inscription : février 2012
Messages : 247
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2012
Messages : 247
Points : 503
Points : 503
Citation:
Envoyé par guidono Voir le message
Je pourrais en effet utiliser des classes, mais étant donné que c'est un projet pour l'iut et que nous n'avons pas commencer cette partie je vais attendre.
Normalement on ne devrait pas voir la surcharge d'opérateur avant class.
En C++, struct et class sont très proches. On peut voir struct comme une classe avec public comme visibilité par défaut.

Citation:
Envoyé par guidono Voir le message
Ensuite je pourrais aussi utiliser des objets déjà fait mais.. j'aime faire les choses moi-même^^ (surtout que dans l'exercice demandé je pense que c'est préférable^^).
std::vector et std::list sont dans la norme C++. Quand on en a besoin, il faut les utiliser pour faire du C++ (propre).
Dans ton cas, il y a une exception : la dimension pédagogique...

Bon développement
Ehonn est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h26.


 
 
 
 
Partenaires

Hébergement Web