Comment créer des objects en les ajoutant dans un vecteur?

J’ai un vecteur C ++. Je veux que le vecteur contienne un nombre variable d’objects.

Visual Studio 2012 me donne une erreur:

Error: type name is not allowed 

De ce code C ++:

 #include  #include  using namespace std; class testObject{ private: int someInt; public: testObject(int a){ someInt=a; } void show() { cout<<someInt<<endl; } }; int main() { vector testVector; cout << "Initial size: " << testVector.size() <<endl; for ( int i = 0; i < 3; i++ ) testVector.push_back(testObject(3)); cout << "New size: " << testVector.size() << endl; for ( int j = 0; j < 3; j++ ) testVector[ j ].show(); system("pause"); } 

Mais voici un autre exemple de code qui semble identique mais qui ne fonctionne pas.

 void Dealer::setNumberOfPlayers( const int tNumber ) { for ( int i = 0; i < tNumber; i++ ) vectorOfGamers.push_back(Player); // Player is a class that I created } 

Puis-je créer un vecteur pour contenir des objects de Dealer, Bot et Player en même temps? Comment je fais ça? Comme je le sais, tous les objects en vecteur doivent être d’un seul type.

Pour répondre à la première partie de votre question, vous devez créer un object de type Player avant de pouvoir l’utiliser. Lorsque vous dites push_back(Player) , cela signifie “append la classe Player au vecteur”, et non “append un object de type Player au vecteur” (ce que vous vouliez dire).

Vous pouvez créer l’object sur la stack comme ceci:

 Player player; vectorOfGamers.push_back(player); // <-- name of variable, not type 

Ou vous pouvez même créer un object temporaire en ligne et le pousser (il est copié quand il est placé dans le vecteur):

 vectorOfGamers.push_back(Player()); // <-- parentheses create a "temporary" 

Pour répondre à la deuxième partie, vous pouvez créer un vecteur du type de base, ce qui vous permettra de repousser des objects de n'importe quel sous-type; Cependant, cela ne fonctionnera pas comme prévu:

 vector gamers; gamers.push_back(Dealer()); // Doesn't work properly! 

étant donné que lorsque l'object revendeur est placé dans le vecteur, il est copié en tant qu'object Gamer - cela signifie que seule la partie Gamer est copiée de manière à "découper" l'object. Vous pouvez utiliser des pointeurs, mais depuis lors, seul le pointeur sera copié et l'object n'est jamais découpé:

 vector gamers; gamers.push_back(new Dealer()); // <-- Allocate on heap with `new`, since we // want the object to persist while it's // pointed to 

Question 1:

  vectorOfGamers.push_back(Player) 

Cela pose problème car vous ne pouvez pas directement transférer un nom de classe dans un vecteur. Vous pouvez soit pousser un object de classe dans le vecteur, soit pousser une référence ou un pointeur vers un type de classe dans le vecteur. Par exemple:

 vectorOfGamers.push_back(Player(name, id)) //^^assuming name and id are parameters to the vector, call Player constructor //^^In other words, push `instance` of Player class into vector 

Question 2:

These 3 classes derives from Gamer. Can I create vector to hold objects of Dealer, Bot and Player at the same time? How do I do that?

Oui, vous pouvez. Vous pouvez créer un vecteur de pointeurs qui pointe vers la classe de base Gamer . Un bon choix consiste à utiliser un vecteur de smart_pointer . Par conséquent, vous n’avez pas besoin de gérer vous-même la mémoire du pointeur. Étant donné que les trois autres classes sont dérivées de Gamer , sur la base du polymorphism, vous pouvez affecter des objects de classe dérivés à des pointeurs de classe de base. Vous pouvez trouver plus d’informations à partir de ce post: std :: vector d’objects / pointeurs / pointeurs intelligents pour passer des objects (erreur de bus: 10)?

Vous ne pouvez pas insérer une classe dans un vecteur, vous pouvez toutefois insérer un object (à condition qu’il soit du type ou convertible approprié) d’une classe.

Si le type Player a un constructeur par défaut, vous pouvez créer un object temporaire en faisant Player() , et cela devrait fonctionner dans votre cas:

 vectorOfGamers.push_back(Player()); 
 // create a vector of unknown players. std::vector players; // resize said vector to only contain 6 players. players.resize(6); 

Les valeurs sont toujours initialisées, donc un vecteur de 6 joueurs est un vecteur de 6 objects de joueur valides.

En ce qui concerne la deuxième partie, vous devez utiliser des pointeurs. Instanciation de l’interface c ++ en tant que classe enfant