Menu

Difficultés avec .h et .cpp [Résolu]

Debutant en webmastering 349 Messages postés lundi 6 juin 2011Date d'inscription 7 août 2018 Dernière intervention - 7 août 2018 à 12:42 - Dernière réponse : Debutant en webmastering 349 Messages postés lundi 6 juin 2011Date d'inscription 7 août 2018 Dernière intervention
- 7 août 2018 à 16:51
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();
};




Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Dalfab 351 Messages postés dimanche 7 février 2016Date d'inscription 7 août 2018 Dernière intervention - 7 août 2018 à 13:07
1
Merci
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();
    .

Merci Dalfab 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 25049 internautes ce mois-ci

Commenter la réponse de Dalfab
Debutant en webmastering 349 Messages postés lundi 6 juin 2011Date d'inscription 7 août 2018 Dernière intervention - Modifié par Debutant en webmastering le 7/08/2018 à 17:01
0
Merci
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 :)

Commenter la réponse de Debutant en webmastering