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

réutilisation d'une meme instance d'une classe - C++ - Programmation

Marsh Posté le 14-08-2013 à 19:27:57    

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
Reply

Marsh Posté le 14-08-2013 à 19:27:57   

Reply

Marsh Posté le 16-08-2013 à 14:33:07    

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
Reply

Marsh Posté le 16-08-2013 à 15:02:38    

@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
Reply

Marsh Posté le 17-08-2013 à 08:33:19    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed