Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les forums > Programmation > Langage C++ > Surcharge d'opérateur >> > Lecture du sujet

Surcharge d'opérateur >>

pour une structure

Vous devez être inscrit pour pouvoir poster des messages

RésoluLe problème de ce sujet a été résolu

Page : 1 
Auteur Message
1 visiteur sur ce sujet (1 anonyme)
Page : 1 
Hors ligne Zizi # Posté le 25/05/2008 à 00:52:34
Groupe : Membres
Bonsoir,

voilà mon problème : j'ai cette structure toute simple =>

struct Case {
int x;
int y;
};

J'aimerais créer une surcharge de l'opérateur >> pour pouvoir saisir toutes les composantes de ma structure d'un seul coup.
Je sais le faire avec une classe, mais je n'ai aucune idée de comment le réaliser pour une structure, et surtout si c'est possible ou si je vais devoir transformer ma structure en classe (ce n'est pas très compliqué vous me direz, mais pas forcément utile).

Merci d'avance
 
Hors ligne minirop # Posté le 25/05/2008 à 00:57:57
吸血鬼
Avatar
Modérateurs
structure et classe sont identiques hormis certains choses en rapport avec la visibilité par défaut (public ou private)

pas commencés - en cours - finis - (dernier tome lu)
manga : Love Hina - Ichigo 100% - Fruits Basket - School Rumble - Death Note - Parmi Eux - One Piece (46) - Naruto (45) - Lovely Complex (10) - Fullmetal Alchimist (22) -> My Manga
IDE multiplateforme pour Qt Image utilisateur !! Qt @ IRC --> #qt-fr@irc.freenode.net
 
Hors ligne Zizi # Posté le 25/05/2008 à 01:09:18
Groupe : Membres
J'ai créé un .h dans lequel se trouve ma structure.

J'ai rajouté ça derrière :

std::istream& operator >> (std::istream&, Case& c);

std::istream& operator >> (std::istream& in, Case& c) {
in>>c.x;
in>>c.y;

return in;
}

mais cela plante à la compilation.
Quel est le problème?
 
Hors ligne anonyme # Posté le 25/05/2008 à 01:16:03
Groupe :
Salut,

Quelle est l'erreur donnée par le compilateur ?
Hors ligne Zizi # Posté le 25/05/2008 à 01:27:52
Groupe : Membres
Alors je vais refaire ça plus proprement.
Voilà mon "Case.h"

Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#ifndef DEF_CASE
#define DEF_CASE

#include <iostream>

struct Case {
	int x;
	int y;
};

std::istream& operator >> (std::istream&, Case& c);

std::istream& operator >> (std::istream& in, Case& c) {
	in>>c.x;
	in>>c.y;

	return in;
}

#endif


Voici les erreurs que j'obtiens (je travaille avec Visual C++) :

Citation : A
Gameplay.obj : error LNK2005: "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,struct Case &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@
AAV01@AAUCase@@@Z) already defined in Bataille.obj
Humain.obj : error LNK2005: "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,struct Case &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AA
V01@AAUCase@@@Z) already defined in Bataille.obj
Joueur.obj : error LNK2005: "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,struct Case &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AA
V01@AAUCase@@@Z) already defined in Bataille.obj
Debug/Bataille.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.


Gampeplay, Humain et Joueur sont 3 classes différentes.
Sachant que si jamais j'enlève ma "surcharge", le programme compile et s'exécute comme il faut
 
Hors ligne lmghs # Posté le 25/05/2008 à 01:30:27
Groupe : Membres
Cette réponse a aidé l'auteur du sujet Cette réponse a aidé l'auteur du sujet
Tu as un problème de link (et non de compilation) parce que la définition de la fonction se trouve dans un .h et non inline.
Procède comme pour les autres fonctions, et cela ira mieux.

PS: le bon en-tête pour le .h, c'est <iosfwd>, et pour le .cpp : <istream>
 
Hors ligne Zizi # Posté le 25/05/2008 à 01:50:09
Groupe : Membres
Merci, voilà donc ce que j'ai fait :

mon .h
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#ifndef DEF_CASE
#define DEF_CASE

#include "stdafx.h"

#include <iosfwd>

struct Case {
	int x;
	int y;
};

std::istream& operator >> (std::istream&, Case& c);

#endif


mon .cpp
Code : C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include "stdafx.h"

#include <istream>

#include "Case.h"

using namespace std;

istream& operator >> (istream& in, Case& c) {
	in>>c.x;
	in>>c.y;

	return in;
}


Ca compile sans problème.

Bon je ne peux pas encore tester l'exécution car j'ai une error dans mon code mais il y a déjà une progression ^^.

Sinon, pourquoi le <iosfwd> pour le header et pas le <istream> ?
 
Hors ligne lmghs # Posté le 25/05/2008 à 03:08:29
Groupe : Membres
<iosfwd> ne fait que dire que les types std::istream et std::ostream existent (ce qui permet de les utiliser en pointeur ou référence), mais ni ce qu'ils sont, ni ce que l'ont peut en faire. D'où le besoin de la définition pour pouvoir se servir de l'extraction dans la fonction (-> >>)

<iostream> devrait charger implicitement <istream>, <ostream>, et surtout définit std::cout, clog, cerr, et cin.

Avec la séparation que je propose, les temps de compilations sont réduits là où l'on n'a pas besoin de s'encombrer des définitions des flux.

(Ceci dit, cas particulier (non standard) des en-tête précompilés (stdafx.h), si tu te sers des flux dans la majorité de tes fichiers, tu peux directement inclure <istream> et <ostream> depuis stdafx.h)
Édité le 25/05/2008 à 03:10:26 par lmghs
 
Hors ligne Zizi # Posté le 25/05/2008 à 04:36:38
Groupe : Membres
Merci beaucoup pour ton aide, ça marche parfaitement. Merci encore pour les explications également ^^.
 

Retour au forum "Langage C++" ou à la liste des forums

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 148 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0348s (0.0194s)