Difficultés avec .h et .cpp

Résolu
Debutant en webmastering Messages postés 444 Statut Membre -  
Debutant en webmastering Messages postés 444 Statut Membre -
Bonjour,
depuis peu, j'essaie de ma familiariser avec la création de projets avec des .h, .cpp et makefile mais au vu du message d'erreur me disant que ma fonction "ask" n'est pas déclarée, je rencontre quelques difficultés.
Je pense pourtant avoir correctement réalisé mes includes; voici la partie que j'ai codé :
$tree
.
├── build
│   └── bin
├── include
│   └── monster.h
├── Makefile
├── OldMakefile
├── Project'sTree
└── src
├── main.cpp
└── monster.cpp

4 directories, 6 files

------------------------------------------------------------------------------------------------------------------------------

$make clean
Deleting runner symlink
Deleting directories

$make
Creating directories
make[1] : on entre dans le répertoire « /home/x/Bureau/c++ »
Compiling: src/main.cpp -> build/main.o
g++ -std=c++11 -Wall -Wextra -g -I include/ -I /usr/local/include -MP -MMD -c src/main.cpp -o build/main.o
src/main.cpp: In function ‘int main()’:
src/main.cpp:5:6: error: ‘ask’ was not declared in this scope
ask();
^
Makefile:71 : la recette pour la cible « build/main.o » a échouée
make[1]: *** [build/main.o] Erreur 1
make[1] : on quitte le répertoire « /home/x/Bureau/c++ »
Makefile:36 : la recette pour la cible « release » a échouée
make: *** [release] Erreur 2

------------------------------------------------------------------------------------------------------------------------------

#monster.h
//file .h w/ the definition of my functions
#ifndef monster_H
#define monster_H

#include <string>

//has to be like a monster's card
class monster
{
private:
std::string Name, Type, Description, Designer, Gender, Image;
float Hp, Weight, Size, Lvl, EvolutionLvl, Number;

public:
/*function to ask informations about the monster
keyword "extern" is a "forward declaration" permitting function to be used in several .cpp
extern*/
void ask();

//creates a monster w/ only his name
monster(std::string);

//check type float
void verifyCinFloat();

//update informations of a monster
void update(monster);

//destructor
~monster();
};
#endif

------------------------------------------------------------------------------------------------------------------------------

#main.cpp
//file .cpp containing the steps of my execution's program
#include "monster.h"
int main()
{
ask();
return 0;
};

------------------------------------------------------------------------------------------------------------------------------

#monster.cpp
//file .cpp w/ every step of my functions
#include <iostream>
#include "monster.h"

void verifyCinFloat()
{
float i;
while(!(std::cin >> i))
{
std::cin.clear();
std::cin.ignore(999,'\n');
std::cout << "Invalid type of data. Please enter it again : ";
}
}

//just to test w/ the 1st values of the csv
void ask()
{
std::string Name, Type, Description, Designer, Gender, Image;
float Hp, Weight, Size, Lvl, EvolutionLvl, Number;

std::cout << "on what monster would you update data ? ";
std::cin >> Name;

std::cout << "Type : ";
std::cin >> Type;

std::cout << "Description : ";
std::cin >> Description;

std::cout << "Designer : ";
std::cin >> Designer;

std::cout << "Gender : ";
std::cin >> Gender;

std::cout << "Image : ";
std::cin >> Image;

std::cout << "Hp : ";
std::cin >> verifyCinFloat();

std::cout << "Weight : ";
std::cin >> verifyCinFloat();

std::cout << "Size : ";
std::cin >> verifyCinFloat();

std::cout << "Lvl : ";
std::cin >> verifyCinFloat();

std::cout << "EvolutionLvl : ";
std::cin >> verifyCinFloat();

std::cout << "Number : ";
std::cin >> verifyCinFloat();
};




--
Cordialement,  Debutant en webmastering

