Bonjour Chers Zéros,
Je viens pour la première fois vous demander de l'aide en tant que "débutant" dans le C++.
J'ai cherché un peu mais je n'ai pas trouvé de topic parlant de ce sujet.
Je suis en train de créé un programme, un daemon(ou démon), sur lequel je ne vais pas tout vous expliquer/raconter car ce n'est pas le but de ce sujet.
Je vais plutot me fixer sur mon problème.
Il me faudrait pouvoir créé un nombre inconnu d'instances. En effet, je ne sais pas a la compilation combien d'instance mes classes devront gérer.
Il Faudrait que mon programme puisse en créé en cours d'execution. Je pense que c'est un problème courant mais je n'y ai pas trouvé de solution.
On m'a conseillé un tableau avec une fonction pour créer un nouveau joueur mais meme avec ca je n'ai pas su comment faire.
J'implore donc votre aide.
Demandez si mon message manque d'informations.
Plutôt que d'utiliser les tableaux dynamiques "faits à la main" comme dans le 1er exemple de Fvirtman, je propose d'utiliser les tableaux dynamiques de la librairie standard.
En particulier le template vector qui se prète bien à ce que tu veux faire.
#include <vector>
std::vector<monTypeDObjet> monTableau; //creation du tableau
monTableau.push_back(new monObjet); //Ajout d'un element au tableau
Pour ce qui est de monTableau et monObjet j'ai compris mais qu'est donc monTypeDOBJET?
Qu'est ce que cela représente? Désolé je ne suis pas un connaisseur des ecriture traditionnelle.
Nanoc, le code que tu as donnée en exemple me semble bizarre .
Déjà, tu déclares un vector de monTypeDObjet, puis tu remplis ce vector avec des monObjet*... Plutôt:
#include <vector>
std::vector<monType*> tab;
tab.push_back(new monType);
Si tu utilises les pointeurs comme cela, il faut aussi penser à libérer ce que tu as alloué:
for(std::vector<monType*>::iterator it = tab.begin() ; it != tab.end() ; it++)
Attention avec std::vector<truc>, des instances de truc seront recopiées lors de certains push_back, lorsque la fin de réserve sera atteinte, et qu'il faudra faire un réalloc.
- bien penser a avoir un constructeur par recopie fiable (sauf si toutes les données membres sont statiques, alors ça se fait tout seul)
- eviter de faire des vector de classes trop lourdes : la recopie peut etre couteuse.
je vais d'abord m'en tenir a une création suppression car je susi en train d'apprendre et ca va m'embrouiller...
Je ferais la réalloc apres.
En adaptant le code de Cyprien_ j'ai une erreur, l'ai je mal utilisé?
vector<Joueur> Tab; //creation du tableau
Tab.push_back(new Joueur); //Ajout d'un element au tableau
for(std::vector<Joueur*>::iterator it = Tab.begin() ; it != Tab.end() ; it++){
delete *it;
Tab.clear(); }
Le message d'erreur est :
/.../main.cpp:: In function «int main()":
/.../main.cpp:13: erreur: no matching function for call to «std::vector<Joueur, std::allocator<Joueur> >::push_back(Joueur*)"
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_vector.h:602: note: candidats sont: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Joueur, _Alloc = std::allocator<Joueur>]
/.../main.cpp:14: erreur: conversion from «__gnu_cxx::__normal_iterator<Joueur*, std::vector<Joueur, std::allocator<Joueur> > >" to non-scalar type «__gnu_cxx::__normal_iterator<Joueur**, std::vector<Joueur*, std::allocator<Joueur*> > >" requested
/.../main.cpp:14: erreur: no match for «operator!=" in «it != Tab. std::vector<_Tp, _Alloc>::end [with _Tp = Joueur, _Alloc = std::allocator<Joueur>]()"
:: === Build finished: 4 errors, 0 warnings ===
Pour informations, j'utilise Code:Blocks et je suis sous Kubuntu Feisty(Linux)
PS: J'ai supprimé l'arborescence dans les message d'erreur.
Tu as créé un vector de Joueur, alors que tu veux un vector de Joueur* (il manque une * quoi ).
Pour la réallocation dont parlait Fvirtman, tu n'as pas à t'en soucier, c'est la classe std::vector qui s'en occupe de façon transparente pour l'utilisateur .
EDIT: encore une chose, le Tab.clear() est fait en-dehors de la boucle for. Il sert en fait à effacer tous les éléments du tableau.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html