Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de compilation C++

Sujet résolu
28 mai 2020 à 11:59:00

bonjour je travail sur un projet de RPG avec mon cousin et je souhaiterai avoir de l'aide car en voulant tester mon code le compilateur m'a "vomis" un bon gros paquet d'erreus  :

classe.hpp:23:11: error: expected unqualified-id before ‘[’ token
     string[] classes = {"Archer", "Guerrier", "Mage"};
           ^
main.cpp: In function ‘int main()’:
main.cpp:6:17: error: conversion from ‘character*’ to non-scalar type ‘character’ requested
  character c1 = new character()
                 ^~~~~~~~~~~~~~~
In file included from character.hpp:10,
                 from character.cpp:8:
classe.hpp:23:11: error: expected unqualified-id before ‘[’ token
     string[] classes = {"Archer", "Guerrier", "Mage"};
           ^
character.cpp:12:11: error: expected unqualified-id before ‘)’ token
 character() {
           ^
In file included from classe.cpp:8:
classe.hpp:23:11: error: expected unqualified-id before ‘[’ token
     string[] classes = {"Archer", "Guerrier", "Mage"};
           ^
classe.cpp: In constructor ‘classe::classe()’:
classe.cpp:24:29: error: ‘class classe’ has no member named ‘classes’; did you mean ‘classe’?
     this->className = this->classes[classN];
                             ^~~~~~~
                             classe
classe.cpp: At global scope:
classe.cpp:44:28: error: ISO C++ forbids declaration of ‘afficherPersonnage’ with no type [-fpermissive]
 classe::afficherPersonnage() {
                            ^
classe.cpp:44:1: error: no declaration matches ‘int classe::afficherPersonnage()’
 classe::afficherPersonnage() {
 ^~~~~~

 j'utilise cette commande de compilation : g++ -o main main.cpp character.cpp classe.cpp
 et voila le contenu de mais fichiers :

main.cpp

#include <iostream>
#include "character.hpp"
using namespace std;

int main() {
	character c1 = new character()

    return 0;
}

character.hpp :

/*_______________________________________________*
||					                        	||
||		   [FILENAME]	                		||
||		   Created by	                		||
||		    Strong21	                		||
||                   		            		||
*_______________________________________________*/
#ifndef CHARACTER_HPP
#define CHARACTER_HPP
#include "classe.hpp"
#include <iostream>
using namespace std;


class character
{
    public:
        character();

    private:
        classe c;

};

#endif // CHARACTER_HPP

character.cpp :

/*_______________________________________________*
||					                        	||
||		   [FILENAME]		                	||
||		   Created by		                	||
||		    Strong21			                ||
||                   			            	||
*_______________________________________________*/
#include "character.hpp"
#include <iostream>
using namespace std;

character() {
    this->c = new classe();
}

classe.cpp :

/*_______________________________________________*
||						||
||		   [FILENAME]			||
||		   Created by			||
||		    Strong21			||
||                   				||
*_______________________________________________*/
#include "classe.hpp"
#include <string>
//#include "Arme.hpp"
#include <iostream>
using namespace std;

classe::classe()
{
    cout << "bonjour jeune aventurier, quel est ton nom : ";
    cin >> this->Name;
    cout << endl;
    this->lvl = 1;
    this->exp = 0.0f;
    int classN;
    cout << "quel est votre classe : \n1) Archer\n2) Guerrier\n3) Mage\n: ";
    cin >> classN;
    this->className = this->classes[classN];
    if(className == "Archer") {
        this->life = 100;
        this->force = 8;
        this->resistance = 3;
        //this->Weap = new Arme("arc", 10, 8);
    } else if(className == "Guerrier") {
        this->life = 100;
        this->force = 10;
        this->resistance = 4;
        //this->Weap = new Arme("epee", 0, 10);
    } else if(className == "Mage") {
        this->life = 100;
        this->force = 3;
        this->resistance = 1;
        //this->Weap = new Arme("sceptre", 250, 0);
    }
    this->afficherPersonnage();
}

classe::afficherPersonnage() {
  cout << "FICHE DE PERSONNAGE : \nNom : " << this->Name << "\nclasse : " << this->className << "\n\tniveau : " << this->lvl << "\n\texperience : " << this->exp << " / " << this->expavlvl << "\n\tvie : " << this->life << " points de vies" << "\n\tforce : " << this->force << "\n\tresistance : " << this->resistance/* << "\nArme : " << this->Weap.afficherArme*/ << "------------------------------------------" << endl;
}

classe.hpp :

/*_______________________________________________*
||						||
||		   [FILENAME]			||
||		   Created by			||
||		    Strong21			||
||                   				||
*_______________________________________________*/
#ifndef CLASSE_HPP
#define CLASSE_HPP
#include <string>
#include <iostream>
using namespace std;
//#include "Arme.hpp"


class classe
{
    public:
    classe();
    void afficherPersonnage();

    private:
    string[] classes = {"Archer", "Guerrier", "Mage"};
    const float expavlvl = 12.0f;
    string Name;
    int lvl;
    float exp;
    string className;
    //Arme Weap;
    int life;
    int force;
    int resistance;
};

#endif // CLASSE_HPP

je'espère que vous pourrez m'aider

merci d'avance





  • Partager sur Facebook
  • Partager sur Twitter
28 mai 2020 à 12:46:23

Salut,

Le using namespace n'a pas sa place dans les fichiers .hpp, il faut toujours spécifier le namespace dans ces derniers.

Il faudra donc rajouter std:: devant tous les éléments utilisant ce namespace

Et puis, je te soupçonne d'avoir fait du Java auparavant :p

character c1 = new character(); // Faux : renvoie un pointeur
character c1; // Bonne déclaration
/* Pour passer des arguments au constructeur : */
character c1(arg0, arg1);

le mot-clé new renvoie un pointeur, attention

-
Edité par 23antoine03 28 mai 2020 à 12:52:55

  • Partager sur Facebook
  • Partager sur Twitter

Vous ne pouvez pas comprendre la récursivité sans d’abord avoir compris la récursivité 

28 mai 2020 à 13:24:55

Salut,

Et si tu commençait par indiquer la taille de tes tableaux ?

  • Partager sur Facebook
  • Partager sur Twitter
28 mai 2020 à 13:44:31

Salut,

Deedolith a écrit:

Salut,

Et si tu commençait par indiquer la taille de tes tableaux ?


Et, surtout, si tu commençais déjà par utiliser les classes qui sont prévues pour pour les tableaux:

  • std::array, si tu sais, au moment d'écrire le code, le nombre d'éléments que le tableau doit contenir, et qu'il ne changera plus
  • std::vector, si le nombre d'éléments qu'il doit contenir peut varier au fur et à  mesure de l'exécution du programme

Tu verras, ca change la vie :D

  • Partager sur Facebook
  • Partager sur Twitter
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
28 mai 2020 à 13:46:39

Salut,

La notation

string[] classes = {"Archer", "Guerrier", "Mage"};

ressemble aussi beaucoup à du Java, en C++ ça s'écrit à la rigueur :

std::string classes[] = {"Archer", "Guerrier", "Mage"};

mais, un tableau en C++ depuis 2011 c'est plutôt std::array<> :

using namespace std::literals;
auto classes = std::array{ "Archer"s, "Guerrier"s, "Mage"s };           // nécessite C++17

auto classes = std::array<std::string,3>{"Archer", "Guerrier", "Mage"}; // notation à partir du C++11
  • Partager sur Facebook
  • Partager sur Twitter

En recherche d'emploi.

28 mai 2020 à 14:09:43

Salut ! La meilleure idée serait simplement d'apprendre le C++, et de la programmation en général... Parce que le Java++ n'existe pas encore (quoi que le C# existe !). On n'improvise pas la programmation d'un RPG en C++ sans connaître le base de la base et en appelant une classe "classe"...

Il n'y a rien de réducteur dans le fait de commencer par un snake, une liste chainée ou le jeu du pendu, on est tous passés par là. Bref... perso j'ai pas appris à faire du vélo et dévalant les montagnes des compétitions redbull, j'ai pas appris la MMA en m'inscrivant à l'UFC, après c'est ma vision des choses, tu peux très bien évoluer dans le langage de cette façon... mais tu commenceras la notion de pointeur, dans 10 ans, quand tu auras compris qu'un tableau en C++ c'est pas un tableau en C#/Java.

-
Edité par Daimyo_ 28 mai 2020 à 14:12:59

  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2020 à 10:47:02

bonjour je n'ais jamais fait de java et j'ai toujours écrits mes header c++ de la même façon (qui fonctionnais très bien) c'est pour cela que je demande une aide donc je ne connais pas la syntaxe java et apprès modification cette erreur arrive :

character.cpp: In constructor ‘character::character()’:
character.cpp:13:26: error: no match for ‘operator=’ (operand types are ‘classe’ and ‘classe*’)
     this->c = new classe();
                          ^
In file included from character.hpp:10,
                 from character.cpp:8:
classe.hpp:17:7: note: candidate: ‘classe& classe::operator=(const classe&)’ <deleted>
 class classe
       ^~~~~~
classe.hpp:17:7: note:   no known conversion for argument 1 from ‘classe*’ to ‘const classe&’
classe.hpp:17:7: note: candidate: ‘classe& classe::operator=(classe&&)’ <deleted>
classe.hpp:17:7: note:   no known conversion for argument 1 from ‘classe*’ to ‘classe&&’

main.cpp :

#include <iostream>
#include "character.hpp"
using namespace std;

int main() {
	character c1;

    return 0;
}

character.cpp :

/*_______________________________________________*
||					                        	||
||		   [FILENAME]		                	||
||		   Created by		                	||
||		    Strong21			                ||
||                   			            	||
*_______________________________________________*/
#include "character.hpp"
#include <iostream>
using namespace std;

character::character() {
    this->c = new classe();
}

character.hpp :

/*_______________________________________________*
||					                        	||
||		   [FILENAME]	                		||
||		   Created by	                		||
||		    Strong21	                		||
||                   		            		||
*_______________________________________________*/
#ifndef CHARACTER_HPP
#define CHARACTER_HPP
#include "classe.hpp"
#include <iostream>
using namespace std;


class character
{
    public:
        character();

    private:
        classe c;

};

#endif // CHARACTER_HPP

classe.cpp :

/*_______________________________________________*
||						||
||		   [FILENAME]			||
||		   Created by			||
||		    Strong21			||
||                   				||
*_______________________________________________*/
#include "classe.hpp"
#include <string>
//#include "Arme.hpp"
#include <array>
#include <iostream>
using namespace std;

classe::classe()
{
    cout << "bonjour jeune aventurier, quel est ton nom : ";
    cin >> this->Name;
    cout << endl;
    this->lvl = 1;
    this->exp = 0.0f;
    int classN;
    cout << "quel est votre classe : \n1) Archer\n2) Guerrier\n3) Mage\n: ";
    cin >> classN;
    this->className = this->classes[classN];
    if(className == "Archer") {
        this->life = 100;
        this->force = 8;
        this->resistance = 3;
        //this->Weap = new Arme("arc", 10, 8);
    } else if(className == "Guerrier") {
        this->life = 100;
        this->force = 10;
        this->resistance = 4;
        //this->Weap = new Arme("epee", 0, 10);
    } else if(className == "Mage") {
        this->life = 100;
        this->force = 3;
        this->resistance = 1;
        //this->Weap = new Arme("sceptre", 250, 0);
    }
    this->afficherPersonnage();
}

void classe::afficherPersonnage() {
  cout << "FICHE DE PERSONNAGE : \nNom : " << this->Name << "\nclasse : " << this->className << "\n\tniveau : " << this->lvl << "\n\texperience : " << this->exp << " / " << this->expavlvl << "\n\tvie : " << this->life << " points de vies" << "\n\tforce : " << this->force << "\n\tresistance : " << this->resistance/* << "\nArme : " << this->Weap.afficherArme*/ << "------------------------------------------" << endl;
}

classe.hpp :

/*_______________________________________________*
||						||
||		   [FILENAME]			||
||		   Created by			||
||		    Strong21			||
||                   				||
*_______________________________________________*/
#include <array>
#ifndef CLASSE_HPP
#define CLASSE_HPP
#include <string>
#include <iostream>
using namespace std;
//#include "Arme.hpp"


class classe
{
    public:
    classe();
    void afficherPersonnage();

    private:
    std::array<string, 3> classes = {"Archer", "Guerrier", "Mage"};
    const float expavlvl = 12.0f;
    string Name;
    int lvl;
    float exp;
    string className;
    //Arme Weap;
    int life;
    int force;
    int resistance;
};

#endif // CLASSE_HPP

merci





-
Edité par TidianDelage1 29 mai 2020 à 11:01:17

  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2020 à 11:37:13

Salut ! Tu n'es pas en C# ! on ne construit pas un objet de cette façon en C++ (à part si pointé).

Object mon_objet = new Object();
// Ca c'est du C# !

Object mon_objet;
// Ca c'est du C++ !
  • Partager sur Facebook
  • Partager sur Twitter
29 mai 2020 à 11:42:47

TidianDelage1 a écrit:

bonjour je n'ais jamais fait de java et j'ai toujours écrits mes header c++ de la même façon (qui fonctionnais très bien) c'est pour cela que je demande une aide donc je ne connais pas la syntaxe java et apprès modification cette erreur arrive 

Tes header fonctionnait très bien, tant mieux! Mais ton code relève d'importants problèmes de lignes qui semblent venu d'un autre langage. D'où nos réponses ...

         Daimyo_ a écrit:

Salut ! La meilleure idée serait simplement d'apprendre le C++, et de la programmation en général... Parce que le Java++ n'existe pas encore (quoi que le C# existe !). On n'improvise pas la programmation d'un RPG en C++ sans connaître le base de la base et en appelant une classe "classe"...

Depuis ton cette remarque de Daimyo_ tu fournis au nouveau code. La ligne où se produit le problème est une syntaxe qui n'existe pas en C++. C'est non sens total. Coïncidence ça a la syntaxe du Java ou du C# (à part le this qui est du C++ mais qui ne sert à rien ici.)

this->c = new classe();

La réponse de 23antoine03 te signalait déjà le problème. On n'utilise normalement pas le mot new en C++ et il n'a pas du tout le sens de : "je veux créer une variable comme en C# ou Java".
D'où l'idée de reprendre tes bases car le C++ et plus compliqué que le C# ou le java. on ne peut pas le pratiquer sans la base de la base minimale (qu'est ce qu'une instance, un pointeur, une référence, un opérateur, un type...?)
Je réponds quand même comment supprimer l'erreur que tu as sur la ligne pré-citée :

Le texte ci-dessus est ce qu'il faut faire. L'objet character contient un objet classe, que faire pour qu'il existe : RIEN.

  • Partager sur Facebook
  • Partager sur Twitter

En recherche d'emploi.

4 juin 2020 à 9:31:16

Crée un nouveau sujet au lieu de te greffer sur un sujet existant qui n'a rien à voir avec ton problème actuel.
  • Partager sur Facebook
  • Partager sur Twitter
4 juin 2020 à 12:19:46

Je pense pas que tu sois allé chercher très loin parce qu’il existe au moins 5 tutos sur internet pour presque tout ce que tu dois faire. Le youtubeur e=ri fait des videos sur arduino, il y a la doc, après c’est a toi de comprendre et d’appliquer tes connaissances.

Ça fait pas mal de chercher sur internet !

-
Edité par Daimyo_ 4 juin 2020 à 12:27:03

  • Partager sur Facebook
  • Partager sur Twitter