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 :

erreur déclaration d'un attribut ifstream dans une classe


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Par défaut erreur déclaration d'un attribut ifstream dans une classe
    Bonjour,
    J'ai écrit la classe simplifiée suivante:

    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
    #ifndef CESAR_H
    #define CESAR_H
     
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
     
    class Cesar
    {
        public:
            Cesar();
            Cesar(const std::string);
            virtual ~Cesar();
        protected:
        private:
            int m_key;
            std::ifstream m_file;
    };
     
    #endif // CESAR_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
    #include "Cesar.h"
     
    Cesar::Cesar()
    {
    }
     
    Cesar::Cesar(std::string fichier):
    m_key(0)
    {
        std::cout << fichier << std::endl;
    }
     
    Cesar::~Cesar()
    {
    }
    Et la main suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    #include <string>
    #include "Cesar.h"
     
    int main()
    {
        Cesar a(Cesar("chemin vers un fichier.txt"));
        return 0;
    }
    Lorsque je compile ça avec mingw32++ dans code::blocks, j'ai l'erreur suivante:

    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
    ||=== Build: Debug in algorithme_de_Cesar (compiler: GNU GCC Compiler) ===|
    main.cpp||In function 'int main()':|
    main.cpp|7|error: use of deleted function 'Cesar::Cesar(const Cesar&)'|
    include\Cesar.h|9|note: 'Cesar::Cesar(const Cesar&)' is implicitly deleted because the default definition would be ill-formed:|
    include\Cesar.h|9|error: use of deleted function 'std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|420|note: 'std::basic_ifstream<char>::basic_ifstream(const std::basic_ifstream<char>&)' is implicitly deleted because the default definition would be ill-formed:|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|420|error: use of deleted function 'std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\istream|56|note: 'std::basic_istream<char>::basic_istream(const std::basic_istream<char>&)' is implicitly deleted because the default definition would be ill-formed:|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\istream|56|error: use of deleted function 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_ios.h|64|note: 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)' is implicitly deleted because the default definition would be ill-formed:|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\ios_base.h|788|error: 'std::ios_base::ios_base(const std::ios_base&)' is private|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\basic_ios.h|64|error: within this context|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\istream|56|error: use of deleted function 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|420|error: use of deleted function 'std::basic_ios<char>::basic_ios(const std::basic_ios<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|420|error: use of deleted function 'std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)'|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|69|note: 'std::basic_filebuf<char>::basic_filebuf(const std::basic_filebuf<char>&)' is implicitly deleted because the default definition would be ill-formed:|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\streambuf|800|error: 'std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const __streambuf_type&) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_streambuf<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>]' is private|
    c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\fstream|69|error: within this context|
    ||=== Build failed: 11 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    L'erreur disparait si je commente la déclaration du ifstream (ligne 18 dans Cesar.h)
    Une idée du pourquoi svp?

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    un stream n'est pas constructible par copie.

    main.cpp|7|error: use of deleted function 'Cesar::Cesar(const Cesar&)'|
    Il te dit que tu essaies d'invoquer un constructeur de copie

    En effet, Cesar a(Cesar("chemin vers un fichier.txt")); constitue la construction d'un Cesar (a), a partir d'un autre (une valeur temporaire crée via Cesar("chemin vers un fichier.txt")).
    Or, le constructeur pour a n'est pas défini.

    Ce que tu voulais faire, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Cesar a1 = Cesar("chemin vers un fichier.txt");
    //ou bien
    Cesar a2 ("chemin vers un fichier.txt");
    //ou encore
    Cesar a3 {"chemin vers un fichier.txt"};
     
    //sachant que l'affectation n'est pas possible
    a1 = Cesar("autre chemin");//ne compile pas.

  3. #3
    Membre très actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Par défaut
    Merci

    à noter cependant que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cesar a = Cesar("chemin vers un fichier");
    me renvoie la même erreur. (c'est une syntaxe de constructeur par copie? )

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Je croyais.
    Cela dit, en regardant dans mes codes, je m'apercois que systématiquement, j'utilise la forme Cesar a("chemin.txt");Cependant, autant que possible, je ne prends pas de stream comme membre d'une classe.

  5. #5
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par tiresias54 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cesar a = Cesar("chemin vers un fichier");
    me renvoie la même erreur. (c'est une syntaxe de constructeur par copie? )
    C'est un opérateur d'affectation, ce qui est grosso-merdo pareil.

    Btw, pourquoi écrire ce truc ignoble Cesar a(Cesar("chemin vers un fichier.txt")); ?
    La bonne écriture serait tout simplement Cesar a("chemin vers un fichier.txt");.
    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.

  6. #6
    Membre très actif
    Profil pro
    ingénieur
    Inscrit en
    Novembre 2011
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Novembre 2011
    Messages : 165
    Par défaut
    j'avoue que c'est ignoble . Je m'étais un peu emmêlé les pinceaux dans les syntaxe de déclarations à cause de la présence du ifstream qui provoquait des erreurs lors de l'appel du constructeur.

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

Discussions similaires

  1. [2.x] Attribut NULL dans une classe Symfony2
    Par ashanka dans le forum Symfony
    Réponses: 2
    Dernier message: 05/01/2012, 11h16
  2. Attributs dynamiques dans une classe
    Par ratapapa dans le forum Langage
    Réponses: 2
    Dernier message: 16/12/2009, 17h16
  3. changer l'attribut etat dans une class
    Par amen_1919 dans le forum W4 Express
    Réponses: 16
    Dernier message: 07/05/2008, 13h03
  4. Réponses: 4
    Dernier message: 16/03/2008, 18h06
  5. Réponses: 1
    Dernier message: 17/04/2007, 22h07

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