IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème constructeur par défaut


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Problème constructeur par défaut
    Bonjour,

    je débute en C++ sur un projet de répertoire avec des classes.
    j'ai une erreur de compilation que j'ai du mal à comprendre : main.cpp:25:16: error: use of deleted function ‘Repertoire::Repertoire()’

    Après lecture sur différents forums, je comprends qu'il s'agit d'une problème au niveau du constructeur par défaut et notamment à l'initialisation des attributs utilisés par le constructeur par défaut

    J'essaie donc d'initialiser les attributs de Repertoire et j'ai un nouveau message d'erreur sur la ligne Contact tab[taille]={0} : repertoire.h:32:31: error: could not convert ‘0’ from ‘int’ to ‘Contact’ que je ne sais pas comment résoudre
    J'ai essayé Contact tab[taille]={nullptr} et Contact tab[taille]=0...

    Je suis un peu largué...

    main.cppp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "interface.h"
    #include "repertoire.h"
    #include "contact.h"
     
    using namespace std;
     
    int main(int argc, char** argv) {
     
        Repertoire r;
        int choix = 0;
     
        //tant que l'utilisateur ne quitte pas le programme on affiche le menu
        while(choix!=9){
            menu();
            std::cout<<"Votre choix ? ";
            std::cin >> choix ;
            traiterChoix(choix,r);
        };
     
        return 0;
    }
    interface.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "interface.h"
    #include "repertoire.h"
    #include "contact.h"
    using namespace std;
     
     
     
    void menu(){
     
        std::cout << "1 : Rentrer un nouveau contact" << endl;
        std::cout << "2 : Afficher mes contacts" << endl;
        std::cout << "3 : Rechercher un contact" << endl;
        std::cout << "9 : Quitter" << endl;
     
    }
     
    void traiterChoix(int choix, Repertoire r){
     
        string nom;
        string numero;
     
        switch(choix)
        {
            case 1 :
                //Saisies utilisateurs
                std::cout << "Veuillez saisir un nom" << endl ;
                std::cin >> nom;
                std::cout << "Veuillez saisir un numero" << endl ;
                std::cin >> numero;
     
                //Création du contact
                Contact c(nom,numero);
     
                //Ajout du contact au répertoire
                if(r.AjouterContact(c))
                    std::cout << "Contact ajouté" << endl ;          
                else
                    std::cout << "Votre répertoire est complet" << endl ;
                break;
            /*case 2 :
                r.repertoire::Afficher();
                break;
            case 3 :
                std::cout << "Veuillez saisir un nom" << endl ;
                std::cin >> nom;
                if(r.RechercherContact(nom)==nullptr)
                    std::cout << "Aucun contact correspondant à ce nom" << endl ;
                else
                    std::cout << r.RechercherContact(nom).nom << " (" << r.RechercherContact(nom).numero << ")" << endl;
                break;
            case 9 :
                break;
            default :
                break;*/
        }
    }
    interface.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef INTERFACE_H
    #define INTERFACE_H
    #include "repertoire.h"
     
    void menu();
    void traiterChoix(int,Repertoire);
     
    #endif /* INTERFACE_H */
    repertoire.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "repertoire.h"
    #include "contact.h"
    using namespace std;
     
     
    //ajout d'un nouveau contact
    bool Repertoire::AjouterContact(Contact& c)//passage par référence du compteur car paramètre entrée/sortie
    {
     
        //si le répertoire est complet, on informe l'utilisateur
        if(compteur>=Repertoire::taille){
            return false;
        }
        //sinon, on peut saisir un nouveau contact
        else { 
     
            //insertion du contact téléphonique au premier emplacement disponible du répertoire
            tab[compteur]=c;
     
            compteur++;
            return true;
        }
    }
     
    //affichage de la liste des contacts entrés dans le répertoire
    void Repertoire::Afficher(){
     
        for(int i=0; i<compteur; i++){
            std::cout << tab[i].nom << " (" << tab[i].numero << ")" << endl;
        }
     
    }
     
    //rechercher un contact à partir de son nom
    //renvoie l'adresse (pointeur*) ou nullptr si le contact n'existe pas
    Contact* Repertoire::RechercherContact(string nom){
     
        bool trouve = false;//variable de statut de la recherche de contact
     
        for(int i=0;i<compteur;i++){
            if(tab[i].nom == nom) {
                trouve = true;
                return true;
            }
        }
        if(!trouve){
                return nullptr;
        }
     
    }
    repertoire.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    class Repertoire{   
     
        public:    
     
            //methodes
            bool AjouterContact(const Contact& c);
            void Afficher();
            Contact* RechercherContact(const std::string& nom); //on ne modifie par le parametre et on le passe par référence pour éviter clonage
                                                                //on utilise un pointeur qui peut renvoyer NULL si aucun contact dans le répertoire
     
        private:
            static const int taille = 5;
            Contact tab[taille]={0};
            int compteur=0;
     
    };
     
    #endif /* REPERTOIRE_H */
    contact.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <string>
    #include <iostream>
    #include "contact.h"
     
    Contact::Contact(std::string nom,std::string numero) {
        nom=nom;
        numero=numero;
        //std::cout << "appel constructeur sans param" << std::endl;
    }
    contact.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #ifndef CONTACT_H
    #define CONTACT_H
    #include <string>
     
    class Contact{
     
        public:
            //Constructeur
            Contact(std::string nom, std::string numero);
     
            std::string nom;
            std::string numero;
    };
     
    #endif /* CONTACT_H */

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Tu veux créer un tableau static de Contact alors qu'il n'y a pas de constructeur sans paramètre pour créer un Contact.
    C'est impossible.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour ta réponse
    il faut donc 'simplement' que j'ajoute un constructeur sans paramètre dans contact.h ?

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    En effet, il suffit de rajouter Contact() = default; dans ta class Contact

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut
    merci pour vos réponse
    j'ai un code qui compile mais il ne fonctionne pas
    j'ai l'impression que le Contact que j'instancie dans la fonction traiterChoix de mon fichier interface.cpp ne contient rien car quand j'essaie d'afficher le nom du contact créé çà ne me renvoie rien

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "interface.h"
    #include "repertoire.h"
    #include "contact.h"
     
    using namespace std;
     
    int main(int argc, char** argv) {
     
        Repertoire r;
        int choix = 0;
     
        //tant que l'utilisateur ne quitte pas le programme on affiche le menu
        while(choix!=9){
            menu();
            std::cout<<"Votre choix ? ";
            std::cin >> choix ;
            traiterChoix(choix,r);
        };
     
        return 0;
    }
    interface.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "interface.h"
    #include "repertoire.h"
    #include "contact.h"
    using namespace std;
     
     
     
    void menu(){
     
        std::cout << "1 : Rentrer un nouveau contact" << endl;
        std::cout << "2 : Afficher mes contacts" << endl;
        std::cout << "3 : Rechercher un contact" << endl;
        std::cout << "9 : Quitter" << endl;
     
    }
     
    void traiterChoix(int choix, Repertoire r){
     
        string nom;
        string numero;
     
        switch(choix)
        {
            case 1 :
            {
                //Saisies utilisateurs
                std::cout << "Veuillez saisir un nom" << endl ;
                std::cin >> nom;
                std::cout << "Veuillez saisir un numero" << endl ;
                std::cin >> numero;
     
                //Création du contact
                Contact c(nom,numero);
                std::cout << "Traiter choix / AjouterContact / nom : " << c.nom << endl;
     
                //Ajout du contact au répertoire
                if(r.AjouterContact(c))
                    std::cout << "Contact ajouté" << endl ;          
                else
                    std::cout << "Votre répertoire est complet" << endl ;
                break;
            }
            case 2 :
            {
                r.Afficher();
                break;
            }
            /*case 3 :
            {
                std::cout << "Veuillez saisir un nom" << endl ;
                std::cin >> nom;
                if(r.RechercherContact(nom)==nullptr)
                    std::cout << "Aucun contact correspondant à ce nom" << endl ;
                else
                    std::cout << r.RechercherContact(nom).nom << " (" << r.RechercherContact(nom).numero << ")" << endl;
                break;
            }*/
            case 9 :
            {
                break;
            }
            default :
            {
                break;
            }
        }
    }
    interface.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef INTERFACE_H
    #define INTERFACE_H
    #include "repertoire.h"
     
    void menu();
    void traiterChoix(int,Repertoire);
     
    #endif /* INTERFACE_H */
    repertoire.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include "repertoire.h"
    #include "contact.h"
    using namespace std;
     
     
    //ajout d'un nouveau contact
    bool Repertoire::AjouterContact(const Contact& c)//passage par référence du compteur car paramètre entrée/sortie
    {
        //std::cout << "AjouterContact / nom : " << c.nom << endl;
        //si le répertoire est complet, on informe l'utilisateur
        if(compteur>=Repertoire::taille){
            return false;
        }
        //sinon, on peut saisir un nouveau contact
        else { 
     
            //insertion du contact téléphonique au premier emplacement disponible du répertoire
            tab[compteur]=c;
            compteur++;
            return true;
        }
    }
     
    //affichage de la liste des contacts entrés dans le répertoire
    void Repertoire::Afficher(){
     
        for(int i=0; i<compteur; i++){
     
            std::cout << tab[i].nom << " (" << tab[i].numero << ")" << endl;
        }
     
    }
     
    //rechercher un contact à partir de son nom
    //renvoie l'adresse (pointeur*) ou nullptr si le contact n'existe pas
    Contact* Repertoire::RechercherContact(const std::string& nom){
     
        bool trouve = false;//variable de statut de la recherche de contact
     
        for(int i=0;i<compteur;i++){
            if(tab[i].nom == nom) {
                trouve = true;
                return &tab[i];
            }
        }
        if(!trouve){
                return nullptr;
        }
     
    }
    repertoire.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #ifndef REPERTOIRE_H
    #define REPERTOIRE_H
    #include <string>
    #include "contact.h"
     
    //manipule les 5 contacts
    class Repertoire{   
     
        public:    
     
            //methodes
            bool AjouterContact(const Contact& c);
            void Afficher();
            Contact* RechercherContact(const std::string& nom); //on ne modifie par le parametre et on le passe par référence pour éviter clonage
                                                                //on utilise un pointeur qui peut renvoyer NULL si aucun contact dans le répertoire
     
        private:
            static const int taille = 5;
            Contact tab[taille];
            int compteur=0;
     
    };
     
    #endif /* REPERTOIRE_H */
    contact.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include <string>
    #include <iostream>
    #include "contact.h"
     
    Contact::Contact(std::string nom,std::string numero) {
        nom=nom;
        numero=numero;
        //std::cout << "appel constructeur sans param" << std::endl;
    }
    contact.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #ifndef CONTACT_H
    #define CONTACT_H
    #include <string>
     
    class Contact{
     
        public:
            //Constructeurs
            Contact() = default;
            Contact(std::string nom, std::string numero);
     
            std::string nom;
            std::string numero;
    };
     
    #endif /* CONTACT_H */

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur validation
    Inscrit en
    Août 2018
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur validation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2018
    Messages : 37
    Points : 123
    Points
    123
    Par défaut
    Je pense que tu travailles sur une copie du répertoire et tu perds les modifications à chaque traitement.

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void traiterChoix(int choix, Repertoire & r){

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. notion de constructeur par défaut
    Par new_wave dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 09/05/2008, 19h33
  2. Problème constructeur par copie listes chainées
    Par Nicoclem dans le forum C++
    Réponses: 4
    Dernier message: 10/04/2008, 11h44
  3. Réponses: 8
    Dernier message: 27/10/2006, 14h36
  4. Réponses: 11
    Dernier message: 25/08/2006, 16h00
  5. Constructeur par défaut en cas de surcharge
    Par gigi_m dans le forum MFC
    Réponses: 4
    Dernier message: 08/06/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo