MVC (headers + class): erreur dans mon code c++

Le problème exposé dans ce sujet a été résolu.

Bonjour. Je suis débutant en c++ et j’ai essayé de mettre en place le MVC dans un petit programme, mais j’ai des erreurs que je n’arrive pas à corriger. J’utilise Code::Blocks pour le code et j’ai créé plusieurs classes et des fichiers d’entêtes séparés. Ici, j’ai mis tout le code ensemble pour faire simple, comme vous pouvez le voir. J’ai vraiment besoin de votre aide pour faire fonctionner le programme. Merci.

//Headers
//Header class 1


#ifndef MODEL_PERSONNE_H
#define MODEL_PERSONNE_H

#include <string>

class Model_Personne
{
    public:
        Model_Personne(std::string prenom, std::string nom, std::string profession, int age);
        virtual ~Model_Personne();

        //Setters
        void setPrenom(std::string unPrenom);

        void setNom(std::string unNom);

        void setProfession(std::string uneProfession);

        void setAge(int unAge);


        //Getters

        std::string getPrenom();

        std::string getNom();

        std::string getProfession();

        int getAge();

    protected:

    private:
        std::string prenom;
        std::string nom;
        std::string profession;
        int age;
};

#endif // MODEL_PERSONNE_H



//Header class 2

#ifndef VIEW_PERSONNE_H
#define VIEW_PERSONNE_H

#include <string>

class View_Personne
{
    public:
        View_Personne();
        virtual ~View_Personne();
        void afficherPersonne(std::string prenom, std::string nom, std::string profession, int age);

    protected:

    private:
};

#endif // VIEW_PERSONNE_H


//Header class 3

#ifndef CONTROLLER_PERSONNE_H
#define CONTROLLER_PERSONNE_H

#include "Model_Personne.h"
#include "View_Personne.h"

#include <string>

class Controller_Personne
{
    public:
        Controller_Personne(Model_Personne unePersonne, View_Personne uneVuePersonne);
        virtual ~Controller_Personne();

        Model_Personne personne;
        View_Personne vue;

        //Setters
        void setPrenom(std::string unPrenom);

        void setNom(std::string unNom);

        void setProfession(std::string uneProfession);

        void setAge(int unAge);


        //Getters

        std::string getPrenom();

        std::string getNom();

        std::string getProfession();

        int getAge();

        void getAffichage();


    protected:

    private:

};

#endif // CONTROLLER_PERSONNE_H

//Class - fichiers ".cpp"

//Class 1

#include "Model_Personne.h"

#include <string>


Model_Personne::Model_Personne(std::string unPrenom, std::string unNom, std::string uneProfession, int unAge )
{
    //ctor
    prenom=unPrenom;
    nom=unNom;
    profession=uneProfession;
    age=unAge;
}

Model_Personne::~Model_Personne()
{
    //dtor
}

//Setters
void Model_Personne::setPrenom(std::string unPrenom){
    this->prenom=unPrenom;
}

void Model_Personne::setNom(std::string unNom){
    this->nom=unNom;
}

void Model_Personne::setProfession(std::string uneProfession){
    this->profession=uneProfession;
}

void Model_Personne::setAge(int unAge){
    this->age=unAge;
}


//Getters

std::string Model_Personne::getPrenom(){
    return this->prenom;
}

std::string Model_Personne::getNom(){
    return this->nom;
}

std::string Model_Personne::getProfession(){
    return this->profession;
}

int Model_Personne::getAge(){
    return this->age;
}


//Class 2

#include "View_Personne.h"

#include <string>

View_Personne::View_Personne()
{

}

View_Personne::~View_Personne()
{
    //dtor
}


void View_Personne::afficherPersonne(std::string unPrenom, std::string unNom, std::string uneProfession, std::string unAge){
    std::cout<<"Prénom: "<<unPrenom<<std::endl;
    std::cout<<"Nom: "<<unNom<<std::endl;
    std::cout<<"Profession: "<<uneProfession<<std::endl;
    std::cout<<"Âge: "<<unAge<<std::endl;
}



//Class 3

