C++ remplir un tableau d'objet
Bonjour,
mon programme compile mais a l'exécution il plante chaque fois qu'il essaie de mettre un objet dans le tableau voici mon code. C'est un petit jeu de dé... merci pour votre aide
#include <cstdlib>
#include "De.h"
#include "Joueur.h"
#include "sept.h"
using namespace std;
sept::sept(){
}
sept::sept(int i){
adr=new Joueur[nbrJoueur=i];
taille=0;
}
sept::~sept(){
delete adr;
}
sept::sept(sept & listeJoueur){
nbrJoueur=listeJoueur.nbrJoueur;
adr=new Joueur[nbrJoueur];
}
void sept::operator = (sept & septi){
sept s;
s=septi;
}
/*string * sept::getJoueur(int i){
string s =*(adr+i).getVal();
return s;
}*/
void sept::participant(Joueur &UnJoueur){
//tab[taille]=UnJoueur; ici ca BUGGGG
*(adr+taille)=UnJoueur;
cout << "jjjjjjj";
affiche();
//adr[taille]=UnJoueur;
++taille;
}
int sept::partie(){
De d;
d.lancer();
int score=d.getVal();
return score;
}
void sept::affiche(){
for(int i=0;i<taille;i++){
cout <<"00000000" <<adr[i].getVal();
}
}
*****************************MAIN*************************************
#include<iostream>
#include "sept.h"
using namespace std;
static int NBR=7;
Joueur inscrireJoueur(){
string nomJoueur;
cout << "Quel est le nom du jour ?";
cin >> nomJoueur;
Joueur unJoueur = Joueur::Joueur(nomJoueur);
return unJoueur;
}
void main()
{
int nbrJoueur,de;
string nom;
cout << "quel est le nombre de joueur ?"<< endl;
cin >> nbrJoueur;
sept s=sept::sept(nbrJoueur);
for (int i=0;i<nbrJoueur;++i) {
Joueur j=inscrireJoueur();
s.participant(j);
}
do
{
for(int i=0;i<nbrJoueur;i++){
// nom=s.getJoueur(i);
de=s.partie();
cout << nom<<" a fait comme score: " << de<< endl;
}
}
while ((de!=NBR));
}
mon programme compile mais a l'exécution il plante chaque fois qu'il essaie de mettre un objet dans le tableau voici mon code. C'est un petit jeu de dé... merci pour votre aide
#include <cstdlib>
#include "De.h"
#include "Joueur.h"
#include "sept.h"
using namespace std;
sept::sept(){
}
sept::sept(int i){
adr=new Joueur[nbrJoueur=i];
taille=0;
}
sept::~sept(){
delete adr;
}
sept::sept(sept & listeJoueur){
nbrJoueur=listeJoueur.nbrJoueur;
adr=new Joueur[nbrJoueur];
}
void sept::operator = (sept & septi){
sept s;
s=septi;
}
/*string * sept::getJoueur(int i){
string s =*(adr+i).getVal();
return s;
}*/
void sept::participant(Joueur &UnJoueur){
//tab[taille]=UnJoueur; ici ca BUGGGG
*(adr+taille)=UnJoueur;
cout << "jjjjjjj";
affiche();
//adr[taille]=UnJoueur;
++taille;
}
int sept::partie(){
De d;
d.lancer();
int score=d.getVal();
return score;
}
void sept::affiche(){
for(int i=0;i<taille;i++){
cout <<"00000000" <<adr[i].getVal();
}
}
*****************************MAIN*************************************
#include<iostream>
#include "sept.h"
using namespace std;
static int NBR=7;
Joueur inscrireJoueur(){
string nomJoueur;
cout << "Quel est le nom du jour ?";
cin >> nomJoueur;
Joueur unJoueur = Joueur::Joueur(nomJoueur);
return unJoueur;
}
void main()
{
int nbrJoueur,de;
string nom;
cout << "quel est le nombre de joueur ?"<< endl;
cin >> nbrJoueur;
sept s=sept::sept(nbrJoueur);
for (int i=0;i<nbrJoueur;++i) {
Joueur j=inscrireJoueur();
s.participant(j);
}
do
{
for(int i=0;i<nbrJoueur;i++){
// nom=s.getJoueur(i);
de=s.partie();
cout << nom<<" a fait comme score: " << de<< endl;
}
}
while ((de!=NBR));
}
A voir également:
- C++ remplir un tableau d'objet
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Organigramme a remplir word - Guide
- Imprimer un tableau excel - Guide
7 réponses
Le truc c'est que là on a qu'une partie du code il manque "De.h", "Joueur.h", "sept.h". Quelques recommandations de programmation :
1) nommer les fichiers c++ uniquement en minuscules avec l'extension hpp (par exemple de.hpp) pour les différencier des headcers en C,
2) main est sensé retourner un int (code d'exécution, 0 si tout va bien)
3) le "using namespace std;" ne devrait être utilisé en toute rigueur que dans les fichiers sources (.cpp).pour ne pas risquer de se propager dans des fichiers qui ont besoin d'isoler le namespace std.
Pour écrire dans :
... il faut que tab soit au moins de taille "taille + 1", ainsi la case tab[taille] est allouée et peut être modifiée. Malheureusement comme il manque le header on ne sait pas de quel type est tab (si c'est un std::vector tu peux utiliser la méthode resize(), si c'est un tableau il faut l'allouer (par exemple avec un new dans le constructeur et le désallouer avec delete dans le destructeur).
Bonne chance
1) nommer les fichiers c++ uniquement en minuscules avec l'extension hpp (par exemple de.hpp) pour les différencier des headcers en C,
2) main est sensé retourner un int (code d'exécution, 0 si tout va bien)
3) le "using namespace std;" ne devrait être utilisé en toute rigueur que dans les fichiers sources (.cpp).pour ne pas risquer de se propager dans des fichiers qui ont besoin d'isoler le namespace std.
Pour écrire dans :
//tab[taille]=UnJoueur; ici ca BUGGGG
... il faut que tab soit au moins de taille "taille + 1", ainsi la case tab[taille] est allouée et peut être modifiée. Malheureusement comme il manque le header on ne sait pas de quel type est tab (si c'est un std::vector tu peux utiliser la méthode resize(), si c'est un tableau il faut l'allouer (par exemple avec un new dans le constructeur et le désallouer avec delete dans le destructeur).
Bonne chance
Tab contient des objets de types Joueur, j'ai essaye d'enlever le using namespace std dans les .h mais ca m'affichaient des erreurs...
Voici la suite manquante
************************sept.h******************************
#ifndef __sept_INCLUS__
#define __sept_INCLUS__
#include <iostream>
#include "Joueur.h"
#include <string>
using namespace std ;
class sept {
Joueur *adr;
int nbrJoueur,taille;
//Joueur tab[10];
public:
sept();
sept(int);
~sept();
sept(sept &);
void operator = (sept &);
string getJoueur(int);
void participant(Joueur &);
int partie();
void affiche();
};
************************De.h*************************
#endif
#ifndef __DE_INCLUS__
#define __DE_INCLUS__
/*
Dans le fichier du jeu incluant des dés
#include <ctime>
dans le constructeur du jeu
srand(time(NULL));
*/
class De
{
int valeur;
public:
De();
~De();
De(De &);
void operator = (De &);
int getVal();
int lancer();
};
#endif //__DE_IN
*******************************De.cpp*******************
#include <cstdlib>
#include "De.h"
De::De()
{
lancer();
}
De::~De()
{
}
De::De(De & d)
{
valeur = d.valeur;
}
void De::operator = (De & de){
De des;
des= de;
}
int De::getVal()
{
return valeur;
}
int De::lancer()
{
return valeur = 1 + (rand() % 6);
}
**************************Joueur.h**************************************
#ifndef __Joueur_INCLUS__
#define __Joueur_INCLUS__
#include <string>
using namespace std;
class Joueur
{
string nomJoueur;
public:
Joueur();
Joueur(string);
~Joueur();
Joueur(Joueur &);
void operator =(Joueur &);
string getVal();
};
#endif
*********************Joueur.cpp************************
#include <cstdlib>
#include "Joueur.h"
using namespace std;
Joueur::Joueur(){
}
Joueur::Joueur(string joueur){
nomJoueur=joueur;
}
Joueur::~Joueur(){
}
Joueur::Joueur(Joueur & player){
nomJoueur = player.nomJoueur;
}
void Joueur::operator = (Joueur & player){
Joueur joueur;
joueur=player;
}
string Joueur::getVal(){
return nomJoueur;
}
************************sept.h******************************
#ifndef __sept_INCLUS__
#define __sept_INCLUS__
#include <iostream>
#include "Joueur.h"
#include <string>
using namespace std ;
class sept {
Joueur *adr;
int nbrJoueur,taille;
//Joueur tab[10];
public:
sept();
sept(int);
~sept();
sept(sept &);
void operator = (sept &);
string getJoueur(int);
void participant(Joueur &);
int partie();
void affiche();
};
************************De.h*************************
#endif
#ifndef __DE_INCLUS__
#define __DE_INCLUS__
/*
Dans le fichier du jeu incluant des dés
#include <ctime>
dans le constructeur du jeu
srand(time(NULL));
*/
class De
{
int valeur;
public:
De();
~De();
De(De &);
void operator = (De &);
int getVal();
int lancer();
};
#endif //__DE_IN
*******************************De.cpp*******************
#include <cstdlib>
#include "De.h"
De::De()
{
lancer();
}
De::~De()
{
}
De::De(De & d)
{
valeur = d.valeur;
}
void De::operator = (De & de){
De des;
des= de;
}
int De::getVal()
{
return valeur;
}
int De::lancer()
{
return valeur = 1 + (rand() % 6);
}
**************************Joueur.h**************************************
#ifndef __Joueur_INCLUS__
#define __Joueur_INCLUS__
#include <string>
using namespace std;
class Joueur
{
string nomJoueur;
public:
Joueur();
Joueur(string);
~Joueur();
Joueur(Joueur &);
void operator =(Joueur &);
string getVal();
};
#endif
*********************Joueur.cpp************************
#include <cstdlib>
#include "Joueur.h"
using namespace std;
Joueur::Joueur(){
}
Joueur::Joueur(string joueur){
nomJoueur=joueur;
}
Joueur::~Joueur(){
}
Joueur::Joueur(Joueur & player){
nomJoueur = player.nomJoueur;
}
void Joueur::operator = (Joueur & player){
Joueur joueur;
joueur=player;
}
string Joueur::getVal(){
return nomJoueur;
}
mais j'emplois adr comme tableau d'objet Joueur, je viens d'essayer avec une taille+1 mais ca plante toujours...
Arf je m'arrache les cheveux.
Arf je m'arrache les cheveux.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai change le main mais ca plante tjrs .... :(
sept * s;
int nbrJoueur,de;
string nom;
cout << "quel est le nombre de joueur ?"<< endl;
cin >> nbrJoueur;
//sept s=sept::sept(nbrJoueur);
//sept s(nbrJoueur);
s= new sept(nbrJoueur);
for (int i=0;i<nbrJoueur;++i) {
Joueur j=inscrireJoueur();
s[i].participant(j);
}
do
{
sept * s;
int nbrJoueur,de;
string nom;
cout << "quel est le nombre de joueur ?"<< endl;
cin >> nbrJoueur;
//sept s=sept::sept(nbrJoueur);
//sept s(nbrJoueur);
s= new sept(nbrJoueur);
for (int i=0;i<nbrJoueur;++i) {
Joueur j=inscrireJoueur();
s[i].participant(j);
}
do
{
Peux tu mettre une archive de ton code sur cjoint (avec un makefile pour compiler) et me donner l'adresse.
https://www.cjoint.com/
Bonne chance
https://www.cjoint.com/
Bonne chance