2 réponses

  1. Dalfab Messages postés 638 Date d'inscription   Statut Membre Dernière intervention   102
     
    Le problème ne provient pas de l'utilisation du header mais de qui y est inscrit.
    Tu déclares dans le header des fonctions membres de
    monster 
    (qui ne sont jamais définies ni utilisées), mais tu définis dans monster.c des fonctions simples, et dans dans
    main 
    tu appelles la fonction simple
    ask()
    . Il n'y a donc aucune indication de cette fonction simple dans le header.
    Alors quel est ton besoin ?
    • une fonction simple, qu'il faut déclarer par
      void ask();
      dans le header, hors du type
      monster
      . On l'appelle en écrivant :
      ask();
      .
    • une fonction de classe
      monster
      , qu'il faut déclarer dans
      monster
      par
      static void ask();
      . Cette fonction sera commune à tous tes
      monster
      . On l'appelle en écrivant
      monster::ask();
      .
    • une fonction membre d'objet
      monster
      , qu'il faut déclarer dans
      monster
      par
      void ask();
      . Cette fonction n'est utilisable qu'avec un objet du type
      monster
      . C'est ce que tu as écris. On l'appelle en écrivant
       un_monstre.ask();
      .
    1
  2. Debutant en webmastering Messages postés 444 Statut Membre
     
    Merci pour ton aide; en effet, la fonction ask devait être dans le main car elle sert juste à vérifier l'intégrité des données pour instancier un monster

    une fois les fonctions de monster.cpp mises dans le main et l'ajout du constructeur et destructeur dans le monster.cpp ça fonctionne
    ce qui nous donne donc
    #main.cpp
    //file .cpp containing the steps of my execution's program
    #include "monster.h"
    #include <iostream>
    #include <string>
    
    float isFloat ()
    {
    	float i;
    	while( !( std::cin >> i ))
    	{
    		std::cin.clear();
    		std::cin.ignore(999,'\n');
    		std::cout << "Invalid type of data. Please enter it again : ";
    	}
    	return i;
    }
    
    int main()
    {
    	std::string Name, Type, Description, Designer, Gender, Image;
    	float Hp, Weight, Size, Lvl, EvolutionLvl, Number;
    
    	std::cout << "on what monster would you update data ? ";
    	std::cin >> Name;
    
    	std::cout << "Type : ";
    	std::cin >> Type;
    
    	std::cout << "Description : ";
    	std::cin >> Description;
    
    	std::cout << "Designer : ";
    	std::cin >> Designer;
    
    	std::cout << "Gender : ";
    	std::cin >> Gender;
    
    	std::cout << "Image : ";
    	std::cin >> Image;
    
    	std::cout << "Hp : ";
    	Hp = isFloat();
    
    	std::cout << "Weight : ";
    	Weight = isFloat();
    
    	std::cout << "Size : ";
    	Size = isFloat();
    
    	std::cout << "Lvl : ";
    	Lvl = isFloat();
    
    	std::cout << "EvolutionLvl : ";
    	EvolutionLvl = isFloat();
    
    	std::cout << "Number : ";
    	Number = isFloat();
    
    	monster monster001(Name, Type, Description, Designer, Gender, Image, Hp, Weight, Size, Lvl, EvolutionLvl, Number);
    	monster001.display();
    	return 0;
    };
    
    ---------------------------------------------------------------------------------------------------------------------------------------
    
    #monster.cpp
    //file .cpp w/ every step of my functions
    #include "monster.h"
    #include <iostream>
    
    monster::monster(std::string Name, std::string Type, std::string Description, std::string Designer, std::string Gender, std::string Image,
    				float Hp, float Weight, float Size, float Lvl, float EvolutionLvl, float Number)
    {
    	this->m_name = Name;
    	this->m_type = Type;
    	this->m_description = Description;
    	this->m_designer = Designer;
    	this->m_gender = Gender;
    	this->m_image = Image;
    	this->m_hp = Hp;
    	this->m_weight = Weight;
    	this->m_size = Size;
    	this->m_lvl = Lvl;
    	this->m_evolutionLvl = EvolutionLvl;
    	this->m_number = Number;
    };
    
    monster::~monster()
    {
    
    };
    
    void monster::display()
    {
    	std::cout << "Name : " << m_name << std::endl;
    	std::cout << "Type : " << m_type << std::endl;
    	std::cout << "Description : " << m_description << std::endl;
    	std::cout << "Designer : " << m_designer << std::endl;
    	std::cout << "Gender : " << m_gender << std::endl;
    	std::cout << "Image : " << m_image << std::endl;
    	std::cout << "Hp : " << m_hp << std::endl;
    	std::cout << "Weight : " << m_weight << std::endl;
    	std::cout << "Size : " << m_size << std::endl;
    	std::cout << "Lvl : " << m_lvl << std::endl;
    	std::cout << "EvolutionLvl : " << m_evolutionLvl << std::endl;
    	std::cout << "Number : " << m_number << std::endl;
    };


    merci pour l'aide apportée :)

    0