Souci avec c++

Résolu/Fermé
caroline - 27 févr. 2010 à 15:57
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 1 mars 2010 à 21:21
Bonjour tout le monde,
je veux faire une fonction qui cherche un objet dans un vecteur de classe et le supprimer voila mon code :

void Delete(int P,int Q,vector<economie>&Slist)
{ vector<economie>::iterator vItr = Slist.begin();

while ( vItr != Slist.end() )
{if ( vItr->mFirst.cle == P && vItr->mSecond.cle == Q )
{vItr = Slist.erase( vItr );
break;
}

else vItr++;
}
}

je suis sur que cette partie de programme qui est à l'origine du problème:

lorsque j'exécute le programme j'ai ce message


error: a function-definition is not allowed here before '{' token
j'ai vérifié si 'il y a une accolade qui manque mais en vain je vois rien d'anormale svp si vous pouvez m,aider ca sera très apprécié.

8 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
28 févr. 2010 à 02:09
Il y a un problème d'accolades. Attention à indenter correctement. Je pense que le minimum c'est
- de revenir à la ligne après une {
- de revenir à la ligne devant et après une }, et aligner cette } avec le bloc qu'elle ferme.

Dans ton cas j'ai l'impression que la classe economie est une std::pair<int,int>, qui dispose de l'opérateur ==, donc autant en profiter.

Autre point important, est ce que ton vector peut contenir un objet economie identique en plusieurs exemplaire ? Si chaque élément est unique il serait plus judicieux d'utiliser directement un std::set<economie>.

Quelque soit le conteneur que tu utilises, il ne faut jamais oublier que modifier la structure (en particulier via une suppression) invalide les iterators que tu manipules.

Voici en résumé à quoi ton code pourrait ressembler si on reste sur des std::vector :

void delete(int p, int q, std::vector<economie> & v){
  do{ // <-- pour gérer s'il y a plusieurs exemplaires
    std::vector<economie>::iterator
      vit (v.begin()),
      vend(v.end());
    for(;vit != vend; ++vit){
      if(*vit == std::make_pair(p,q)){
        v.erase(vit);
        break;
      }
    }
  }while(vit != vend); // <-- pour gérer s'il y a plusieurs exemplaires
}


Si les éléments sont en un exemplaire, on peut utiliser plutôt un std::set ce qui évitera d'insérer des doublons de manière implicite). À voir aussi si tu n'as pas plutôt intérêt à utiliser une std::map si le premier membre du type économie est une clé, et le second membre une donnée associée à cette clé.

typedef std::pair<int,int> economie;

// appel delete2(s,std::make_pair(p,q));
void delete2(std::set<economie> & s, const economie & e){
  std::set<economie>::iterator sit (s.find(e));
  if(sit != send(s.end())) s.erase(sit);
}


Ou en version générique :

template <typename T>
void delete3(std::set<T> & s, const T & t){
  typename std::set<T>::iterator sit (s.find(t));
  if(sit != send(s.end())) s.erase(sit);
}


Bonne chance
0
Merci mamiemando pour ta réponse, j'ai corrigé l'erreur que j'ai fait qui consiste à écrire une fonction dans une fonction chose interdite en c++ mais le programme compile mais sans aucun effet comme si la fonction delete ne marche pas .
en fait ma classe economie contient deux contras et un double ( contrat c'est une classe que j'ai définit et chaque contrat a un clé unique donc il n'y a pas de doublons de contrat)
et j'ai un vecteur d'economie et je veux supprimer un élement de ce vecteur en connaissant les clés des deux contrats mais je n'y arrive pas ma fonction que j'ai fait n'a aucun effet.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
1 mars 2010 à 02:13
Peux-tu me donner la définition C++ des différentes structures (contrat, economie etc...) ?
0
voila les classses :
class Contrat {
public:
double mAbsco ,mOrdo,mAbscd ,mOrdd,mDemand,mTpservice;
int cle;
public:Contrat();
public:
Contrat (double x ,double y,double u,double v,double w, double z,int n):mAbsco(x),mOrdo(y),mAbscd(u),mOrdd(v),mDemand(w),mTpservice(z),cle(n){}
Contrat(const Contrat& inP ):mAbsco(inP.mAbsco),mOrdo(inP.mOrdo),mAbscd(inP.mAbscd),mOrdd(inP.mOrdd),mDemand(inP.mDemand),mTpservice(inP.mTpservice),cle(inP.cle){}
public: Contrat &operator=(const Contrat &Source)

{
mAbsco = Source.mAbsco;
mOrdo = Source.mOrdo;
mAbscd = Source.mAbscd;
mOrdd = Source.mOrdd;
mDemand= Source.mDemand;
mTpservice=Source.mTpservice;
cle =Source.cle;

return *this;
}

class economie {
public: Contrat mFirst , mSecond ;
double mSav;
public:
economie(const Contrat& inP , const Contrat& inQ, const double& meco): mFirst(inP), mSecond(inQ),mSav(meco){}
economie(const economie& Econ ):mFirst(Econ.mFirst),mSecond(Econ.mSecond),mSav(Econ.mSav){}

public: ~ economie() {};


mais il y a d'autres classes mais les classes qui interviennent dans cette fonction c'est la classe economie et la classe contrat
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci de ta réponse mais j'ai résolu mon problème c'était le test que je fais qui ne marche pas car je luis donne un P invalide comme delete(0,1) alors que P varie entre 1 et 3 c'est juste à cause de moi je voulais que les contrats ont une clé comme les vecteurs commencent à 0 mais j'ai oublié de lui mentionner ça en tout cas j'ai perdu 3 jours à m,arracher les cheveux mais c,est comme ça je vais progresser .
Merci pour tes conseils et bonne journée
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
1 mars 2010 à 19:33
Quelques remarques supplémentaires :

Pour le constructeur par copie de Contrat il ne devrait rien y avoir dans la paire d'accolade puisque les recopies sont déjà faites avec le ":mAbsco(inP.mAbsco),...". En aucun cas il n'y a un return *this dans un constructeur, puisqu'un constructeur ne retourne rien.

Il y a des problème également dans la classe economie au niveau des accolades (il manque l'accolade fermantde ~economie(){}).

Je t'invite également à choisir des noms de paramètres plus parlant et à te fixer des conventions de notations pour que tout ton code soit homogène.Typiquement ta classe economie devrait s'appeler Economie pour être cohérent avec le nom "Contrat" (seules les classes et les constantes commencent par une majuscules, les variables et les méthodes commencent en général par une minuscules).

Est ce qu'on peut considérer ton problème comme résolu ?
0
Bonjour,
Merci pour tes conseils. Mais dans le constructeur par copie il n' y a rien dans les accolades c'est vide.
par contre le pointeur this il est la pour la définition de l'affectation et non pas pour le constructeur par copie.
Pour les normes de programmation je dois les revoir car je commence à avoir des problèmes . Merci pour tes conseils précieux .on peut considérer que mon problème résolu.
bonne journée
caroline du canada.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
1 mars 2010 à 21:21
Padon c'est moi qui est mal lu, vu que le code est indenté bizarrement j'ai effectivement zappé une ligne. Je clos le sujet comme il est résolu ;-)
0