#include "Controller_Personne.h"
#include "Model_Personne.h"
#include "View_Personne.h"

#include <string>

Controller_Personne::Controller_Personne(Model_Personne unePersonne, View_Personne uneVuePersonne)
{
    personne = unePersonne;
    vue = uneVuePersonne;
}
Controller_Personne::~Controller_Personne()
{
    //dtor
}

//Setters
void Controller_Personne::setPrenom(std::string unPrenom){
    personne.setPrenom(unPrenom);
}

void Controller_Personne::setNom(std::string unNom){
    personne.setNom(unNom);
}

void Controller_Personne::setProfession(std::string uneProfession){
    personne.setProfession(uneProfession);
}

void Controller_Personne::setAge(int unAge){
    personne.setAge(unAge);
}


//Getters

std::string Controller_Personne::getPrenom(){
    return personne.getPrenom();
}

std::string Controller_Personne::getNom(){
    return personne.getNom();
}

std::string Controller_Personne::getProfession(){
    return personne.getProfession();
}

int Controller_Personne::getAge(){
    return personne.getAge();
}

void Controller_Personne::getAffichage(){
    vue.afficherPersonne(personne.getPrenom(), personne.getNom(), personne.getProfession(), personne.getAge());
}


//Main

#include "Model_Personne.h"
#include "View_Personne.h"
#include "Controller_Personne.h"

#include <string>

int main(){
    Model_Personne unePersonne("Jacques", "Baeur", "Artiste-Informaticien", 36);
    View_Personne uneVuePersonne();
    Controller_Personne unControlleurPersonne(unePersonne, uneVuePersonne);
    unControlleurPersonne.getAffichage();
}


Salut @Berdes,

J’ai les erreurs suivants dans mon code (je les ai numéroté parce qu’il y en a 3): error 1: no matching function for call to ‘Model_Personne::Model_Personne()’; error 2: no matching function for call to ‘Controller_Personne::Controller_Personne(Model_Personne&, View_Personne (&)())’; error 3: no declaration matches ‘void View_Personne::afficherPersonne(std::string, std::string, std::string, std::string)’.

Bonjour,

error 1: no matching function for call to ‘Model_Personne::Model_Personne()’
Tu as défini le constructeur de Controller_Personne comme étant:

Controller_Personne::Controller_Personne(Model_Personne unePersonne, View_Personne uneVuePersonne)
{
    personne = unePersonne;
    vue = uneVuePersonne;
}

Qui correspond à: Un Controller_Personne se crée à partir d’un Model_Personne unePersonne et d’une View_Personne uneVuePersonne. Après avoir créé l’ensemble des champs de Controller_Personne (donc personne et vue sont créés par défaut), changer leur valeur (avec un =) en y copiant respectivement unePersonne et uneVuePersonne. Mais Model_Personne ne peut pas être créé par défaut car son constructeur est défini comme nécessitant 4 paramètres!
Ce qu’il faut écrire c’est:

Controller_Personne::Controller_Personne(Model_Personne unePersonne, View_Personne uneVuePersonne) 
    : personne{unePersonne}, vue{uneVuePersonne}
{
}

Si tu ne comprends pas cette écriture, c’est qu’il te manque des bases en C++, je t’encourage à lire le tutoriel C++ de ce site.

error 2: no matching function for call to ‘Controller_Personne::Controller_Personne(Model_Personne&, View_Personne (&)())’
Ligne 276, tu as écris:

    View_Personne uneVuePersonne();

Tu pensais peut-être définir une variable uneVuePersonne de type View_Personne, mais cette ligne est la déclaration d’une fonction uneVuePersonne() qui ne reçoit pas de paramètre et retourne une View_Personne. Pour définir une variable, il ne faut pas écrire les (), où plutôt utiliser la syntaxe avec des accolades:

    View_Personne  uneVuePersonne{};

error 3: no declaration matches ‘void View_Personne::afficherPersonne(std::string, std::string, std::string, std::string)’
Tu as déclaré la fonction comme recevant 3 string et un int, et lors de sa définition, tu attends 4 string.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte