CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] allocation dynamique d'une class

solid-snake-84
solid-snake-84
Niveau 8
10 janvier 2012 à 16:19:13

Bonjour à tous,

alors voilà j'ai un problème avec mon programme.

----------------- Intro : -------------------

En quelque ligne c'est un programme qui comprend deux calss :
-mot
-dico

La class mot permet d'entrer un mot ainsi que des synonymes ainsi qu'une description :

class mot
{
private:
char *tab;
int nb_syn;
int nb_max_syn;
char **tab_syn;
char *expl;
public:
mot(int, char*);
mot();
~mot();
void ajoute_syn(char*);
void affiche();
void saisit();
};

La class dico, permet d'entrer un mot (issu de la class mot) pour faire tout simplement un dictionnaire :

class dico
{
private:
mot *tab;
int taille;
int nb_mots;
public:
dico(int);
~dico();
void ajoute(mot&);
};

------------------- Problème : -------------------

Le problème ce situe en faite dans le constructeur de la class dico, j'ai fait :

dico::dico(int n)
{
taille = n;
nb_mots = 0;
if(taille > 0)
{
tab = new mot[taille];
}
}

NB : n étant le nombre de mot max.
Et la le compilateur me dit qu'il y a un problème sur :
tab = new mot[taille];

Il dit :

dictionnaire.cpp||In constructor `dico::dico(int)':error: no matching function for call to `mot::mot()'
mot.h|5|note: candidates are: mot::mot(const mot&)|
mot.h|13|note: mot::mot(int, char*)|

||=== Build finished: 1 errors, 0 warnings ===|

Je pense que l'erreur est en faite que le constructeur de la class mot doit contenir un int ainsi qu'un char :
mot(int, char*);

Or quand je fais : tab = new mot[taille];
ça doit coincer.

J'ai essayé de résoudre le problème en ajoutant un constructeur : mot::mot() {}; sauf que là bien entendu ça marche mais le programme finit par buguer (logique car il manque des données lors que je crée le mot).

Pouvez vous m'aider ? Comment créer cette allocation dynamique pour le dico ?

Bien cordialement.

godrik
godrik
Niveau 30
10 janvier 2012 à 16:23:12

Lorsque tu alloue un tableau dynamiquement en C++, les objets a l'interieur sont construit avec le default constructeur, ici c'est "mot::mot()".

Il y a trois solutions pour resoudre ce probleme. Les deux solutions les plus simple sont:
-allouer un tableau de pointeur sur des mots de facon a pouvoir utiliser le constructeur que tu veux.
-allouer le tableau avec le constructeur par defaut et faire un appel de fonction sur chaque mot pour lui donner l'etat qui va bien.

solid-snake-84
solid-snake-84
Niveau 8
10 janvier 2012 à 18:40:21

Bonsoir, je viens de rentrer de cours.

Tout d'abord merci pour la réponse.
Par contre pour la résolution je sais pas si j'ai bien compris.
Il faut faire par exemple un tableau contenant des pointeur sur mot donc ceci :
mot **tab;

et donc dans la fonction ça donne :
void dico::ajoute(mot &m)
{
if(taille > nb_mots)
{
tab[nb_mots] = &m;
nb_mots++;
}
}

C'est bien ça ?
Parce que je ne comprend pas bien le principe.

Merci.

LGV
LGV
Niveau 28
11 janvier 2012 à 13:33:38

Si ca te pose un soucis, la 2eme solution proposee par Godrik est facile a mettre en place.

Au lieu d'avoir un constructor Mot(int, char *); , tu vas avoir un default constructor Mot(); et une methode void Init(int, char *);

ca te permet de 1. faire un new pour ton tableau de mots, 2. iterer sur le tableau et initialiser les objets avec l'Init

C'est propre, et facile a lire.

/!\ ce qui est suit est a reserver a ceux qui maitrisent deja un peu le langage /!\

La creation de tableau d'objets n'ayant de default constructor revient souvent.

Je le mets pour les curieux, mais je deconseille de l'utiliser SI on peut faire autrement (quand on ne peut pas parce qu'on utilise une lib externe, par exemple)

La "bonne" facon de proceder est de dissocier l'operation de "new" en une phase d'allocation de memoire et une phase de construction en place des objets ; et cela se fait via un "placement new".

On se retrouve avec la syntaxe suivante :

http://pastebin.com/Ew6bkFh9

Bon c'est deja des astuces et des mechanismes avances, et si on peut passer par une methode Init() c'est bcp plus facile. Pour les curieux donc...

Paulop
Paulop
Niveau 12
11 janvier 2012 à 13:39:43

Attention par contre que ta méthode init ne soit pas virtuelle, sinon tu devras obligatoirement utiliser la première méthode.

solid-snake-84
solid-snake-84
Niveau 8
11 janvier 2012 à 14:05:45

D'accord merci bien, j'ai utilisé la méthode avec le init. qui est la plus simple.
Mon programme marche bien maintenant.

Passez une bonne journée, encore merci.

godrik
godrik
Niveau 30
11 janvier 2012 à 18:30:48

LGV, c'est pour ca que je disais: "Il y a trois solutions pour resoudre ce probleme. Les deux solutions les plus simple sont". La troisieme etait placement new. Et c'est une vrai saloperie, donc j'ai prefere ne pas en parle.

En vrai, il y a une quatrieme solution qui consiste a utiliser une structure de donne qui resoud les problemes pour toi comme vector.

LGV
LGV
Niveau 28
12 janvier 2012 à 11:31:22

tout a fait ! Apres, c'est interessant de savoir que cela existe ; la connaissance des outils conceptuels permettent de faire le choix le plus judicieux lorsqu'une situation se presente ; maintenant en pratique, ca ne sert pas souvent...

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment