push_back(new maClasse) dans un vector de vector

push_back(new maClasse) dans un vector de vector - C++ - Programmation

Marsh Posté le 09-01-2010 à 23:39:34    

Hello
 
J'ai un soucis quand je veux remplir mon vector de vector avec des instances d'une classe.
 
Voici la déclaration:

Code :
  1. vector <vector<Pion>> tableau;


 
(Pion est une classe)
 
Et dans cette boucle je cherche à rajouter des instances de Pion dans tableau:
 

Code :
  1. for (int i=0; i<5; i++){
  2.  for (int j=0; j<5; j++){
  3.   this->tableau.push_back(new Pion); <- l'erreur est ici
  4.  }
  5. }


 
Le compilateur (Visual Studio 2008) me jette avec cette erreur:
[i]
\test.cpp(15) : error C2440: 'initialisation' : impossible de convertir de 'Pion *' en 'Pion'
1>        Aucun constructeur n'a pu prendre le type de source, ou la résolution de la surcharge du constructeur était ambiguë
 
Après plusieurs recherches je ne comprends toujours pas, la syntaxe push_back(new maClass) devrait marcher  :??:


Message édité par sue soeur debeat le 09-01-2010 à 23:39:58
Reply

Marsh Posté le 09-01-2010 à 23:39:34   

Reply

Marsh Posté le 10-01-2010 à 09:35:23    

[:joel f:1] non. On est pas en java.

 

Ton vector de pion il contient des pions, pas des pion*.
Le message est plus qu'explicite sur ce point.

 

ref: http://www.cplusplus.com/reference [...] push_back/

 

Autre chose, vector <vector<Pion>> tableau; n'est pas un vrai tableau 2D.
Il faut donc l'initialiser en 2 fois.
Donc:

 
Code :
  1. vector <vector<Pion>> tableau;
  2. for (int i=0; i<5; i++)
  3. {
  4.    // Ajout nouveau tableau de pion
  5.    vector<Pion> p;
  6.    for (int j=0; j<5; j++)
  7.      p.push_back(Pion());
  8.   tableau.push_back(p);
  9. }
 

Cependant, la tu fais trop de copie inutile.

 

Mieux:

Code :
  1. vector <vector<Pion>> tableau(5);
  2. for(std::size_t i=0;i<tableau.size();++i)
  3.   tableau[i].resize(5);
 


Ensuite vector n'est pas optimal pour les tableaux 2D.
Mieux vaut utiliser boost::multi_array ou un tableau NRC 2D façon Knuth.


Message édité par Joel F le 10-01-2010 à 10:04:32
Reply

Sujets relatifs:

Leave a Replay

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