Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2667 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  réutilisation d'une meme instance d'une classe

 

Sujet(s) à lire :
    - Visual C++
 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

réutilisation d'une meme instance d'une classe

n°2200117
manel1989
Posté le 14-08-2013 à 19:27:57  profilanswer
 

Salut tout le monde !
 
j'aimerai bien faire une instance de ma classe connectedComponent cc , la utiliser dans une boucle , ajouter cette instance à un vecteur de type connectedComponent puis réutiliser cette même instance est ce que c'est faisable??? voici mon code :

Code :
  1. vector<ConnectedComponent*> cc_tab1 ;
  2.  while(!queue.empty())
  3.  {
  4.   marked=Breadth_First_Search(queue[0]);
  5.     ConnectedComponent *cc;
  6.     cc =new ConnectedComponent;
  7.   for(int i=0;i<marked.size();i++)
  8.   {
  9.    cout <<"manelll"<< endl;
  10.    if(marked[i]==true)
  11.    {
  12.     string f= m_vertices[i];
  13.     cout<<"m_nodes.push_back(f)" << endl;
  14.     cc->m_nodes.push_back(f);
  15.     cout<<"cc.m_nodes["<<i<<"]="<< cc->m_nodes[i]<< endl;
  16.     queue.erase( queue.begin());
  17.    }
  18.   }
  19.   cc_tab1.push_back(cc);
  20.   cout << "manouuuuuuuuuuuuuuuuuuuu"<< endl;
  21.   cc->m_nodes.clear();
  22.   delete cc;
  23.   k++;
  24.   cout << "k=" << k<< endl;
  25.  }

 
ça marche pour le première itération mais se bloque pour les autres je sais pas où se trouve mon erreur , c'est pour ça j'ai réfléchi à supprimer l'instance après chaque utilisation , mon erreur est le suivant :

Code :
  1. Expression : vector subscript out of range

 
 
je serai très reconnaissante si vous pouvez m'aider  
Merci énormément  


---------------
when there is a will there is a way
mood
Publicité
Posté le 14-08-2013 à 19:27:57  profilanswer
 

n°2200168
deidril
French Geek Society Member
Posté le 16-08-2013 à 14:33:07  profilanswer
 

Salut,
 
l'opérateur new crée un objet en mémoire. (ligne 7) et te retourne un pointeur
 
le fait de l'ajouter à ton tableau (ligne 21) ne va pas créer un second objet qui serait une copie du premier.
 
Donc ligne 23 et 24 lorsque tu nettoies puis supprimes ton objet cc, ton tableau cc_tab1 contiendra un pointeur vers un objet détruit.
Je ne suis pas sûr que ça soit la source de ton erreur, mais il est certain que cela n'aide pas.
 
Supprime les lignes 23 et 24 !
 
Tel que, il n'est pas possible de réutiliser la meme instance de 'cc' si tu as pour tableau un vector de pointeur '.vector<ConnectedComponent*> cc_tab1 '
 
Si ton tableau était un vector d'objet ( 'vector<ConnectedComponent> cc_tab1' ), tu pourrais les ajouter par copie et donc là, oui, réutiliser la même instance. Tu n'aurais d'ailleurs même pas besoin de créer et de supprimer ton objet. 'cc' pourrait être une simple variable locale.
 
 
Pour ce qui est de ton erreur dans un vecteur, il y a plusieurs possibilités. Celle qui me saute aux yeux est la suivante :
 

Code :
  1. if(marked[i]==true)
  2. 13.    {
  3. 14.     string f= m_vertices[i];
  4. 15.     cout<<"m_nodes.push_back(f)" << endl;
  5. 16.     cc->m_nodes.push_back(f);
  6. 17.     cout<<"cc.m_nodes["<<i<<"]="<< cc->m_nodes[i]<< endl;
  7. 18.     queue.erase( queue.begin());
  8. 19.    }


 
Si marked[i] vaut false, il n'y a pas d'ajout à ton tableau interne cc->m_nodes. Donc cc->m_nodes et marked n'ont plus la même taille dès lors que cela se produit une fois.
A partir de là, à la prochaine itération où marked[i] vaudra 'true', ton expression 'cc->m_nodes[i]' va provoquer un plantage puisque m_nodes et marked n'ont plus leurs éléments alignés suivant le même index. On aura même cc->m_nodes.size() < i. D'où effectivement une possible exception dans un vector.
 
Remplace la ligne 17 par  

Code :
  1. cout<<"cc.m_nodes["<<i<<"]="<< cc->m_nodes[cc->m_nodes.size()-1]<< endl;


Message édité par deidril le 16-08-2013 à 14:44:35

---------------
Ce qui ne nous tue pas nous donne des points d'expériences
n°2200173
manel1989
Posté le 16-08-2013 à 15:02:38  profilanswer
 

@deidril :Merci beaucoup pour ta précieuse réponse :)
 en faite j'ai résolue le problème en utilisant un code de type spaghetti je vais prendre ta réponse en considération.
je vais poster ma solution et espérant bien que vous me donnez votre point de vue :

Code :
  1. vector<ConnectedComponent> ConnectedComponentSearch::CC_calculation()
  2. {
  3. vector<bool> marked;
  4. vector<ConnectedComponent> cc_tab ;
  5. ConnectedComponent cc;
  6. vector<string> queue ;
  7. vector<string> cc_nodes ;//a vector that will have the node of a Connected Component , we will use it in the comparaison
  8. for(int i=0;i<m_vertices_number;i++)
  9.  {
  10.   queue.push_back(m_vertices[i]);
  11.   cout<<"queue["<<i<< "] =" <<queue[i]<<endl;
  12.  }
  13.  while(!queue.empty())
  14.  {
  15.   marked=Breadth_First_Search(queue[0]);
  16.   for(int i=0;i<marked.size();i++)
  17.   {
  18.    if (marked[i]==true)
  19.    {
  20.     string f= m_vertices[i];
  21.     cout<<"m_nodes.push_back(f)" << endl;
  22.     cc.m_nodes.push_back(f);
  23.     cout<<"cc.m_nodes["<<i<<"]="<< cc.m_nodes[i]<< endl;
  24.     queue.erase( queue.begin());
  25.    }
  26.   }
  27.   cc_tab.push_back(cc);
  28.   k++;
  29.  }
  30.  cout<<"******The connected components in the graph*********"<<endl;
  31.  for (int i=0; i<k;i++)
  32.  {
  33.   for(vector<ConnectedComponent>::size_type j = 0; j != cc_tab[i].m_nodes.size(); ++j)
  34.             {
  35.  
  36.   cout << cc_tab[i].m_nodes[j] << endl;
  37.         }
  38.  }
  39.  int m=0;
  40.  for (int l=0;l<k-1;l++)
  41.  {
  42.   for (int z=m; z<k-1;z++)
  43.   {
  44.   for(vector<ConnectedComponent>::size_type j = 0; j != cc_tab[m].m_nodes.size(); ++j)
  45.   {
  46.       string f= cc_tab[m].m_nodes[j];
  47.    if(search(cc_tab[z+1].m_nodes,f)==true)
  48.    {
  49.     cc_tab[z+1].m_nodes.erase(cc_tab[z+1].m_nodes.begin());
  50.       }
  51.   }
  52.   }
  53.   m++;
  54.  }
  55.  for (int l=0;l<k;l++)
  56.  {
  57.   for(vector<ConnectedComponent>::size_type j = 0; j != cc_tab[l].m_nodes.size(); ++j)
  58.   { 
  59.    cout << cc_tab[l].m_nodes[j] << endl;
  60.   }
  61.  }
  62.  for(int i=0;i<maxp.size();i++)
  63.   cout<<maxp.at(i)<<"__"<<endl;
  64.  return cc_tab;
  65. }


 
Merci beaucoup  
Bonne journée


---------------
when there is a will there is a way
n°2200210
Joel F
Real men use unique_ptr
Posté le 17-08-2013 à 08:33:19  profilanswer
 

si tu as besoin d'une queue, utilise std::queue qu lieu de faire nimp.
oh et Boost.Graph :o


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  réutilisation d'une meme instance d'une classe

 

Sujets relatifs
instancier une classe a patir d une chaineacceder à un vecteur dans autre classe en c++
Lier la sélection d'une liste dans une classe à une autre classe.Gestion des pointeurs sur instance
Mettre classe client et classe serveur dans un seul mainclasse generique et Type generique
Modifier de type d'un attribut dans la classe héritéeErreur d execution 432 nom du fichier ou de la classe introuvable lors
Passer un code flash sur une classe externe ASCopie d'une ArrayList d'une classe vers une autre
Plus de sujets relatifs à : réutilisation d'une meme instance d'une classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR