Problème sur de la POO en C++

Résolu
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016 - Modifié par cptpingu le 15/02/2016 à 14:46
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016 - 15 févr. 2016 à 14:43
Bonsoir, mon problème pourrais être facile à résoudre mais je ne sais pas ou demander, donc je crée un sujet (Dites moi les administrateurs si je me trompe)
Alors voilà en POO je crée actuellement un RPG version console mais il y a un petit problème quand je crée un objet dans le main.cpp, c'est pour cela que j'ai décidé de mettre le code main.cpp, Menu.h et Menu.cpp. L'action startMenu affiche des phrases avec des cout.
Le problème ressortit par mon compileur est celui ci : undefined reference to Menu::startMenu();
Si j'avais remplacé le startMenu par menuAttack(); le compileur me dit ça : error : class menu has no member named "menuAttack".
Je ne suis pas très fort pour voir ce qui ne vas pas, merci d'avance si vous arrivez à régler mon problème

main.cpp :

#include <iostream>
#include <string>
#include "Character.h"
#include "Menu.h"


using namespace std;

int main()
{

    Menu perso1;
    perso1.menuAttack();

    return 0;
}



menu.cpp :

#include <iostream>
#include <string>

using namespace std;

class Menu
{
public :

    void Menu::menuAttack()
    {
        cout << " Vous etes entre en combat avec un ennemi " << "     HP :     ";
        cout << " 1.Attaquer " << endl;
        cout << " 2.Inventaire " << endl;
        cout << " 3.Se cacher " << endl;
        cout <<  "4. Fuir" << endl;
        int answerUser;
        cin >> answerUser;
        if (answerUser =! "1", "2", "3", "4")
        {
           cout << " ecrivez en chiffre la solution que vous voulez adopter " << endl;
        }

    }

    void Menu::attack()
    {
        cout << " Vous avez decide d'attaquer" << endl;
        cout << " " << endl;
        cout << " " << endl;
        cout << " " << endl;
    }

    void Menu::startMenu();
    {
        cout << " 1. Nouvelle partie " << endl;
        cout << " 2. Options " << endl;
        int answerUser2;
        cin >> answerUser2;
        if (answerUser2 == "1")
        {
            
        }
        else if(answerUser2 == "2")
        {
            
        }
    }

private :


};



menu.h :

#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED

#include <string>

class Menu
{
public :

    void menuAttack();

    void startMenu();



private :

};

#endif // MENU_H_INCLUDED

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 févr. 2016 à 11:14
Bonjour.

Comme déjà dit dans un précédent thread, tu n'as pas encore le niveau pour t'aventurer sur de la POO, et ça se ressent fortement au vu du code que tu viens de poster...

Conceptuellement:
  • Le design sur lequel tu pars est mauvais. Ta classe Menu commence déjà à gérer trop de chose qui ne la concerne pas (ce n'est pas son rôle de choisir les attaques et encore moins d'attaquer, ou de gérer le menu du jeu). Enfin, ton personnage est de type Menu, ce qui n'a aucun sens.


Techniquement:
  • Les bases ne sont pas solides. Tu ne maîtrises pas encore la syntaxe de base (en dehors de la POO). Tu confonds entier et std::string, et tu utilises les operateurs de comparaisons incorrectement (on compare une seule chose, et non un élément avec plusieurs).
  • Il faut vraiment éviter les using namespace.
  • Tes std::cin ne sont pas protégés (voir les fonctions "ask" du précédent thread).
  • En C++, un header porte l'extension .hh ou .hpp, le .h étant plutôt réservé au C.
  • Pas besoin de faire 50 std::cout à la suite. Un seul suffit vu que tu peux enchaîner les "<<" (idem, voir code corrigé du thread précédent).
  • Préfère "\n" à std::endl si tu es au milieu d'un affichage. std::endl ne veut pas dire "\n", mais plutôt "\n" + flush de la sortie (ce qui est bien plus coûteux). Si tu hésites entre std::endl et "\n" et que tu ne comprends pas la différence, utilise "\n" tout le temps.
  • Enfin, on découpe son code en deux parties. La partie déclaration (header) et la partie corps. On ne met jamais de code dans un header. C'est là ton souci principal.


Tu as principalement des soucis de syntaxe (pas de logique), il faut donc que tu regardes la documentation ou des tutos. Le forum est plus là pour t'aider sur des problèmes de logiques ou de compilation.

Je t'invite vraiment à commencer par les bases et à t'exercer. Là, ce que tu fais est contre productif. Tu vas juste prendre de mauvaises habitudes (qu'il sera difficile de corriger), et tu risques de te décourager rapidement.
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par NicolasBuchot le 15/02/2016 à 14:28
Salut, je n'ai pas mis de code dans un header, j'ai bien vu les tutos et il faut bien ne mettre que les prototypes dans un header, j'ai déja envoyer ces 3 fichiers de code à un ami sur codingame pour qu'il m'aide dans mon problème il m'a dit que tout allais bien c'est juste que j'avais pas mis le #include "menu.h" après ça dépend parceque tu es plus expérimenté mais j'ai vraiment eu l'impression de ne faire aucune faute.
Après si tu pourrais me passer la cause de l'erreur je comprendrais pourquoi et si tuto dit faux c'est pas de ma faute moi.
Et pour l'objet menu c'est parceque je peux créer un objet character (personnage) mais pas un objet player (classe hérité de personnage) parcequ'il me dit error : class menu has no member named "startMenu" et c'est assez chian
Mais je te comprends très bien me gueule pas dessus s'il-te-plait x)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
15 févr. 2016 à 14:35
Je n'ai pas mis de code dans un header

Au temps pour moi, ton "main.cpp" ressemblait à un header. Dans ce cas, la syntaxe n'est pas du tout la bonne. La classe se déclare dans le header, mais le code dans le corps ne possède pas le mot "class" et ce qui va avec. Il y a juste les méthodes normalement. Regarde un tuto sur la création de classe. Là ce n'est pas un souci de logique, c'est juste que tu n'as pas lu la documentation. Malheureusement, on ne peut le faire à ta place. Voir: http://guillaume.belz.free.fr/doku.php?id=poo
Les autres erreurs sont décrites dans mon message précédent.

j'ai déja envoyer ces 3 fichiers de code à un ami sur codingame pour qu'il m'aide dans mon problème il m'a dit que tout allais bien

Je ne veux pas être méchant envers ton ami, mais s'il a dit que tout allait bien en voyant ce que tu viens de poster, c'est qu'il débute tout juste. Je te conseillerais dans ce cas de ne pas te fier à son jugement (tu risquerais d'apprendre n'importe quoi).
0
F0rEign Messages postés 57 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 6 septembre 2016
Modifié par cptpingu le 15/02/2016 à 15:13
Oui je pense qu'il débutais aussi.
La classe se déclare dans le header et les prototypes de méthodes et attributs on les met comme ça dans aucune classe c'est ça ?

EDIT : Quand tu a dit qu'il n'a pas le mot class c'est bien struct ? comme dans le lien que tu m'a passé ?

en gros on fait comme ça : dit moi si je me trompe

#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED
#include <string>

class Menu;

class Menu
{
public :

void menuAttack();

void startMenu();



private :

};

#endif // MENU_H_INCLUDED


Edit: Ouais non je pense pas que ça soit ça je vais continuer de lire le tuto
0
Rejoignez-nous